我在MS SQL服务器中有一个表,它有所谓的计划记录。
每个计划都分配给用户并具有开始日期。开始日期时间是相应的时间表有效的时间点。在此之前,使用具有较早开始日期的计划。
我需要编写一个查询,该查询确定计划的ID,该计划在当天有效。
假设用户X有以下记录,其中包含以下开始日期:
在2008-11-18至2008-12-14的几天内,有效时间表为1.在2008-12-15至2009-07-01期间,有效时间表为2.从2009年起的几天 - 02至2009-08-10有效时间表为3.对于2009-08-11及之后的日期,有效时间表为4。
DATEDIFF(day, CAST('X' AS DATETIME), startdate)
计算X
和startdate
之间的天数。对于X=2008-12-20 10:00
和上面的startimes,它返回以下值:
为了计算在时间X
有效的时间表的开始时间,我需要找到一条记录,DATEDIFF(day, CAST('X' AS DATETIME), startdate)
返回最大值(最接近零)的负值。
为此,我写了以下查询
SELECT startdate, MAX(DATEDIFF(day, CAST('2008-12-20 10:00' AS DATETIME), startdate))
FROM schedules
WHERE (username = 'username') AND (DATEDIFF(day, CAST('2008-12-20 10:00' AS DATETIME), startdate) < 0)
GROUP BY startdate, DATEDIFF(day, CAST('2008-12-20 10:00' AS DATETIME), startdate)
并且期望得到一个行。
但相反,我得到2行:
如何修改查询以获得最大负值为DATEDIFF(day, CAST('2008-12-20 10:00' AS DATETIME), startdate)
的一行?
答案 0 :(得分:2)
尝试使用top
代替order by
:
select top 1 s.*
from schedules s
where username = 'username' and CAST('2008-12-20 10:00' AS DATETIME) >= startdate
order by startdate;