Как исправить ошибку (ошибка арифметического переполнения при преобразовании выражения в тип данных datetime) в SQL Server - PullRequest
0 голосов
/ 31 декабря 2018

Я создал процедуру для извлечения вчерашних данных из таблицы базы данных 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.

1 Ответ

0 голосов
/ 31 декабря 2018

Вот пример фрагмента, который использует дополнительный подзапрос для преобразования FLOAT в DATETIME.
, что облегчает дальнейшие вычисления.

Поскольку это пример, вставка во временную таблицу не используется.

declare @Table table (TXT_TICKETNUMBER VARCHAR(30), DAT_CLOSEDATE FLOAT);

insert into @Table (TXT_TICKETNUMBER, DAT_CLOSEDATE) values
('foo000042', ((CONVERT(float, DATEADD(hour,-24,GETDATE()))*86400.0)-(25567.0*86400))), 
('foo000042', ((CONVERT(float, DATEADD(hour,-23,GETDATE()))*86400.0)-(25567.0*86400))),
('bar000042', ((CONVERT(float, DATEADD(hour,-22,GETDATE()))*86400.0)-(25567.0*86400))), 
('bar000042', ((CONVERT(float, DATEADD(hour,-21,GETDATE()))*86400.0)-(25567.0*86400)));

SELECT
TICKETNUMBER, 
CLOSEDATETIME,
DAT_CLOSEDATE,
LEAD(CloseDatetime) OVER (PARTITION BY TICKETNUMBER ORDER BY CLOSEDATETIME) AS NextCLOSEDATETIME
FROM
(
    select 
     TXT_TICKETNUMBER AS TICKETNUMBER, 
     DATEADD(hour,3,CONVERT(datetime,25567.0+(DAT_CLOSEDATE/86400.0))) AS CLOSEDATETIME,
     DAT_CLOSEDATE
    from 
    (
        -- put the openquery here instead
        select TXT_TICKETNUMBER, DAT_CLOSEDATE 
        from @Table
    ) q1
) q2
WHERE CAST(CLOSEDATETIME AS DATE) = CAST(DATEADD(day,-1,GETDATE()) AS DATE)

Но если вы измените этот запрос Oracle для преобразования этого "DAT_CLOSEDATE" в строку.
Например, в формате YYYY-MM-DD HH24:MI:SS.
Тогда это, вероятно, приведет к преобразованию вT-SQL DATETIME немного проще.

...