Я создал процедуру для извлечения вчерашних данных из таблицы базы данных Oracle и вставки их в таблицу SQL Server 2012.
Используя следующее
IF OBJECT_ID('tempdb..#Temp') IS NOT NULL
DROP TABLE #Temp
SELECT
LEAD(CONVERT(VARCHAR, CONVERT(DATETIME, '01-JAN-1970 03:00:00', 120) + [DAT_CLOSEDATE] / (24 * 60 * 60), 120), 1, CONVERT(VARCHAR, CONVERT(DATETIME, '01-JAN-1970 03:00:00', 120) + [DAT_CLOSEDATE] / (24 * 60 * 60), 120)) OVER (PARTITION BY [TXT_TICKETNUMBER] ORDER BY [DAT_CLOSEDATE]) AS [CLOSE_DATE]
INTO #Temp
FROM OPENQUERY(ORACLE_DB, 'SELECT DAT_CLOSEDATE ,TXT_TICKETNUMBER
FROM SCHEME.TABLE')
WHERE
[DAT_CLOSEDATE] = DATEADD(d, -1, GETDATE())
SELECT * FROM #Temp
Всеработает как положено, когда я не использую условие WHERE
.
Но как только я использую условие WHERE
, появляется следующая ошибка
Сообщение 8115, уровень 16, Состояние 2, строка 4
Ошибка арифметического переполнения при преобразовании выражения в тип данных datetime.
ПРИМЕЧАНИЕ:
Тип данных столбца DAT_CLOSEDATE
в таблице Oracle - float
и его datetime в sql server.
Я использовал функции LEAD
и CONVERT
, чтобы преобразовать его значения в datetime
тип данных
Я пытался преобразовать его втип данных даты выглядит следующим образом.
IF OBJECT_ID('tempdb..#Temp') IS NOT NULL
DROP TABLE #Temp
SELECT
lead(convert(varchar,convert(date,'01-JAN-1970 03:00:00',120) +
[DAT_CLOSEDATE]/(24*60*60), 120),1,convert(varchar,convert(date,'01-JAN-
1970 03:00:00',120) + [DAT_CLOSEDATE]/(24*60*60), 120)) over(partition by
[TXT_TICKETNUMBER] order by [DAT_CLOSEDATE])AS [CLOSE_DATE]
INTO #Temp
FROM OPENQUERY(ORACLE_DB, 'SELECT DAT_CLOSEDATE ,TXT_TICKETNUMBER
FROM SCHEME.TABLE')
WHERE [DAT_CLOSEDATE] = DATEADD(d,-1,GETDATE())
SELECT * FROM #Temp
Но я получил эту ошибку
Сообщение 206, Уровень 16, Состояние 2, Строка 4
Столкновение с типом операнда: дата несовместима сfloat
пример данных для столбца DAT_CLOSEDTE iВ таблице оракулов, которая является FLOAT
DAT_CLOSEDATE
1531038410
1531038433
1531038438
1531038447
1531038449
1531038450
1531038506
1531038506
Одно из решений, которое я ищу, - я ожидаю, что синтаксис OPENQUERY
будет выглядеть примерно так:
OPENQUERY(ORACLE_DB, 'SELECT DAT_CLOSEDATE, TXT_TICKETNUMBER
FROM SCHEME.TABLE
WHERE [DAT_CLOSEDATE] = trunc(sysdate)-1')
, но для этого нужносначала преобразуйте из типа данных FLOAT в тип DATE.