将日期时间 (YYYY-MM-DD HH:MM:SS) 转换为十进制,以便 openquery 进行数据库

Convert datetime (YYYY-MM-DD HH:MM:SS) to decimal for openquery to progress database

我正在尝试将当前日期转换为十进制数。我想得到一个十进制数的原因是将该十进制数转换为 Julian date。由于性能原因,我需要使用 OPENQUERY 来执行此操作。链接的数据库是进度数据库。

连接在 SQL 数据库(sql 服务器 14.0)和进度数据库(openedge)

之间

现状:

SELECT * FROM OPENQUERY([MylinkedServerName],'select * FROM [databasetable] WHERE ord_LastUpdateTime > (CAST(CAST(GETUTCDATE() as datetime) as decimal(18,8) + 2415020.5)

这是错误:

OLE DB provider "MSDASQL" for linked server "[MylinkedServerName]" returned message
"[DataDirect][ODBC Progress OpenEdge Wire Protocol driver][OPENEDGE]
Syntax error in SQL statement at or about
") as datetime) AS DECIMAL(18,8)) + 24150" (10713)".
Msg 7321, Level 16, State 2, Line 1
An error occurred while preparing the query
"SELECT * FROM [databasetable] WHERE ord_LastUpdateTime > (CAST(CAST(GETUTCDATE() as datetime) AS DECIMAL(18,8)) + 2415020.5)"
for execution against OLE DB provider "MSDASQL" for linked server "[MylinkedServerName]".

我希望你有足够的信息来帮助我。

首先,使用 timestampdiff 您可以计算自儒略纪元以来的 'time':

timestampdiff( sql_tsi_second, { d '01/01/-4713' }, now() ) / 86400

由于差值的单位是sql_tsi_second,结果需要除以24小时*60分钟*60秒=86400秒。如果你想要更精确的计算,你可以使用:

timestampdiff( sql_tsi_frac_second, { d'01/01/-4713' }, now() ) / 86400000 

唯一剩下的问题是我认为 now() 不是 UTC - 因此您需要更正 UTC 和您所在时区之间的小时数。

上面已经使用 JDBC 进行了测试,这意味着要在 OPENQUERY 中使用它可能需要一些额外的引用调整。