【问题标题】:Compare two timestamp in Oracle比较Oracle中的两个时间戳
【发布时间】:2017-07-10 00:33:47
【问题描述】:

如何在 oracle SQL 中比较这两个timestamp

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

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

【问题讨论】:

  • 您显示的查询有什么问题?除此之外,你把它们弄错了吗?
  • 这些值是什么数据类型?显然它们不是 Oracle DATE 或 TIMESTAMP。您展示的 SQL 语句有什么问题?

标签: sql oracle timestamp


【解决方案1】:

假设这些是以数字形式存储的 Unix 类型的基于纪元的时间戳,而不是您以一种奇怪的方式格式化的真正的 Oracle/SQL 时间戳,那么您所展示的内容将起作用;除了您展示它的方式之外,这些值是错误的方式。 From the documentation:

如果 expr3

由于您用作下限的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

【讨论】:

  • 不使用 TIMESTAMP 数据类型存储时间戳真是个坏主意。
  • 我可以存储纪元时间,因为您至少可以约束它们并知道它们是有效的;但前提是有充分的理由(比如数据进出其他平台),即便如此,我还是很想存储实际的日期/时间戳等价物——也许作为虚拟列。例如,与以字符串形式存储的错误程度不同。但是,是的,总体上同意,如果可能的话避免。
  • 是的,字符串或格式化数字是真正应该避免的。
猜你喜欢
  • 2012-02-04
  • 2017-06-24
  • 1970-01-01
  • 2015-01-02
  • 2019-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-25
相关资源
最近更新 更多