2013-08-26 44 views
3

我需要選擇行,其中的時間小於或等於12:00 我腦子裏想的是這樣的查詢:選擇日期,時間是小於或等於'12:00' 甲骨文

SELECT daterow FROM datecolumn WHERE daterow <= TO_DATE('12:00, HH24:MI') 

但是我得到一個錯誤:

ORA-01843: not a valid month 

我怎麼會去得到那有時間小於12:00中旬的一天中的所有行?

回答

1

爲了選擇所有行daterow列值的時間部分小於或等於12:00中午可以使用to_char()函數提取小時和分鐘和to_number()將其轉換爲數字進行進一步的比較:

-- sample of data. Just for the sake of demonstration 
SQL> with t1(col) as(
    2 select sysdate - to_dsinterval('P0DT3H') from dual union all 
    3 select sysdate - to_dsinterval('P0DT2H') from dual union all 
    4 select sysdate - to_dsinterval('P0DT1H') from dual union all 
    5 select sysdate + to_dsinterval('P0DT3H') from dual union all 
    6 select sysdate + to_dsinterval('-P2DT0H') from dual 
    7 ) 
    8 select to_char(col, 'dd.mm.yyyy hh24:mi:ss') as res 
    9 from t1 t 
10 where to_number(to_char(col, 'hh24mi')) <= 1200 
11 ; 

結果:

RES 
------------------- 
26.08.2013 08:10:59 
26.08.2013 09:10:59 
26.08.2013 10:10:59 
24.08.2013 11:10:59 
+0

完美無瑕! :b謝謝 – Nicholas

1

嘗試此,

SELECT daterow FROM datecolumn WHERE daterow <= TO_DATE('12:00', 'HH24:MI'); 
+0

我很驚訝,到底是怎樣我沒有看到,2小時前? 上帝該死。謝謝Dba -.- – Nicholas

+0

@balls,歡迎你。 :) – Dba

+4

'To_Date('12:00 hh24:mi')'返回的日期部分將是本月的第一天 - '01.08.2013 12:00:00',如果'daterow'有一個值,讓我們說'02.08.2013 09:00:00','daterow <= TO_DATE('12:00','HH24:MI')'的條件將是錯誤的,儘管事實上'daterow'的時間部分是少於'12:00'。 –

1

對不起,但是<= TO_DATE('12:00', 'HH24:MI')不起作用。它不會從每個日期提取小時和分鐘,並將其與12:00進行比較。相反,它構造了當前月份的月中高日的日期,並將每個日期與該日期進行比較。

如果你想提取東西從一個日期,使用extract函數。

注意:在日期上使用提取,並且要提取小時,分鐘或秒時,您首先需要將日期轉換爲時間戳。

例子:

SELECT 
    extract(hour FROM cast(A AS TIMESTAMP)) AS h, 
    extract(MINUTE FROM cast(A AS TIMESTAMP)) AS m 
FROM 
    DEMO 
; 

你可以找到sqlfiddle一個完整的例子。該示例還顯示to_date方法不起作用。

1

試試這個:

SELECT daterow FROM datecolumn 
WHERE TO_DATE(daterow,'HH24:MI') <= TO_DATE('12:00', 'HH24:MI'); 
相關問題