gpt4 book ai didi

SQL Server - 查找日期范围(不包括年份)之间的人员

转载 作者:行者123 更新时间:2023-12-02 20:16:55 26 4
gpt4 key购买 nike

我有一个包含员工信息的表 EMPLOYEE,如下所述:

ID     NAME     DOB
1 ABC 1974-01-01
2 BDS 1984-12-31
3 QWE 1959-05-27

and so on

我想列出出生日期在给定范围内的所有员工。

select * from EMPLOYEE where DOB BETWEEN '1970-01-01' AND '1980-02-27'

我有一个过滤条件“在日期比较中包含年份”,当选择“否”时,员工出生日期和出生月份仅应考虑进行比较。 而不是年份。

例如:如果我输入日期范围为“1970-01-01”和“1980-02-27”,并且过滤器选择为“否”,那么它应该仅搜索那些员工DOB 大于等于 JAN-01 且小于等于 FEB-27。

当选择"is"时,它只是上述查询中提到的日期范围。

这是我迄今为止尝试过的:

select * from EMPLOYEE where DOB BETWEEN '1970-01-01' AND '1980-02-27'
AND MONTH(DOB) >= CASE WHEN 'NO'='NO' THEN MONTH('1970-01-01')
ELSE MONTH(DOB) END
AND MONTH(DOB) <= CASE WHEN 'NO'='NO' THEN MONTH('1980-02-27')
ELSE MONTH(DOB) END
AND DAY(DOB) >= CASE WHEN 'NO'='NO' THEN DAY('1970-01-01')
ELSE DAY(DOB) END
AND DAY(DOB) <= CASE WHEN 'NO'='NO' THEN DAY('1980-02-27')
ELSE DAY(DOB) END

当我传递 FROM 日期的月份数小于 TO 日期月份的日期范围时,它会起作用。

例如:当我将日期范围“1970-12-01”传递到“1980-01-31”时,它不起作用。它应该列出出生日期为 12 月和 1 月的员工。

需要帮助。

最佳答案

示例数据;

DECLARE @Date_From date; SET @Date_From = '1970-12-01'
DECLARE @Date_To date; SET @Date_To = '1974-01-31'
DECLARE @IncludeYear bit; SET @IncludeYear = 0

CREATE TABLE #Employee (ID int, Name varchar(10), DOB date)
INSERT INTO #Employee (ID, Name, DOB)
VALUES
(1,'ABC','1974-01-01')
,(2,'BDS','1984-12-31')
,(3,'QWE','1959-05-27')

这是我提出的查询。尽力应对所有可能发生的情况。

SELECT
e.ID
,e.Name
,e.DOB
FROM #Employee e
WHERE
(
@IncludeYear = 1
AND
DOB BETWEEN @Date_From AND @Date_To
)
OR
(
@IncludeYear = 0
AND
(
(
DATEPART(DAYOFYEAR, @Date_From) = DATEPART(DAYOFYEAR, @Date_To)
AND
DATEPART(DAYOFYEAR, DOB) = DATEPART(DAYOFYEAR, @Date_To)
)
OR
(
DATEPART(DAYOFYEAR, @Date_From) < DATEPART(DAYOFYEAR, @Date_To)
AND
DATEPART(DAYOFYEAR, DOB) BETWEEN DATEPART(DAYOFYEAR, @Date_From) AND DATEPART(DAYOFYEAR, @Date_To)
)
OR
(
DATEPART(DAYOFYEAR, @Date_From) > DATEPART(DAYOFYEAR, @Date_To)
AND
(
DATEPART(DAYOFYEAR, DOB) > DATEPART(DAYOFYEAR, @Date_From)
OR
DATEPART(DAYOFYEAR, DOB) < DATEPART(DAYOFYEAR, @Date_To)
)
)
)
)
  • where 子句的第一部分检查 @date_from 和 @date_to 是否是相同的日期,那么只返回这些。
  • 第二部分检查@date_from 一年中的某一天是否早于@date_to。如果确实如此,则返回这几天之间的所有内容年。
  • 最后一部分检查 @date_to 中的日期是否早于@date_from 然后它会得到一年后的所有内容@date_from 或 @date_to 之前

此结果如下;

ID  Name    DOB
1 ABC 1974-01-01
2 BDS 1984-12-31

关于SQL Server - 查找日期范围(不包括年份)之间的人员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37805904/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com