既然你說你對數據庫沒有「訪問權限」,我假設你不能創建任何函數來幫助你,而且你只能運行查詢?
如果是這種情況,那麼下面的代碼應該能夠幫助您獲得所需的大部分內容,並注意以下事項: 1)您要評估的存儲日期格式爲'mm/dd/yyyy'。如果情況並非如此,那麼您可以更改代碼以適合您的格式。 2)數據庫不包含無效日期,如2月30日。
首先,我創建了我的測試表和測試數據:
create table test (x number, sdate varchar2(20));
insert into test values (1, null);
insert into test values (2, '01/01/1999');
insert into test values (3, '1999/01/01');
insert into test values (4, '01-01-1999');
insert into test values (5, '01/01-1999');
insert into test values (6, '01-01/1999');
insert into test values (7, '12/31/1999');
insert into test values (8, '31/12/1999');
commit;
現在,查詢:
WITH dates AS (
SELECT x
, sdate
, substr(sdate,1,2) as mm
, substr(sdate,4,2) as dd
, substr(sdate,7,4) as yyyy
FROM test
WHERE (substr(sdate,1,2) IS NOT NAN -- make sure the first 2 characters are digits
AND to_number(substr(sdate,1,2)) between 1 and 12 -- and are between 0 and 12
AND substr(sdate,3,1) = '/' -- make sure the next character is a '/'
AND substr(sdate,4,2) IS NOT NAN -- make sure the next 2 are digits
AND to_number(substr(sdate,4,2)) between 1 and 31 -- and are between 0 and 31
AND substr(sdate,6,1) = '/' -- make sure the next character is a '/'
AND substr(sdate,7,4) IS NOT NAN -- make sure the next 4 are digits
AND to_number(substr(sdate,7,4)) between 1 and 9999 -- and are between 1 and 9999
)
)
SELECT x, sdate
FROM dates
WHERE to_date(mm||'/'||dd||'/'||yyyy,'mm/dd/yyyy') <= to_date('08/01/1999','mm/dd/yyyy');
而且我的結果:
X SDATE
- ----------
2 01/01/1999
with語句會做大多數驗證是爲了確保sdate值至少具有適當的格式。由於我在sdate上執行to_date時仍然收到無效的月份錯誤,因此我不得不每隔一個單位月/日/年進行一次to_date評估。
我希望這會有所幫助。
那麼你是_supposed_將日期存儲在DATE列中。你爲什麼不呢? – 2011-05-11 14:54:44
這是我在工作中使用的遺留應用程序。他們使用字符串,因爲否則日期默認爲當前日期...我無法控制數據庫 – ntsue 2011-05-11 15:04:17
,如果你有varchar2字段中的日期(壞),你甚至沒有一致的格式,那麼你可能是SOL(短缺的重建表格將所有各種字符格式轉換爲實際的日期字段) – tbone 2011-05-11 17:43:00