2013-05-07 42 views
0

我有以下的SQL語句,我想獲取記錄,問題是我無法獲得一個記錄,即使日期匹配。無法獲取所有記錄與日期條件

SQLFiddle

SELECT distinct vname,start_date 
FROM my_dates 
where 
start_date >= to_date('30-APR-2013','DD-MON-YYYY HH12:MI:SS AM') 
and start_date <= to_date('06-MAY-2013','DD-MON-YYYY HH12:MI:SS AM') 

我在做什麼毛病我查詢?

+0

我的眼球告訴我你的日期格式圖片與你使用的日期格式不匹配。 – 2013-05-07 08:18:55

+0

@DavidAldridge即使我從查詢中刪除HH12:MI:SS AM,我也無法得到最後一行 – user75ponic 2013-05-07 18:57:05

回答

2

因爲你沒有在你的標準語句的TO_DATE部分指定的小時,分​​鍾或秒,甲骨文默認爲00:00:00,所以你的陳述基本上說要尋找值爲start_date is between "30-APR-2013 00:00:00 AM" AND "06-MAY-2013 00:00:00 AM"。由於「06-MAY-2013 6:59:00 AM」超出此範圍,因此不會在結果中返回。這裏有幾種方法可以解決這個問題:

指定TO_DATE語句中的小時數,分鐘數和秒數,以包含日期範圍後端的整個一天。

SELECT DISTINCT vname,start_date 
    FROM my_dates 
WHERE start_date BETWEEN TO_DATE('30-APR-2013','DD-MON-YYYY') 
         AND TO_DATE('06-MAY-2013 11:59:59 PM','DD-MON-YYYY HH12:MI:SS AM') 

或者你可以做一個計算,以23小時59分59秒添加到第二個日期值做上述同樣的事情。

SELECT DISTINCT vname,start_date 
    FROM my_dates 
WHERE start_date BETWEEN TO_DATE('30-APR-2013','DD-MON-YYYY') 
         AND TO_DATE('06-MAY-2013','DD-MON-YYYY')+1-(1/24/60/60) 

希望有幫助。

+0

第二種方法將是動態的,所以我不需要硬編碼參數?真實場景是我從前端應用程序獲取日期參數,它只會傳遞日期,而不是分鐘和秒。 – user75ponic 2013-05-08 09:50:43

+0

是的,如果您只收到日期而不是小時,分鐘或秒鐘,則第二種選擇是一種乾淨的方式。它會自動將23:59:59添加到第二個日期,因此在第二個日期中任何時間發生的任何start_date都將包含在結果集中。 – mtwaddell 2013-05-08 10:16:56

+0

mtwaddell,非常感謝。 – user75ponic 2013-05-08 11:22:28

0

to_date('06-MAY-2013','DD-MON-YYYY HH12:MI:SS AM')將返回May, 06 2013 00:00:00+0000這是小於06-MAY-2013 6:59:00 AM','DD-MON-YYYY HH12:MI:SS AM因此,你沒有得到最後一行。 嘗試此查詢...

SELECT distinct vname,start_date 
FROM my_dates 
where 
start_date >= to_date('30-APR-2013','DD-MON-YYYY HH12:MI:SS AM') 
and to_char(start_date,'DD.MM.YYYY') <= to_char(start_date,'DD.MM.YYYY') 

Sql fiddle Demo

+0

Amit,即使我從查詢中刪除了'HH12:MI:SS AM',我也無法獲得最後一行 – user75ponic 2013-05-07 07:58:20

+0

請參閱[這裏](http://sqlfiddle.com/#!4/8d721/13) – user75ponic 2013-05-07 08:00:18

+0

我編輯了我的答案嘗試查詢... – 2013-05-07 08:24:40