2009-05-29 79 views
0

我需要按日期在SQL查詢來選擇,例如甲骨文主場迎戰超音速SQL

SELECT * FROM foo WHERE date = '2009-09-09' 

該查詢工作在我的高超聲速試驗數據庫,而不是甲骨文,這似乎需要:

SELECT * FROM foo WHERE date = TO_DATE('2009-09-09', 'yyyy-mm-dd') 

有沒有一種方法可以在這兩個數據庫中統一選擇日期?

回答

2

我找到了答案 - 你可以在HyperSonic中創建TO_DATE函數,然後第二個查詢在兩者中都起作用。例如,使課堂:

public class Date { 
    public static String toDate(String value, String format) { 
     return value; 
    } 
} 

和查詢

SELECT * FROM foo WHERE date = TO_DATE('2009-09-09', 'yyyy-mm-dd') 

工作在兩種。

0

通常不建議在Oracle中使用「date ='literal string'」謂詞 - 它對NLS_DATE_FORMAT設置非常敏感,並且經常會導致對結果集中要查找的內容的誤解(在上例中,您是否需要當天的所有記錄還是僅在午夜創建的那些記錄?)

如果您需要兩個數據庫的統一查詢字符串,則可以在Oracle中重命名該表並使用名稱foo創建一個視圖並將日期數據類型到視圖邏輯中的varchar2。您可能需要在表中添加一個基於函數的索引,以便對重鑄值進行高效搜索。

0

如果可以,您可以在Oracle會話中設置您的NLS_DATE_FORMAT,這樣您不需要使用TO_DATE函數,oracle會爲您在幕後執行此操作。

SQL> select value from v$nls_parameters where parameter = 'NLS_DATE_FORMAT'; 

VALUE 
---------------------------------------------------------------- 
DD/MM/YYYY 

SQL> create table nls_date_test (id number(10) , date_entered date); 

Table created. 

SQL> insert into nls_date_test values (1 , '31/05/2009'); 

1 row created. 

SQL> insert into nls_date_test values (2 , '30/05/2009'); 

1 row created. 

SQL> select * from nls_date_test where date_entered = '2009-09-09'; 
select * from nls_date_test where date_entered = '2009-09-09' 
                * 
ERROR at line 1: 
ORA-01861: literal does not match format string 


SQL> alter session set nls_date_format = 'YYYY-MM-DD'; 

Session altered. 

SQL> select * from nls_date_test where date_entered = '2009-05-30'; 

     ID DATE_ENTER 
---------- ---------- 
     2 2009-05-30 

SQL> select value from v$nls_parameters where parameter = 'NLS_DATE_FORMAT'; 

VALUE 
---------------------------------------------------------------- 
YYYY-MM-DD 

SQL> 
1

HSQLDB 2.0像Oracle一樣支持ANSI日期文字。所以,如果你可以升級到2.0 HSQLDB,你可以使用:

 
SELECT * 
FROM foo 
WHERE date_column = DATE '2009-09-09' 

兩個數據庫(其實很多多個數據庫偶數)