Sql server MSSQL RowNumber根据字符串生成的DateTime上的错误行号

Sql server MSSQL RowNumber根据字符串生成的DateTime上的错误行号,sql-server,datetime,row-number,Sql Server,Datetime,Row Number,我正在使用下面的sql查询,得到了意外的结果。这就好像sql是在字符串上生成一个行号,而不是在DateTime上,即使我已经将生成的ssString转换为DateTime。你能帮我把索引对齐吗? 多谢各位 SQL查询 SELECT ROW_NUMBER() OVER (ORDER BY ((SELECT CAST(CAST(emd.DateOfMeasure AS DATE) AS NVARCHAR) + ' ' + CAST(DATEPART(HOUR, D

我正在使用下面的sql查询,得到了意外的结果。这就好像sql是在字符串上生成一个行号,而不是在DateTime上,即使我已经将生成的ssString转换为DateTime。你能帮我把索引对齐吗? 多谢各位

SQL查询

SELECT 
ROW_NUMBER() OVER (ORDER BY ((SELECT CAST(CAST(emd.DateOfMeasure AS DATE) AS NVARCHAR) + 
                ' ' + CAST(DATEPART(HOUR, DateOfMeasure) AS NVARCHAR) +
                ':' + CAST(DATEPART(MINUTE, DateOfMeasure) AS NVARCHAR) + ':00' AS DATETIME))) AS RowNum, 
CAST((SELECT CAST(CAST(emd.DateOfMeasure AS DATE) AS NVARCHAR) + 
                ' ' + CAST(DATEPART(HOUR, DateOfMeasure) AS NVARCHAR) +
                ':' + CAST(DATEPART(MINUTE, DateOfMeasure) AS NVARCHAR) + ':00' AS DATETIME) AS DATETIME) AS 'Date'
            from Data emd
意外结果

Index      DateTime
1   2013-10-16 00:30:00.000
2   2013-10-16 00:45:00.000
3   2013-10-16 01:00:00.000
4   2013-10-16 01:15:00.000
5   2013-10-16 01:30:00.000
6   2013-10-16 01:45:00.000
7   2013-10-16 10:00:00.000
8   2013-10-16 10:15:00.000
    .
    .
    .
45  2013-10-16 19:30:00.000
46  2013-10-16 19:45:00.000
47  2013-10-16 02:00:00.000
48  2013-10-16 02:15:00.000

如评论中所述,我认为这是对您的查询的一个更简单的表述:

SELECT 
ROW_NUMBER() OVER (
      ORDER BY DATEADD(minute,DATEDIFF(minute,0,DateOfMeasure),0)) AS RowNum, 
DATEADD(minute,DATEDIFF(minute,0,DateOfMeasure),0) AS 'Date'
from Data emd

它也表现出同样的奇怪吗?

DATEADD(minute,DATEDIFF(minute,0,GETDATE()),0)
返回当前日期和时间,秒数截断为0,并且继续将其视为
datetime
而不是字符串。这就是你试图用那个丑陋的字符串操作所做的吗?不,我已经按日期、小时和分钟进行了分组。但也许我可以根据你的建议分组,所以如果上面的评论是正确的,你最好在非截断的时间内做行数。同一分钟内的行将获得一个任意的升序数,因此没有理由不使用实际的时间顺序。