当我想在白天将一堆时间戳分组时,按
CONVERT (datetime, CONVERT (varchar, dbo.MEASUREMENT_Battery.STAMP, 101))
它为我生成了一个“日”标记,SQL Server仍然将其视为日期,并且可以对其进行排序和使用。
我想弄清楚的是,是否可以按小时做同样的事情。我试过了
CAST(DATEPART(Month, STAMP) AS varchar) + '/' + CAST(DATEPART(Day, STAMP) AS varchar) + '/' + CAST(DATEPART(Year, STAMP) AS varchar) + ' ' + CAST(DATEPART(Hour, STAMP) AS varchar) + ':00:00.000'
并且这“工作”,但SQL Server不再将其视为日期,因此我无法正确排序。
我想要的最终结果是正确的:ex:9/9/2015 9:00:00.000
答案 0 :(得分:1)
不要转换为字符串,直到你绝对必须"呈现"结果。
CONVERT()或FORMAT()返回时态信息的字符串表示
以下方法返回截断到小时的日期时间值,而不依赖于字符串操作(因此很快)。
select
dateadd(hour, datediff(hour,0, dbo.MEASUREMENT_Battery.STAMP ), 0)
, count(*)
from dbo.MEASUREMENT_Battery
group by
dateadd(hour, datediff(hour,0, dbo.MEASUREMENT_Battery.STAMP ), 0)
MS SQL Server 2014架构设置:
CREATE TABLE MEASUREMENT_Battery
([STAMP] datetime)
;
INSERT INTO MEASUREMENT_Battery
([STAMP])
VALUES
('2015-11-12 07:40:15'),
('2015-11-12 08:40:15'),
('2015-11-12 09:40:15'),
('2015-11-12 10:40:15'),
('2015-11-12 11:40:15'),
('2015-11-12 12:40:15'),
('2015-11-12 13:40:15'),
('2015-11-12 14:40:15')
;
注意:[Stamp]列下面的输出是默认显示
<强> Results 强>:
| | |
|----------------------------|---|
| November, 12 2015 07:00:00 | 1 |
| November, 12 2015 08:00:00 | 1 |
| November, 12 2015 09:00:00 | 1 |
| November, 12 2015 10:00:00 | 1 |
| November, 12 2015 11:00:00 | 1 |
| November, 12 2015 12:00:00 | 1 |
| November, 12 2015 13:00:00 | 1 |
| November, 12 2015 14:00:00 | 1 |
如果您绝对坚持日期/时间值的特定方式,那么您可以在select子句中添加显示格式(但在group by子句中不需要!)
select
FORMAT(dateadd(hour, datediff(hour,0, dbo.MEASUREMENT_Battery.STAMP ), 0) , 'MM/dd/yyyy HH')
, count(*)
from dbo.MEASUREMENT_Battery
group by
dateadd(hour, datediff(hour,0, dbo.MEASUREMENT_Battery.STAMP ), 0)
答案 1 :(得分:0)
当您使用DateTime Style 101(在第二个CONVERT结束时)时,Date将转换为mm / dd / yyyy,时间转换为00:00:00.000,如下所示: https://msdn.microsoft.com/en-us/library/ms187928.aspx
现在,从我的问题中我理解的是,你想要包括小时,这可以这样做:
SELECT FORMAT(STAMP , 'MM/dd/yyyy HH') + ':00:00.000'
注意:强>
测试一些测试日期,我们将看到我们得到了预期的结果:
-- Drop temp table if it exists
IF OBJECT_ID('tempdb..#T') IS NOT NULL DROP TABLE #T
-- Create temp table
CREATE TABLE #T ( myDate DATETIME )
-- Insert dummy values
INSERT INTO #T VALUES ( '2015-12-25 14:00:00.000' ) -- 14
INSERT INTO #T VALUES ( '2015-12-25 14:00:00.000' ) -- 14
INSERT INTO #T VALUES ( '2015-12-25 15:00:00.000' )
INSERT INTO #T VALUES ( '2015-12-25 16:00:00.000' )
INSERT INTO #T VALUES ( '2015-12-25 17:00:00.000' ) -- 17
INSERT INTO #T VALUES ( '2015-12-25 17:00:00.000' ) -- 17
-- Select query
SELECT COUNT( myDate ), MAX( FORMAT( myDate , 'MM/dd/yyyy HH') + ':00:00.000' ) FROM #T
GROUP BY DATEPART( hour, myDate )
输出:
2 12/25/2015 14:00:00.000
1 12/25/2015 15:00:00.000
1 12/25/2015 16:00:00.000
2 12/25/2015 17:00:00.000