Преобразование даты и времени (ГГГГ-ММ-ДД ЧЧ: ММ: СС) в десятичное значение для открытых запросов в базу данных прогресса - PullRequest
1 голос
/ 21 апреля 2020

Я пытаюсь преобразовать текущую дату в десятичное число. Причина, по которой я хочу получить десятичное число, заключается в преобразовании этого десятичного числа в юлианскую дату . Из-за соображений производительности мне нужно сделать это с OPENQUERY. Связанная база данных является базой данных прогресса.

Соединение между базой данных SQL (sql server 2008r2) и базой данных прогресса (открытое пространство)

Текущая ситуация:

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

Это ошибка :

Поставщик OLE DB "MSDA SQL" для связанного сервера "[MylinkedServerName]" вернул сообщение
"[DataDirect] [ODB C Progress OpenEdge Wire Protocol Protocol] [OPENEDGE]
Синтаксическая ошибка в операторе SQL в или около
") в качестве даты и времени) AS DECIMAL (18,8)) + 24150" (10713) ".
Сообщение 7321, уровень 16, состояние 2, строка 1
Произошла ошибка при подготовке запроса
"SELECT * FROM [databasetable] WHERE ord_LastUpdateTime> (CAST (CAST (GETUTCDATE () как datetime) как DECIMAL (18,8)) + 2415020.5)"
для выполнения с поставщиком OLE DB "MSDA SQL" для связанного сервера "[MylinkedServerName]".

Надеюсь, у вас достаточно информации, чтобы помочь мне.

1 Ответ

1 голос
/ 21 апреля 2020

Для начала, используя 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 () - это UT C - поэтому вам нужно будет исправить количество часов между UT C и вашим часовым поясом.

Выше были проверены с использованием JDB C, а это значит, что для использования его в OPENQUERY может потребоваться дополнительная расстановка цитат.

...