嗨,大家好,希望你们可以提供帮助,我已经做了一次搜索,但似乎无法找到我正在寻找的东西......
我正在尝试编写SQL查询,以向我展示自运行查询(当前日期)之日起12周或84天开始的所有员工。到目前为止我已经得到了这个,但它并没有返回我期待的结果,我在开始日期超过84天的时间里得到了一些记录。
.... WHERE (EmployeeJobs.DateTo IS NULL or EmployeeJobs.DateTo = dateadd(d,datediff(d,0,getdate()),84))
我需要包含一个NULL语句,但遗憾的是并非所有记录都包含日期。
非常感谢任何帮助
答案 0 :(得分:1)
试试这个,它适用于所有版本的Sql Server 2000 +
....
WHERE
(EmployeeJobs.DateTo IS NULL
or
CONVERT(varchar, EmployeeJobs.DateTo, 112) = CONVERT(varchar, dateadd(d,-84,GETDATE()), 112)
)
但是如果您运行它@sql server 2008+,您可以简化工作:
....
WHERE
(EmployeeJobs.DateTo IS NULL
or
cast(EmployeeJobs.DateTo as DATE) = CAST(dateadd(d,-84,GETDATE()) as DATE)
)
OR 可以使用索引
....
WHERE
(EmployeeJobs.DateTo IS NULL
or
EmployeeJobs.DateTo >= CAST(dateadd(d,-84,GETDATE()) as DATE)
AND
EmployeeJobs.DateTo < CAST(dateadd(d,-83,GETDATE()) as DATE)
)
答案 1 :(得分:1)
where
EmployeeJobs.DateTo IS NULL
or
datediff(d, EmployeeJobs.DateTo, getdate()) = 84
如果您使用的是SQL Server 2008,那么
where
EmployeeJobs.DateTo IS NULL
or
cast(EmployeeJobs.DateTo as date) = cast(getdate() - 84 as date)
答案 2 :(得分:1)
试试这样:
WHERE
(EmployeeJobs.DateTo IS NULL
or
convert(varchar, EmployeeJobs.DateTo, 112) = convert(varchar, DATEADD(day, -84, getdate(), 112)
)
答案 3 :(得分:0)
你有DateFrom和DateTo字段吗?这两个日期的范围表明他们是在这两个日期之间受雇的? NULL DateTo意味着他们还没有离开?你想要84天前就业的人吗?
WHERE
(EmployeeJobs.DateFrom <= dateadd(d, datediff(d,0,getdate()) - 84, 0))
AND (EmployeeJobs.DateTo >= dateadd(d, datediff(d,0,getdate()) - 84, 0) OR EmployeeJobs.DateTo IS NULL)
答案 4 :(得分:0)
或者(因为已经使用了函数,对性能的影响就在那里):
WHERE
-- get difference in days
DateDiff(dd,
-- lower date, replace Nulls
IsNull(EmployeeJobs.DateTo, GetDate()),
-- highest date
GetDate()
)
-- whatever the criteria, in this case equal to exact 84 days
= 84