2016-12-06 32 views
0

我想動態地在SQL Server的openquery中傳遞一個日期函數。我的SQL Server連接到OleDB Oracle數據庫。在openquery中的日期函數的語法是什麼 - OleDB到SQL Server

當我運行使用基於Oracle的日期函數我的查詢,我的查詢運行,但沒有返回數據:當我使用基於SQL Server日期函數我收到以下錯誤消息,運行查詢

SELECT * 
FROM OPENQUERY([SMA], 'SELECT B.SQL_DATE 
         FROM DIM_DATE B 
         WHERE B.SQL_DATE = current_DATE'); 

SELECT * 
FROM OPENQUERY([SMA], 'SELECT B.SQL_DATE 
         FROM DIM_DATE B 
         WHERE B.SQL_DATE = ''GETDATE()'''); 

OLE DB提供程序 「OraOLEDB.Oracle」 鏈接服務器 「SMA」 返回消息 「ORA-01841:(全)年份必須-4713和+9999之間,而不是爲0」。

我想我應該使用基於SQL Server的語法(而不是Oracle語法),但不知道current_DATE語句如何能夠運行?

任何幫助將不勝感激!

+0

'GETDATE()'正在被SQL Server解析器的日期表示所取代,因爲評估不在字符串中,而current_DATE正在通過線路發送到連接的服務器並在那裏被解析爲sql。檢查您的語言環境並確保日期值對齊。你可以強制一個特定的日期值,這聽起來就是你需要在這裏做的。 –

+0

所以問題的一部分是我引用的日期字段是時間戳。如果我正在查詢打開的查詢之外的數據庫,則可以使其工作:SELECT B.SQL_DATE FROM [SMA] .. [SMA]。[DIM_DATE] B WHERE B.SQL_DATE = Convert(date,GETDATE ()); 但是,我不明白找出需要使用哪些滴答,或者甚至可以通過openquery傳遞該函數。 –

回答

2

您使用目標數據庫支持的語法,因此在這種情況下使用Oracle語法。

GetDate()相當於SYSDATE。這包含一個時間,因此您可以通過指定TRUNC(SYSDATE)來刪除時間。對於日期文字,你需要指定一個TO_DATE()函數,例如。 TO_DATE('31 -DEC-2016','DD-MON-YYYY')

由於日期文字必須是雙單引號,即TO_DATE(''31-DEC-2016' ')'DD-MON-YYYY')

+0

BOOM!你是最棒的!那就是訣竅。它也幫助我從哲學上理解如何通過開放查詢更好地理解要使用的功能。當我得到一分鐘時,我欠堆棧溢出一些問題的答案! –

+0

@BobbyJobsite - 你也可以[接受](http://meta.stackexchange.com/a/5235/238021)這個答案。 –

相關問題