最后一天在转换 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 日。
我在 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 日。