2016-05-02 79 views
1
column name data type 
wp_stime   DATE 

QUERY:Oracle數據庫:在一天的某些時間之間選擇

select wp_stime from workpaths; 

OUTPUT:

29-FEB-12 
29-FEB-12 
24-FEB-12 
24-FEB-12 
31-OCT-11 
12-DEC-11 
12-JAN-11 
19-OCT-11 
19-OCT-11 
11-AUG-11 
19-OCT-11 
21-NOV-11 
28-JUL-11 
02-AUG-11 
01-MAR-12 
01-MAR-12 
01-MAR-12 
01-MAR-12 
01-MAR-12 
01-MAR-12 
01-MAR-12 
01-MAR-12 
01-MAR-12 
01-MAR-12 
01-MAR-12 
01-MAR-12 
01-MAR-12 
01-MAR-12 
01-MAR-12 

問題是我怎麼能選擇基於上午9時〜wp_stime的下午5點?

QUERY 2:

select to_char(wp_stime, 'HH24:MI:SS') from workpaths; 

OUTPUT:

00:09:20 
00:10:17 
00:11:26 
00:42:50 
00:44:32 
00:45:35 
00:48:47 
00:51:45 
00:53:01 
00:56:43 
01:31:39 
01:34:01 
14:49:30 
01:53:32 
02:06:37 
02:36:54 
02:51:12 
+0

您正在嘗試獲取沒有時間分量的日期的時間組件 – cableload

+0

@cableload我不認爲你是對的,因爲我可以轉換to_char並查看時間戳。看到更新的查詢上面 – ealeon

+0

好吧..我現在看到它...所以你想要上面的任何日期,選擇9和5? – cableload

回答

1
select * from workpaths where to_char(wp_stime,'hh24') between 9 and 16; 

應該有所幫助。 Oracle會將您的日期字段中的小時部分作爲字符串提取,並且在看到您正在與數字進行比較時會將其隱式轉換爲數字。因此你可以比較幾個小時。實際上,這個查詢給出了時間大於上午9點和下午5點的日期。

編輯:

17被替換爲16,所以直到16點59分59秒值將被考慮。

編輯2:

要明確地執行字符串到數字鑄造:

select * from workpaths where to_number(to_char(wp_stime,'hh24')) between 9 and 16; 
+0

這絕對沒有幫助,因爲你在比較字符串,因此按字典順序排列。 10小於9且小於17,所以不會選擇10。ALSO:提取(從列中的小時)假定列是TIMESTAMP數據類型;小時提取這種方式是**不** NLS依賴。你在哪裏提出這樣的想法?另一方面,如Oracle文檔中所述,提取(小時列)**不適用於DATE數據類型。 – mathguy

+0

@mathguy:1.這將起作用。因爲我比較數字9和數字17,而不是字符串'9'和字符串'17'。 Oracle會隱式地嘗試將我獲得的字符串轉換爲數字,在這種情況下,字符串將始終爲數字。 2. NLS:感謝您的糾正。我的印象是這必須對NLS做些什麼,因爲NLS早些時候給了我日期格式的麻煩。也許有黃疸。 3.至於想法,由於缺乏經驗。 –

+1

實際上你是對的,這樣做會起作用,因爲Oracle會將字符串轉換爲數字,而不是其他方式......仍然依靠隱式轉換並不理想。你可以用to_number(to_char(...))來明確它 - 你不會因爲效率而失去任何東西,因爲Oracle無論如何都會這樣做(並且必須猜測),並且更容易閱讀和理解代碼的功能。 – mathguy

3

TRUNC(wp_stime)將返回相同的日期,與截斷下降到00:00:00的時間部分。然後wp_stime - trunc(wp_stime)將返回「小數部分」(wp_stime的時間部分)。這表示爲一個數字,以天爲單位。您希望這個小數部分在9到17個小時之間,或者9/24和17/24天之間。

這是查詢,在WITH子句中的測試數據前面。對你來說,與表中的現有已,完整的查詢只是在我的代碼的最後一行:

with workpaths(wp_stime) as (
     select to_date('02-MAY-2016 13:30:44', 'dd-mon-yyyy hh24:mi:ss') from dual union all 
     select to_date('15-FEB-2013 17:43:00', 'dd-mon-yyyy hh24:mi:ss') from dual union all 
     select to_date('21-DEC-2015 2:15:27', 'dd-mon-yyyy hh24:mi:ss') from dual union all 
     select to_date('02-JAN-2016 10:22:09', 'dd-mon-yyyy hh24:mi:ss') from dual 
    ) 
select wp_stime from workpaths where wp_stime - trunc(wp_stime) between 9/24 and 17/24; 

輸出

WP_STIME 
------------------ 
02-MAY-16 13:30:44 
02-JAN-16 10:22:09 
+0

如果我們想要在幾分鐘之內過濾出來怎麼辦?說到5.30。 –

+0

然後我們將比較17.5/24或17/24 + 30 /(24 * 60)。 – mathguy

0
select * from workpaths where to_date(wp_stime, 'hh24') between 9 and 17; 

應該工作。在這種情況下,您正在使用日期數據類型而不是char數據類型。

+0

to_date將創建一個DATE數據類型。這不能與像9和17這樣的數字相比較。你是否花了一點努力來測試你的查詢,例如通過使用SYSDATE而不是wp_stime?這很容易。 (您也會遇到其他問題:to_date需要一個STRING參數,因爲您提供了一個日期,所以Oracle將執行一些隱式轉換,其中一些可能會失敗。) – mathguy

相關問題