首页 > 解决方案 > SQL Server 等效于 Postgres 的 dense_Rank() 和 TO_DATE()

问题描述

我有来自 Postgres 数据库的以下查询。我想将以下查询从 Postgres 转换为 Azure SQL Server 版本。

我知道 TO_DATE 可以写成 convert(DATETIME,...) 但我也想保护日期格式。即使更改了 TO_DATE,仍然有错误。有人可以帮我弄这个吗?

SELECT b.*
FROM (
         SELECT MAX(gs.ID),
                dense_rank() over (order by gs.TIME_COLUMN DESC ) AS latest
         FROM TEST_TABLE gs
         WHERE TIME_COLUMN BETWEEN TO_DATE('%time_parameter%', 'YYYY-MM-DD HH24:MI:SS') 
         AND TO_DATE('%time_parameter2%', 'YYYY-MM-DD HH24:MI:SS')

         GROUP BY gs.OTHER_ID, gs.TIME_COLUMN
     ) a
         LEFT JOIN TEST_TABLE b ON max.latest = b.ID

标签: sql-serverpostgresqlto-datedense-rank

解决方案


确保YYYY-MM-DD不会像在某些语言中那样被错误解释YYYY-DD-MM的等价物是在转换期间显式指定样式编号:

WHERE TIME_COLUMN 
      BETWEEN CONVERT(datetime, '%time_parameter%',  21)
          AND CONVERT(datetime, '%time_parameter2%', 21)

有关样式的完整列表,请参阅为 SQL Server 日期和时间格式构建备忘单

yyyy-MM-ddThh:mm:ss.nnn正如 Larnu 和 Panagiotis 评论的那样,如果您使用与语言无关的格式(例如和/或datetime2代替 )会更好datetime,这将防止语言设置干扰日期时间解析。

顺便说一句,BETWEEN通常应该避免日期范围查询;请参阅负责任约会的前几个链接。


推荐阅读