SQL Server按时间分组时间戳,但保留为日期格式(不想拉出小时)

时间:2015-12-26 04:09:35

标签: sql sql-server

当我想在白天将一堆时间戳分组时,按

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

2 个答案:

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

SQL Fiddle

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'

注意:

  • ':00:00.000'是可选的,只是为了更好的输出。
  • 这仅适用于SQL Server 2012及更高版本。

测试一些测试日期,我们将看到我们得到了预期的结果:

-- 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