我已经在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
内:
DAT_CLOSEDATE
必须动态获取昨天的数据(今天1)
Oracle中的DAT_CLOSEDATE
列数据类型在SQL Server中为FLOAT
和DATETIME
我希望OPENQUERY
的语法类似于以下内容:
OPENQUERY(ORACLE_DB, 'SELECT DAT_CLOSEDATE, TXT_TICKETNUMBER
FROM SCHEME.TABLE
WHERE [DAT_CLOSEDATE] = DATEADD(d, -1, GETDATE())')
答案 0 :(得分:0)
如果要在Oracle上寻找同类产品,则:
where DAT_CLOSEDATE = sysdate-1
或
where DAT_CLOSEDATE = trunc(sysdate)-1
第二个版本将一天中的时间设置为00:00:00
答案 1 :(得分:0)
假设 DAT_CLOSEDATE
列具有浮点类型值,例如 20181231202534
,20181231202713
... ,它们的类型是 yyyymmddhh24miss
。是从日期值转换而成的,其中yyyy
代表year
,mm
代表月份,dd
表示一天,hh24
表示小时,范围为00-23
,mi
表示分钟,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'')')
以获取前一天的值。