我在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'
请同样建议。感谢。
答案 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日。