2016-11-08 47 views
0

比較我有以下TABLE.Sample1的Oracle SQL:提取的日期在時間戳

Col1(varchar) | Col2(timestamp) 
--------------------------------------- 
A    | 08-NOV-16 09.59.52.000000000 AM 
B    | 08-NOV-16 10.05.12.000000000 AM 
C    | 09-NOV-16 10.05.12.000000000 AM 

假設我想要得到的所有行給出的DD MON YYYY格式的日期。

這裏是我的初始查詢:

SELECT * 
    FROM Sample1 
WHERE CAST(Col2 as DATE) = TO_DATE('8 NOV 2016','DD MON YYYY'); 

我很好奇,爲什麼這查詢不平等(=)工作,但在不平等工作正常(><<=>=<>) 。我在這裏沒有比較相同的數據類型嗎?

我結束了使用TO_CHAR功能,使其工作,但它引發的問題,是否有一個更簡單或更直接的方法呢?

SELECT * 
    FROM Sample1 
WHERE TO_CHAR(CAST(Col2 as DATE)) = TO_CHAR(TO_DATE('8 NOV 2016','DD MON YYYY')); 

回答

1

在Oracle a DATE值仍然有一個時間。 CAST(Col2 as DATE)不會改變這一點。

您可以使用trunc()設置date(或timestamp)至00:00:00的一部分時間,你不應該比較字符串,但日期:

SELECT * 
FROM Sample1 
WHERE trunc(col2) = TO_DATE('8 NOV 2016','DD MON YYYY'); 

但我強烈建議使用日期格式。它取決於SQL 客戶端程序的NLS設置,並可能因不同的語言設置而失敗。

我更喜歡使用ANSI SQL日期文字:

SELECT * 
FROM Sample1 
WHERE trunc(col2) = DATE '2016-11-08'; 

在這兩種情況下,日將有00:00:00時間,因爲沒有被賦予,因此比較會工作。

請注意,trunc(col2)將無法​​使用col2上的索引。如果性能很重要,則應使用範圍查詢where col2 >= DATE '2016-11-08' and col2 < DATE '2016-11-09'或在trunc(col2)上創建基於功能的索引。