OPEN QUERY

时间:2019-01-01 08:02:39

标签: sql sql-server oracle oracle11g

我已经在SQL Server 2012中创建了一个过程,目的是从Oracle表中获取昨天的数据并将其插入到SQL Server表中 像这样使用OPENQUERY:

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()) 

一切正常,但是SQL Server语法中的问题在WHERE子句中,因此考虑以下因素,我希望使其在OPENQUERY内:

  1. DAT_CLOSEDATE必须动态获取昨天的数据(今天1)

  2. Oracle中的DAT_CLOSEDATE列数据类型在SQL Server中为FLOATDATETIME

我希望OPENQUERY的语法类似于以下内容:

OPENQUERY(ORACLE_DB, 'SELECT DAT_CLOSEDATE, TXT_TICKETNUMBER   
                      FROM SCHEME.TABLE 
                      WHERE [DAT_CLOSEDATE] = DATEADD(d, -1, GETDATE())')

2 个答案:

答案 0 :(得分:0)

如果要在Oracle上寻找同类产品,则:

where DAT_CLOSEDATE = sysdate-1

where DAT_CLOSEDATE = trunc(sysdate)-1

第二个版本将一天中的时间设置为00:00:00

答案 1 :(得分:0)

假设 DAT_CLOSEDATE 列具有浮点类型值,例如 2018123120253420181231202713 ... ,它们的类型是 yyyymmddhh24miss是从日期值转换而成的,其中yyyy代表yearmm代表月份,dd表示一天,hh24表示小时,范围为00-23mi表示分钟,ss表示秒。

在这种情况下,可能会调用the following块:

OPENQUERY(ORACLE_DB, 'SELECT DAT_CLOSEDATE, TXT_TICKETNUMBER   
                        FROM SCHEMA.MYTABLE 
                       WHERE substr(DAT_CLOSEDATE,1,8) = to_char(sysdate-1,''yyyymmdd'')')

以获取前一天的值。