使用列';要与范围进行比较的s值(T-SQL)

使用列';要与范围进行比较的s值(T-SQL),sql,tsql,Sql,Tsql,我试图查询我们的employee表,以返回下周内庆祝雇佣日周年纪念日的所有员工。问题是: 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()) hiredat

我试图查询我们的employee表,以返回下周内庆祝雇佣日周年纪念日的所有员工。问题是:

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
可以让我构建他们今年的周年纪念日,这样我就可以将其与日期范围进行比较。但它抛出了一个错误:

无法构造数据类型date,某些参数具有值 这些都是无效的


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

这是由于某人在闰年的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())

确定某人的生日是否在给定时间内的最简单方法是使用以下方法:

  • 计算周期开始前一天的年龄:
    age1
  • 计算周期结束时的年龄(无论如何,您都需要它才能知道确切的年龄):
    age2
  • 现在检查年龄是否改变<代码>其中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
DATEDIFF(年份、生日、,
GETDATE())
-100*月(GETDATE())+天(GETDATE()时的情况
<100*月(生日)+日(生日)
那么1
其他0
寿终正寝

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

来调整它。听起来好像你有人在闰年的2月29日雇佣了一名员工,但它无法为今年创建相同的日期。你完全正确!我添加了
和NOT(月(雇佣日)=2和日(雇佣日)=29)
,结果成功了。所以,显然我不想跳过那些人。什么是好的选择?太好了!感谢您的帮助。我在编辑中添加了一个
CASE
语句,以说明一年中闰日之后的日期被错误地移动。注意:此查询不会在接近年底时返回正确的结果。@dnoeth谢谢您。你将如何更正它?请参阅我的帖子:-)我在培训中经常问这种问题,在第一批学生完成他们的提问后,我添加了一个
2月29日
生日,让他们在
12月30日
:-)运行它