2017-02-20 97 views
-2

我如何在Oracle SQL比較兩個時間戳甲骨文

  • 日期1 = 1420042143
  • 日期2 = 1412176143

SELECT * FROM my_table WHERE my_table.date BETWEEN Date1 AND Date2

+1

你顯示的查詢有什麼問題?除此之外,你有他們錯了嗎? –

+1

這些值是什麼數據類型?顯然他們不是Oracle DATE或TIMESTAMP。你顯示的SQL語句有什麼問題? –

回答

1

假設這些都是Unix類型比較這兩timestamp以數字形式存儲的基於時代的時間戳,而不是以奇怪的方式格式化的真正的Oracle/SQL時間戳,您顯示的內容將起作用;除了你已經顯示的方式之外,值是錯誤的。 From the documentation

如果expr3 < expr2,則間隔爲空。

當你使用作爲下界Date1更高您使用的上限Date2值,你將不會看到任何數據,即使有任何行值你的範圍,除非你交換他們過來:

SELECT * FROM my_table WHERE my_table.date BETWEEN Date2 AND Date1 

如果你在其他地方獲得這些形式,不知道這將是更高的,你可以用最少,最偉大的去解決它:

SELECT * FROM my_table 
WHERE my_table.date BETWEEN LEAST(Date1, Date2) AND GREATEST(Date1, Date2) 

另請注意,between是包容性的。對於一些樣本數據:

CREATE TABLE my_table(epoch NUMBER); 
INSERT INTO my_table(epoch) VALUES (1412176143); 
INSERT INTO my_table(epoch) VALUES (1417584134); 
INSERT INTO my_table(epoch) VALUES (1420042143); 

原始查詢相當於沒有發現數據:

SELECT * FROM my_table WHERE epoch BETWEEN 1420042143 AND 1412176143; 

no rows selected 

倒車值找到數據,包括上限和下限值本身:

SELECT * FROM my_table WHERE epoch BETWEEN 1412176143 AND 1420042143; 

    EPOCH 
---------- 
1412176143 
1417584134 
1420042143 
+0

使用TIMESTAMP數據類型不存儲時間戳就是一個壞主意。 – BobC

+0

我可以保存新紀元,因爲你至少可以限制它們並知道它們是有效的;但前提是有一個很好的理由(比如數據進出其他平臺),即使如此,我仍然試圖存儲真正的日期/時間戳 - 無論如何,這可能是一個虛擬列。例如,存儲爲字符串的錯誤程度不同。但是,是的,一般同意,如果可能的話避免。 –

+0

是的,字符串或格式編號是真的應該避免的。 – BobC