【问题标题】:oracle to_date returns some error in custom queryoracle to_date 在自定义查询中返回一些错误
【发布时间】:2016-10-27 01:27:06
【问题描述】:

Oracle 数据库

START_DATE          |END_DATE           
--------------------|-------------------
2016-02-01 00:00:00 |2016-02-29 23:55:00
2016-02-01 00:00:00 |2016-02-29 23:55:00
2016-02-01 00:00:00 |2016-02-29 23:55:00
2016-02-01 00:00:00 |2016-02-29 23:55:00
2016-02-01 00:00:00 |2016-02-29 23:55:00

查询

`select * from  VM_REPORT_TEMP_US where to_date(START_DATE,'YYYY-MM-DD HH24:MI:SS') >= '2016-02-01 00:00:00' AND to_date(END_DATE,'YYYY-MM-DD HH24:MI:SS') <= '2016-`02-24 24:59:00'`

我正在尝试运行此查询,但我遇到了一些错误。有人可以知道我在这个查询中要去哪里吗?

我收到以下错误

SQL 错误 [1861] [22008]:ORA-01861:文字与格式字符串不匹配

java.sql.SQLDataException: ORA-01861: 文字与格式字符串不匹配

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    to_date()DATE 列一起使用。这首先将date 值转换为varchar 值,只是为了将其转换回最初的date

    to_date() 需要 varchar 值,因此 Oracle 首先使用当前 NLS 设置将 DATE 值转换为 varchar 值。然后它会尝试使用您提供的格式掩码将varchar 转换回日期,该格式掩码很可能与您拥有的默认 NLS 格式不匹配,因此您会收到错误消息。

    您还应该在条件中使用正确的日期值,而不是根据当前 NLS 设置(再次)隐式转换为 DATE 的字符串:

    select * 
    from VM_REPORT_TEMP_US 
    where START_DATE >= timestamp '2016-02-01 00:00:00' 
      AND END_DATE <= timestamp '2016-02-24 23:59:00'
    

    请注意,小时 24 在 ISO 时间戳文字中是无效的。

    如果您想以 ISO 格式以外的格式提供日期/时间戳值,则需要使用 to_date() 来表示:

    select * 
    from VM_REPORT_TEMP_US 
    where START_DATE >= to_date('01.02.2016 00:00:00', 'dd.mm.yyyy hh24:mi:ss') 
      AND END_DATE <= to_date('24.02.2016 23:59:59', 'dd.mm.yyyy hh24:mi:ss') 
    

    【讨论】:

    • 它会返回一些像这样的错误SQL Error [933] [42000]: ORA-00933: SQL command not properly ended java.sql.SQLSyntaxErrorException: ORA-00933: SQL command not properly ended
    • 很好地解释了 OP 查询中发生的事情。当您发布您的答案时,我正准备将其添加到我的答案中:-)
    • 我也没有发现 24 小时。
    【解决方案2】:

    start_dateend_date 已经是日期,因此您不必将它们转换为日期。转换字符串,甚至更好地使用日期时间文字。

    select * 
    from  VM_REPORT_TEMP_US 
    where START_DATE >= timestamp '2016-02-01 00:00:00' 
    and END_DATE <= timestamp '2016-02-24 00:59:00'
    

    【讨论】:

      【解决方案3】:

      与上述两个答案有点不同,但这是我用来避免YYYY-MM-DDYYYY-DD-MM 之间混淆的方法。

      select * from  VM_REPORT_TEMP_US 
      where 
      START_DATE >= to_date('2016-02-01 00:00:00','YYYY-MM-DD HH24:MI:SS')
      AND 
      END_DATE   <= to_date('2016-02-24 00:59:00','YYYY-MM-DD HH24:MI:SS')
      

      【讨论】:

        猜你喜欢
        • 2019-12-14
        • 2020-09-02
        • 2014-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-26
        相关资源
        最近更新 更多