2012-12-20 13 views
2

我需要同時支持Oracle和SQL Server。我在兩個數據庫中都有名爲get_current_date的非常相似的程序。現在我有一個查詢:NamedParameterJDBCTemplate和函數語法在不同的RDBMS上

SELECT col1, col2 FROM table WHERE colDate < get_current_date() 

這精美的作品在Oracle中,但缺乏時,在SQL Server中執行的dbo.前綴。

Spring應該能夠處理這個問題嗎?我還有什麼其他選擇?我不認爲應該有必要自己確定數據庫類型。

謝謝!

回答

1

Spring應該能夠處理這個問題嗎?

- >get_current_date()是數據庫的方法/程序(可能它是數據庫或自定義的),所以它依賴於數據庫,春天不會採取照顧。

我還有其他的選擇嗎?

- >那麼你可以把當前的日期放在代碼中查詢,所以它將獨立於數據庫的使用。喜歡的東西:

String sql = "SELECT col1, col2 FROM table WHERE colDate < " + new Date(); 
+0

'get_current_date'是我自己在兩個DB中的過程,它們充當系統特定功能的包裝。由於我們選擇了DBMS來爲日期提供服務,因此我無法將日期放在查詢的位置。 (數據庫和應用程序運行在不同的機器上,我們不想冒時間設置差異導致問題。) – annih

0

如何獲得當前日期在Java中是這樣的:

Calendar cal = Calendar.getInstance(); 
currentDate = cal.getTime(); 

and then you do: 

SELECT col1, col2 FROM table WHERE colDate < currentDate 
+0

正如我上面寫的:我不能把日期放在我用Java激發查詢的地方,因爲我們選擇了DBMS成爲當前時間戳的唯一來源。如果不可能,我們可能不得不重新考慮這一點。 – annih

3

每個JDBC驅動程序應該支持JDBC函數轉義(在第13.4.1規定並在附錄中列出d JDBC 4.1 spec)。對於CURRENT_DATE,它是CURRENT_DATECURRENT_DATE()

您可以在查詢調用此爲

SELECT col1, col2 FROM table WHERE colDate < {fn CURRENT_DATE} 

您可以DatabaseMetaData.getTimeDateFunctions()

BTW查詢的特定驅動程序支持的功能列表:這是假設你只是想數據庫的當前日期。這不是在查詢中調用用戶定義函數的一般解決方案。

+0

太棒了!我知道這樣的事情會存在。謝謝。這也適用於自定義程序嗎? – annih

+0

不,函數escapes是一個通用數據庫函數的抽象層,它偶爾會在數據庫中有(略)不同的實現。 JDBC驅動程序只應實現規範附錄D中列出的功能。這不是一個解決方案來調用用戶定義的函數(我也加入到我的答案)。 –

+0

這完全有效。再次感謝。但我仍然需要一個定製程序的想法。如果你能提供一個,我可以接受這個帖子作爲完美的答案。 – annih

相關問題