最后一天在转换 varchar 2 日期格式时被删除 'mm/dd/yyyy hh24:mi'

Last day getting dropped while casting varchar 2 date format 'mm/dd/yyyy hh24:mi'

我在 oracle table.Now 中有一个格式 'MM/DD/YYYY HH24:MI' 的 varchar2 日期字段 'Created_Date',我想要日期范围在 1-JAN-2014 到 31 之间的所有字段-2014 年 3 月。

我使用了以下查询并且我知道我错过了 2014 年 3 月 31 日的一些日期。

Select * 
from Table1
where to_date(Created_Date, 'MM/DD/YYYY HH24:MI') between '1-JAN-2014' and '31-MAR-2014'

请提出相同的建议。谢谢

我认为正在发生的事情是您的 VARCHAR2 "dates" 有时间成分,在这种情况下它们可能会在 2014 年 3 月 31 日之后下降。我建议您执行以下操作:

SELECT * FROM table1
 WHERE TO_DATE(created_date, 'MM/DD/YYYY HH24:MI') >= '01-JAN-2014'
   AND TO_DATE(created_date, 'MM/DD/YYYY HH24:MI') < '01-APR-2014'

当然不会显示 3 月 31 日的日期——如果它们有时间部分的话。通过使用 between,您只能在 3 月 31 日开始时起床到午夜。这就是日期和日期之间的工作方式。

这里有两种解决方法。首先,只使用日期:

where to_date(Created_Date, 'MM/DD/YYYY') between date '2014-01-01' and date '2014-03-31'

或者换一种说法:

where to_date(Created_Date, 'MM/DD/YYYY HH24:MI') >= date '2014-01-01' and
      to_date(Created_Date, 'MM/DD/YYYY HH24:MI') < date '2014-04-01'

请注意,我还从使用字符串常量切换到了 date 运算符。此关键字允许您提供 ISO 标准 YYYY-MM-DD 格式的日期常量。

我的偏好是这两种方法的结合:

where to_date(Created_Date, 'MM/DD/YYYY') >= date '2014-01-01' and
      to_date(Created_Date, 'MM/DD/YYYY') < date '2014-04-01'

一般来说,我尽量避免将 between 与日期一起使用,正是因为这类问题。

您正在获取截至并包括 31-MAR-2014 00:00 的记录,但您还想包括最后一天的所有时间。

获取截至(但不包括)00:00 次日的记录:

where to_date(Created_Date, 'MM/DD/YYYY HH24:MI') >= '1-JAN-2014' and
  to_date(Created_Date, 'MM/DD/YYYY HH24:MI') < '1-APR-2014'

首先,永远不要在文本字段(即 varchar2)中存储日期,那只会自找麻烦。

无论如何,它不会选择 2014 年 3 月 31 日,因为所有日期都有时间部分。

您的实际数据有一些时间,假设是 3 月 31 日上午 10 点。 然后,您要求它检索小于 2014 年 3 月 31 日的所有项目。没有时间成分,因此它假定为“00:00:00”或午夜。

因为上午 10 点是午夜后 10 小时...不早。

你可能想要:

  Select * 
  from Table1
  where to_date(Created_Date, 'MM/DD/YYYY HH24:MI') 
        between to_date('01-JAN-2014','dd-mon-yyyy')
             and to_date('31-MAR-2014','dd-mon-yyyy')+1;

始终自己转换为日期,永远不要依赖隐式转换。 然后只需“+1”移动到第二天,您将获得所有记录 "Prior to Apr 1",这就是您想要的...任何时间,3 月 31 日。