我在MS SQL Server中有一张表,里面有所谓的时间表记录。
每个时间表都分配给一个用户,并有一个开始日期。开始日期时间是相应时间表生效的时间点。在该时间点之前,将使用开始日期更早的计划。
我需要编写一个查询,该查询确定日程安排的ID,该日在当天有效。
假设有用户X的以下记录,起始日期如下:
从2008-11-18到2008-12-14的有效时间表是1。从2008-12-15到2009-07-01的有效时间表是2。从2009-07-02到2009的日子。 -08-10的有效时间表是3。对于2009-08-11及以后的日子,有效的时间表是4。
DATEDIFF(day, CAST('X' AS DATETIME), startdate)
计算介于X
和之间的天数startdate
。对于X=2008-12-20 10:00
上面的和,它返回以下值:
为了计算时间表的开始时间,该时间在time有效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)
并有望获得一个行作为一个结果。
但是,我得到了两行:
我应该如何修改查询才能获得最大负值为的一行DATEDIFF(day, CAST('2008-12-20 10:00' AS DATETIME), startdate)
?
尝试使用top
withorder by
代替:
select top 1 s.*
from schedules s
where username = 'username' and CAST('2008-12-20 10:00' AS DATETIME) >= startdate
order by startdate;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句