DATEDIFF结果的聚合函数

时间:2014-03-05 11:57:17

标签: sql sql-server

我在MS SQL服务器中有一个表,它有所谓的计划记录。

每个计划都分配给用户并具有开始日期。开始日期时间是相应的时间表有效的时间点。在此之前,使用具有较早开始日期的计划。

我需要编写一个查询,该查询确定计划的ID,该计划在当天有效。

假设用户X有以下记录,其中包含以下开始日期:

  1. 2008-11-18
  2. 2008-12-15
  3. 2009-07-02
  4. 2009-08-11
  5. 在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)计算Xstartdate之间的天数。对于X=2008-12-20 10:00和上面的startimes,它返回以下值:

    1. -32
    2. -5
    3. 194
    4. 234
    5. 为了计算在时间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)的一行?

1 个答案:

答案 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;