SQL Server:按日期字段分组,按时间和日期排序

时间:2015-09-07 14:28:42

标签: sql sql-server tsql date datetime

我有一个结果集,它包含一个datefield和value列。

日期列可以是从周,月,几个月到几年的范围。格式为YYYY-mm-dd hh:mm:ss.ssss(2015-03-01 00:00:00.000)

值列是一个简单的小数。

我无法按照我想要的方式对结果进行分组。

从下面的查询中,您可以看到我想要实现的目标。 我从结果集中选择,相对月份,小时图,日期和价值。

SELECT 
    CONVERT(VARCHAR(2), datefield, 108) AS hourSlot,
    SUM(value) AS hourTotal,
    DATEPART(day,datefield) as day,
    CASE CONVERT(VARCHAR(2), datefield, 108)
       WHEN @stationStartTime
          THEN 1
          ELSE 0
    END AS sortOrder
FROM  
    @hourTotalTemp
WHERE 
    DATEPART(MM, datefield) = 3
GROUP BY 
    DATEPART(day,datefield)
ORDER BY 
    day, sortOrder, CONVERT(VARCHAR(2), datefield, 108)

你可能会看到。

我需要将结果按小时分组。然后按电台的开始时间排序,也可以按月的日期排序。

修改

enter image description here

如上所述,查询的最终结果。

将从定义的"开始时间"开始返回小时位置,该月的相对日期(1,2,3,4,5,6,7th)等),然后是那些日子的价值。

@hourtotalTemp

的结果集
datefield               value
------------------------------    
2015-02-01 00:00:00.000 0
2015-02-01 01:00:00.000 0
2015-02-01 02:00:00.000 0
2015-02-01 03:00:00.000 0
2015-02-01 04:00:00.000 0
2015-02-01 05:00:00.000 0

修改

enter image description here

这是我想用查询实现的。顶部的小时,左边的一天。而数据在中间。

2 个答案:

答案 0 :(得分:0)

为什么不在子查询中进行分组,然后只对外部查询进行排序?像这样......

SELECT *
from (select CONVERT(VARCHAR(2), datefield, 108) AS hourSlot,
       SUM(value) AS hourTotal,
      DATEPART(day,datefield) as day,
       CASE CONVERT(VARCHAR(2), datefield, 108)
           WHEN @stationStartTime
           THEN 1
           ELSE 0
       END AS sortOrder
FROM @hourTotalTemp
WHERE DATEPART(MM, datefield) = 3
GROUP BY DATEPART(day,datefield) ) tbl
ORDER BY day, sortOrder, hourslot

答案 1 :(得分:0)

这将为您提供“四舍五入到小时”日期字段:

 dateadd(hour,datediff(hour,0,field),0)

您可以使用此按钮进行分组和排序。如果您在子查询中使用它通常会更容易,因为结果是日期字段,例如

SELECT 
    -- all the stuff you need using hour_date_field
FROM
    (SELECT *, 
       dateadd(hour,datediff(hour,0,datefield),0) as hour_date_field) X
     FROM table) X 
WHERE DATEPART(MM, hour_date_field) = 3
GROUP BY hour_date_field
ORDER BY hour_date_field

帽子提示/更多信息 - 这个问题(和答案):Floor a date in SQL server