铸造varchar 2日期格式'mm / dd / yyyy hh24:mi'时最后一天掉线

时间:2015-02-04 19:49:26

标签: sql oracle oracle11g

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

我使用了以下查询&我知道2014年3月31日的一些日期会被遗漏。

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

请同样建议。感谢。

4 个答案:

答案 0 :(得分:2)

我认为您的VARCHAR2"日期"有时间成分,在这种情况下,它们可能在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'

答案 1 :(得分:2)

当然,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与日期一起使用,正是因为这类问题。

答案 2 :(得分:1)

您获取的记录包括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'

答案 3 :(得分:1)

首先,永远不要在文本字段中存储日期(即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”即可移至第二天,您将获得所有记录“4月1日之前”,这就是您想要的......任何时间,3月31日。