在SQL中按小时分组DateTime

时间:2015-11-09 15:58:10

标签: sql sql-server

我的数据库中有一个表,其中包含一个名为DateTimes的列。这个列里面有DateTime数据,我想选择这个表有数据的不同小时数。例如,如果列包含以下条目:

2015-05-03 01:06:45
2015-05-03 04:51:09
2015-05-03 05:08:11
2015-05-03 09:33:35
2015-05-03 13:46:38

我想返回

2015-05-03 01:00:00
2015-05-03 04:00:00
2015-05-03 05:00:00
2015-05-03 09:00:00
2015-05-03 13:00:00

我尝试了以下返回错误:

SELECT DateTimes
FROM MyTable
GROUP BY DATEPART(hh, DateTimes)

我觉得这应该很容易,但我似乎无法做到(我对SQL很新)。我使用MS SQL Management Studio 2012访问我的数据库。

4 个答案:

答案 0 :(得分:1)

你真正想要的是格式化你的日期,所以它隐藏了分钟/秒,

SELECT CONVERT(VARCHAR(25), DateTimes, 100) FROM MyTable

答案 1 :(得分:1)

尝试以下方法:

SELECT DateTimes
FROM MyTable
GROUP BY DATEPART(hh, DateTimes), DateTimes;

您只是在组中直接错过了DateTimes字段。

此外,根据您提出的其他问题,您可能需要执行以下操作:

SELECT FORMAT(DateTimes, 'dd-MM-yyyy hh:00:00', 'en-US')
FROM MyTable
GROUP BY DATEPART(hh, DateTimes), FORMAT(DateTimes, 'dd-MM-yyyy hh:00:00', 'en-US');

答案 2 :(得分:1)

试试这个。

测试数据:

DECLARE @MyTable AS TABLE(DateTimes DATETIME)
INSERT INTO @MyTable(DateTimes)
VALUES('2015-05-03 01:06:45')
,('2015-05-03 04:51:09')
,('2015-05-03 05:08:11')
,('2015-05-03 09:33:35')
,('2015-05-03 13:46:38')

查询:

  SELECT Hourly
    FROM (SELECT DATEADD(HOUR, DATEDIFF(HOUR, 0, DateTimes), 0) AS Hourly
            FROM @MyTable) AS DatesAsHours
GROUP BY Hourly

结果:

Hourly
2015-05-03 01:00:00.000
2015-05-03 04:00:00.000
2015-05-03 05:00:00.000
2015-05-03 09:00:00.000
2015-05-03 13:00:00.000

答案 3 :(得分:0)

您需要在select中指定格式。在Group By中执行DATEPART将导致具有相同小时的行位于同一组中。此外,DATEPART仅返回日期时间的小时部分。

您可以尝试使用DATE_FORMAT函数,例如:

select DATE_FORMAT(DateTimes, "%Y-%m-%d %H:00:00") from MyTable

有关可用的格式选项,请参阅DATE_FORMAT的手册页。