Oracle SQL-如何比较日期
我一般不熟悉SQL,尤其是Oracle 我创建了一组日期=>日期由日期(I) 我有一个表表,其中列为日期和收入 当我提出质询时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
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
和collectiondate
的数据类型是什么?四位年份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)