我正在尝试查询我们的员工表,以便返回在下周内庆祝招聘日期周年纪念日的所有员工。这是查询:
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
会让我构建今年的周年纪念日,所以我可以将它与日期范围进行比较。但它引发了错误:
无法构造数据类型日期,某些参数具有值 这是无效的。
我是在正确的轨道而错过了什么,还是有更好的方法?
答案 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())