Oracle SQL - 如何比较日期

Oracle SQL - how dates are compared

我是 SQL 的新手,尤其是 Oracle。

我创建了一个日期集合 => dates 包含 date (i)

我有一个 table tabledaterevenue.

当我查询时

select sum(revenue) from table where date between date(i) and date(i+1)

我无法获得正确的数字 => 值小于正确的值。

当我做的时候

select sum(revenue) from table where date between to_date(date(i),'dd-mm-yyyy') and to_date(date(i+1),'dd-mm-yyyy')

不同的故事 => 我收到空值。

只有

select sum(revenue) from table where date>=date(i) and date<=date(i+1)

效果很好。

但是为什么呢?

您 collection 中的变量已经是日期,您正在将它们再次转换为日期(这是您永远不应该做的事情)。当您将 DATE 转换为 DATE 时,Oracle 使用默认日期格式掩码预先将变量转换为字符串。您可以通过以下方式查看您的:

SELECT value
FROM nls_session_parameters
WHERE parameter = 'NLS_DATE_FORMAT'

在我的例子中,我的日期格式是 DD-MM-RR。所以,如果我再次将日期 01-01-2015 转换为日期,它将像这样转换:

1. It will be implicitly converted into a string using the DD-MON-RR mask. I would get 01-01-15.
2. Then, it will convert the string 01-01-15 into a date using the mask you provide (dd-mm-yyyy). In this case, to_date('01-01-15','dd-mm-yyyy') will return 01-01-0015.

这可能是您未在查询中获得任何结果的原因:

select sum(revenue) from table where date between to_date(date(i),'dd-mm-yyyy') and to_date(date(i+1),'dd-mm-yyyy')

如果您改用 'dd-mm-rrrr' 掩码,它会将字符串 01-01-15 转换为 01-01-2015,您的查询可能会 return 一些东西。我不知道,这将取决于您 collection.

中的日期

日期值也包含时间。因此,只有包含同一天且时间也相同的两个日期才相等。

因此,当您将“17-11-2015 07:15:00”与“17-11-2015”进行比较时,它们将不相等。

这会导致返回的行数少于您语句中的预期:

where date between date(i) and date(i+1)

日期(加上时间)可能大于日期(i+1),即使日期相同。

如果您对时间分量不感兴趣,请使用 trunc() 函数消除时间分量。所以你可以写:

select sum(revenue) from table where trunc(date) between date(i) and date(i+1)

(我认为date(i)没有时间)

为什么要将 DATE 值转换为 DATE 值?

当您执行 to_date(date(i),'dd-mm-yyyy') 时,会发生以下情况:

  1. 日期值 date(i) 使用当前 NLS_DATE_FORMAT 格式隐式转换为字符串。

  2. 然后使用 dd-mm-yyyy

  3. 格式将该字符串转换回 DATE

因此,如果 偶然 您当前的 NLS_DATE_FORMAT 格式等于 dd-mm-yyyy 那么您的查询将有效。

或者,为了使其正常工作,请在 运行 查询之前执行 ALTER SESSION SET NLS_DATE_FORMAT = 'dd-mm-yyyy';。但是,将DATE值转换为DATE值是一种愚蠢且无用的想法。