Oracle SQL-如何比较日期

Oracle SQL-如何比较日期,sql,oracle,date,comparison,Sql,Oracle,Date,Comparison,我一般不熟悉SQL,尤其是Oracle 我创建了一组日期=>日期由日期(I) 我有一个表表,其中列为日期和收入 当我提出质询时 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_dat

我一般不熟悉SQL,尤其是Oracle

我创建了一组日期=>日期由日期(I)

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

当我提出质询时

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')
不同的故事=>我收到空值

只有


从表中选择sum(revenue),其中date>=date(i)和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-rrrrr”掩码,它会将字符串01-01-15转换为01-01-2015,您的查询可能会返回一些信息。我不知道,这取决于您收藏的日期。

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

因此,当你将“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)

(我认为日期(I)没有时间)。

为什么要将
date
值转换为
date

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

  • 日期值
    Date(i)
    使用当前的
    NLS\u Date\u格式
    隐式转换为字符串

  • 然后使用格式
    dd-mm-yyyy

  • 因此,如果碰巧您当前的
    NLS\u DATE\u格式
    等于
    dd-mm-yyyy
    ,则您的查询将正常工作


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

    默认格式为yyyy-mm-dd,因此当您转换它时,您会得到一个不同的结果更多问题-当我进行查询,然后在输出中看到结果时,日期显示为“dd-mm-yyyy”。这令人困惑。因此,默认的处理格式是“yyyy-mm-dd”,但默认的显示格式可以不同。我说得对吗?@所以准备帮助Thx,它帮助您在运行
    从表中选择日期时获得差异,其中date>=date(I)和date列
    date
    和collection
    date
    的数据类型是什么?四位年份
    yyyy
    格式是四位年份格式
    rrrr
    也只接受两个值,但情况似乎并非如此。
    to_date(to_date(..)
    毫无意义。我只是解释为什么他在一个查询中没有得到任何结果,因为这是他问的问题。当然,那是不必要的。投票前你们看过我的答案了吗?我认为这可能与他使用的格式掩码有关。让他决定是不是这样。好吧,你说:“它可能会工作得很好”,然后重复那无用的
    to_date(to_date())
    调用。将
    的格式更改为_date()
    不会“修复”从日期到varchar的错误(隐式)转换回日期(我没有否决投票)到_日期(to _date())的错误(隐式)转换,当然是没有用的。但他正在研究约会是如何进行的,他没有面临真正的问题。这就是为什么他要做那个无用的转换,我只是说用那个面具可能会有用,因为它对我有用。如果他的隐式面具有2年的数字,rrrr面具就会起作用。这是正确的答案,否决票是不合理的
    select sum(revenue) from table where trunc(date) between date(i) and date(i+1)