SQL 服务器相当于 Postgres 的 dense_Rank() 和 TO_DATE()
SQL Server equivalent of dense_Rank() and TO_DATE() of Postgres
我有来自 Postgres 数据库的以下查询。我想将以下查询从 Postgres 转换为 Azure SQL 服务器版本。
我知道 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
等价于确保 YYYY-MM-DD
不是 incorrectly interpreted as YYYY-DD-MM
in some languages 是在转换期间显式指定样式编号:
WHERE TIME_COLUMN
BETWEEN CONVERT(datetime, '%time_parameter%', 21)
AND CONVERT(datetime, '%time_parameter2%', 21)
有关样式的完整列表,请参阅 Build a cheat sheet for SQL Server date and time formats。
正如 Larnu 和 Panagiotis 评论的那样,如果您使用语言中立的格式会更好,例如 yyyy-MM-ddThh:mm:ss.nnn
、and/or datetime2
代替 datetime
,这将防止语言设置干扰日期时间解析。
顺便说一句,对于日期范围查询,通常应避免使用 BETWEEN
;在 Dating Responsibly.
查看前几个链接
这是上述查询的 SQL 服务器版本。感谢您的讨论,但 和一些尝试解决了这个问题。
SELECT b.*
FROM (
SELECT MAX(gs.ID) as max,
dense_rank() over (order by gs.TIME_COLUMN DESC ) AS latest
FROM TEST_TABLE gs
WHERE TIME_COLUMN BETWEEN CONVERT(DATETIME, '%time_parameter%')
AND CONVERT(DATETIME, '%time_parameter2%')
GROUP BY gs.OTHER_ID, gs.TIME_COLUMN
) a
LEFT JOIN TEST_TABLE b ON a.max = b.ID
我有来自 Postgres 数据库的以下查询。我想将以下查询从 Postgres 转换为 Azure SQL 服务器版本。
我知道 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
等价于确保 YYYY-MM-DD
不是 incorrectly interpreted as YYYY-DD-MM
in some languages 是在转换期间显式指定样式编号:
WHERE TIME_COLUMN
BETWEEN CONVERT(datetime, '%time_parameter%', 21)
AND CONVERT(datetime, '%time_parameter2%', 21)
有关样式的完整列表,请参阅 Build a cheat sheet for SQL Server date and time formats。
正如 Larnu 和 Panagiotis 评论的那样,如果您使用语言中立的格式会更好,例如 yyyy-MM-ddThh:mm:ss.nnn
、and/or datetime2
代替 datetime
,这将防止语言设置干扰日期时间解析。
顺便说一句,对于日期范围查询,通常应避免使用 BETWEEN
;在 Dating Responsibly.
这是上述查询的 SQL 服务器版本。感谢您的讨论,但
SELECT b.*
FROM (
SELECT MAX(gs.ID) as max,
dense_rank() over (order by gs.TIME_COLUMN DESC ) AS latest
FROM TEST_TABLE gs
WHERE TIME_COLUMN BETWEEN CONVERT(DATETIME, '%time_parameter%')
AND CONVERT(DATETIME, '%time_parameter2%')
GROUP BY gs.OTHER_ID, gs.TIME_COLUMN
) a
LEFT JOIN TEST_TABLE b ON a.max = b.ID