Oracle SQL - 如何比较日期

时间:2015-11-18 06:27:10

标签: sql oracle date comparison

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

我创建了一个日期=>的集合日期日期(i)

组成

我有一个表,其列日期收入

当我进行查询时

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)

不同的故事=&gt;我收到空值。

command = SCRIPT + " R > " + OUT_FILE + " 2>/dev/null &"
subprocess.call(command, shell=True)

while(True):
    if OUT_FILE is  modified
        do something on OUT_FILE

效果很好。

但为什么?

3 个答案:

答案 0 :(得分:2)

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

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

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

  2. 然后使用格式DATE

  3. 将此字符串转换回dd-mm-yyyy

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

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

答案 1 :(得分:0)

您的收藏中的变量已经是日期,您可以将它们再次转换为日期(这是您永远不应该做的事情)。将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')

如果您使用了&#39; dd-mm-rrrr&#39;相反,它会将字符串01-01-15转换为01-01-2015,您的查询可能会返回某些内容。我不知道,这取决于你收藏中的日期。

答案 2 :(得分:0)

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

所以当你比较&#34; 17-11-2015 07:15:00&#34;与&#34; 17-11-2015&#34;它不会是平等的。

这将说明在您的语句中返回的行数少于预期:

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)

(我认为那个日期(i)没有时间)。