oracle to_date在自定义查询中返回一些错误

时间:2016-06-24 12:12:05

标签: sql oracle

Oracle DB

*** Variables ***
@{device_list}    one  two  three  four
${device}         two

*** Keywords ***
Do something
    log    do something was called

Do something else
    log    do something else was called

*** Test Cases ***
Example
    run keyword if    $device in $device_list
    ...  Run keywords
    ...  Do something
    ...  AND
    ...  Do something else

查询

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

我试图运行此查询,但我得到一些错误。有人可以知道我在这个查询中的位置吗?

我得到以下错误

  

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

     

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

3 个答案:

答案 0 :(得分:2)

start_dateend_date已经是日期,因此您无需将其转换为日期。改为转换字符串,甚至更好地使用datetime文字。

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'

答案 1 :(得分:2)

使用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') 

答案 2 :(得分:1)

与上述两个答案都有所不同,但我会用它来避免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')