繁体   English   中英

使用to_timestamp在SQL中的日期之间进行比较

[英]Comparison between dates in SQL using to_timestamp

必须比较两个日期,一个是MM / DD / YYYY格式,另一个是YYYY / MM / DD HH:MI:SS。

如何才能做到这一点。 我尝试使用to_timestamp,但它抛出类似以下错误:

  AND TO_TIMESTAMP(PAYMENT_DATE,'MM/DD/YYYY HH:MI:SS')>=TO_TIMESTAMP( :L_RESEND_DATE,'YYYY/MM/DD HH:MI:SS')

[错误]执行(23:27):ORA-01843:无效月份

由于payment_date已经是date类型,因此您不需要也不应进行转换。 您正在根据您的NLS设置进行从datevarchar2的隐式转换,然后使用指定的格式模型进行显式转换,正如a_horse_with_no_name所说的那样,这毫无意义而且容易出错。 因此,您实际上在做:

TO_TIMESTAMP(TO_CHAR(PAYMENT_DATE, <NLS_DATE_FORMAT>),'MM/DD/YYYY HH:MI:SS')

例如,如果会话的NLS_DATE_FORMAT为DD / MM / YYYY,则表示您正在执行以下操作:

TO_TIMESTAMP(TO_CHAR(PAYMENT_DATE, 'DD/MM/YYYY'),'MM/DD/YYYY HH:MI:SS')

...并尝试交换月份和日期编号,这可以解释您的错误。 如果您的天数大于12,则双精度转换将出错,并且即使没有错误抛出,其他值也将不正确。

根本不需要转换表列,只需转换参数即可:

AND PAYMENT_DATE >= TO_DATE(:L_RESEND_DATE, 'YYYY/MM/DD HH24:MI:SS')

我使用了to_date()而不是to_timestamp()因为它最终与列的数据类型匹配(并允许使用该列上的任何索引),并且您不需要时间戳允许的小数秒精度; 由于您没有AM / PM指示灯, HH24我也将HH更改为HH24


现在正在将datedate进行比较。 这在这里无关紧要,因为您不需要额外的精度,但是如果您确实想要将date转换为timestamp ,则不需要中间的varchar2值,则可以使用CAST(PAYMENT_DATE AS TIMESTAMP) 该值 CAST(PAYMENT_DATE AS TIMESTAMP)

以下内容非常适用:

SELECT 1 FROM DUAL
 WHERE TO_TIMESTAMP('11/23/2014 10:32:15','MM/DD/YYYY HH:MI:SS')
       >=
       TO_TIMESTAMP( '2013/11/29 12:54:12','YYYY/MM/DD HH:MI:SS');

因此解决方案很简单-您的数据很可能是错误的...您的某些日期很可能是DD / MM / YYYY或YYYY / DD / MM-如果有疑问,请相信错误消息,这是非常准确而明确的-您的月值超出范围;-)

也许尝试SELECT * FROM ... WHERE TO_NUMBER(SUBSTR(PAYMENT_DATE,1,2)) > 12; 或者以其他方式对您的绑定变量执行类似操作,以查找错误的日期...

哦, 总是以日期或ISO格式存储日期XKCD

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM