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

问题描述 投票:0回答:1

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

连接是在SQL数据库(sql server 2008r2)和进度数据库(openedge)之间

当前情况:

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

这是错误:

链接服务器“ [MylinkedServerName]”的OLE DB提供程序“ MSDASQL”返回消息“ [DataDirect] [ODBC Progress OpenEdge Wire协议司机] [OPENEDGE]SQL语句中的语法错误大约为“)为datetime),如DECIMAL(18,8))+ 24150“(10713)”。Msg 7321,第16级,状态2,第1行准备查询时发生错误“ SELECT * FROM [databasetable]在哪里ord_LastUpdateTime>(CAST(CAST(GETUTCDATE()as datetime)AS DECIMAL(18,8))+ 2415020.5)”用于针对链接服务器的OLE DB提供程序“ MSDASQL”执行“ [[MylinkedServerName]”。

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

sql sql-server datetime openedge progress-db
1个回答
0
投票

[开始使用timestampdiff,您可以计算朱利安时代以来的“时间”:

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中使用它可能需要一些额外的引号摆弄。

© www.soinside.com 2019 - 2024. All rights reserved.