【问题标题】:SQL - Return distinct hours between two periodsSQL - 返回两个时段之间的不同小时数
【发布时间】:2012-05-15 13:47:07
【问题描述】:

我有以下一段 SQL,它返回两个日期之间的所有不同日期。

SELECT DISTINCT convert(char(10), date, 120) as StartDate from table1 WHERE  
id = @id and date > @StartDate

但是我需要返回两个日期之间的不同日期和时间。

2011-12-18 13:00:00.000

2011-12-18 14:00:00.000

2011-12-18 17:00:00.000

2011-12-19 10:00:00.000

2011-12-19 12:00:00.000

2011-12-19 13:00:00.000

希望有人可以协助更改查询以执行此操作。

【问题讨论】:

    标签: sql sql-server-2008 date distinct


    【解决方案1】:
    SELECT DISTINCT DATEADD(HH,DATEDIFF(HH,0,DATE),0) as StartDate 
    from table1 
    WHERE   id = @id and date > @StartDate 
    

    【讨论】:

      【解决方案2】:

      我会做以下事情:

      SELECT DISTINCT left(convert(varchar, date, 120), 13) as starthour
      from table
      WHERE   id = @id and date > @StartDate
      

      您也可以使用 SQL Server 中的 datepart() 函数得出类似的结果。在其他数据库中,最好使用extract(from)。

      【讨论】:

      • DATEADD 比字符串转换效率高得多。我也强烈建议不要在不指定长度的情况下指定varcharsqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/…
      • 为什么要使用 DATEADD?我提到了 DATEPART。我不清楚重复调用 DATEPART 是否比一次转换为字符串然后进行简单的字符串操作更有效。至于没有长度的varchar,我认罪了。出于几个原因,我只是不将长度放入 convert() 函数中。 (1) 懒惰。 (2) 我可能会弄错格式的长度。
      • 无论您是否清楚,日期时间转换比字符串转换更有效,特别是如果您必须转换回日期时间(或将':00:00' 附加到结果中的每一行以使看起来你做了)。它还允许您不关心各种样式编号。在这种情况下,您知道长度为 13,因为您将其包装在 LEFT() 函数中。因此,如果您使用 CHAR(13) 而不是 varchar(unspecified),则可以首先避免使用 LEFT
      【解决方案3】:
      declare @myDates table(d datetime);
      INSERT INTO @myDates VALUES('2011-12-18 13:00:00.000')
      , ('2011-12-18 14:00:00.000')
      , ('2011-12-18 17:00:00.000')
      , ('2011-12-19 10:00:00.000')
      , ('2011-12-19 12:00:00.000')
      , ('2011-12-19 13:00:00.000');
      
      ; WITH a AS (
          SELECT d, r=ROW_NUMBER()OVER(ORDER BY d)
          FROM @myDates
      )
      SELECT StartDate=CONVERT(VARCHAR(10),a1.d,120)
      , EndDate=CONVERT(VARCHAR(10),a2.d,120)
      , HoursDiff=DATEDIFF(hh,a1.d,a2.d)
      FROM a a1
      INNER JOIN a a2 
        ON a2.r=a1.r+1 
        AND CONVERT(VARCHAR(10),a1.d,120)<>CONVERT(VARCHAR(10),a2.d,120);
      

      结果:

      StartDate  EndDate    HoursDiff
      ---------- ---------- -----------
      2011-12-18 2011-12-19 17
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-08
        • 1970-01-01
        相关资源
        最近更新 更多