2017-02-20 96 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