使用列的值构造日期以与范围进行比较(T-SQL)

时间:2015-05-14 20:14:29

标签: sql tsql

我正在尝试查询我们的员工表,以便返回在下周内庆祝招聘日期周年纪念日的所有员工。这是查询:

SELECT firstname, lastname, hiredate
FROM   employees
WHERE  hiredate IS NOT NULL
AND    DateFromParts(Year(getdate()),Month(hiredate),Day(hiredate)) BETWEEN getDate() AND DateAdd(day,7,getDate())

hiredate列是一个日期时间列,其中包含所雇用的月,日和年。我认为使用DateFromParts会让我构建今年的周年纪念日,所以我可以将它与日期范围进行比较。但它引发了错误:

  

无法构造数据类型日期,某些参数具有值   这是无效的。

我是在正确的轨道而错过了什么,还是有更好的方法?

2 个答案:

答案 0 :(得分:1)

这是因为某人在闰年期间的HireDate为2月29日,并且由于今年不是闰年,因此未能构建有效日期。

尝试使用以下内容根据自年初以来的天数构建日期:

SELECT firstname, lastname, hiredate
FROM   employees
WHERE  hiredate IS NOT NULL
AND    Case When Month(hiredate) = 2 And Day(hiredate) = 29 Then
           DateAdd(Day, DatePart(DayOfYear, hiredate) - 1, DateFromParts(Year(getdate()), 1, 1))
   Else    DateFromParts(Year(getdate()), Month(hiredate), Day(hiredate))
End BETWEEN getDate() AND DateAdd(day,7,getDate())

答案 1 :(得分:1)

查找某人是否在特定时段内过生日的最简单方法是使用以下方法:

  • 计算期间开始前一天的年龄:age1
  • 计算期末的年龄(无论如何你都需要知道确切的年龄):age2
  • 现在检查年龄是否变化; WHERE age1 <> age2

计算SQL Server中的年龄非常糟糕,但由于这是一项常见任务,您可能已经拥有UDF,否则:

DATEDIFF (YEAR, birthdate, 
          GETDATE()) 
- CASE WHEN 100 * MONTH(GETDATE()) + DAY(GETDATE())
          < 100 * MONTH(birthdate) + DAY(birthdate) 
       THEN 1
       ELSE 0
  END AS age

现在使用DateAdd(day,-1,getDate())DateAdd(day,7,getDate())

进行调整