无法将日期和varchar转换为Oracle db

时间:2017-09-29 14:29:48

标签: sql oracle date oracle11g varchar

我有以下查询:

SELECT TO_DATE(date || ' ' || time, 'DD-MON-YY HH24:MI:SS' ) FROM table;

dateDATE

timeVARCHAR2(4000 CHAR)

执行查询后,我得到的27-OCT-16没有时间而不是27-OCT-16 14:26:09

有没有解决方案?

1 个答案:

答案 0 :(得分:4)

[TL; DR] 您的日期有一个时间组件,但您依赖于隐式字符串转换,默认格式模型(可能是DD-MON-YY)不显示时间组件。< / p>

您的查询:

SELECT TO_DATE( date || ' ' || time, 'DD-MON-YY HH24:MI:SS' )
FROM   table;

DATE没有格式;它在内部存储为7-bytes,它是您用来访问数据库的客户端程序,它将自己的格式应用于日期(通常可以通过该程序中的首选项设置)。

对于SQL / Plus和SQL开发人员,这通常是NLS_DATE_FORMAT会话参数。您可以在其中找到使用查询的格式:

SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT'

尝试将DATE与字符串连接将隐式地将日期转换为字符串,并且查询等效于:

SELECT TO_DATE(
         TO_CHAR(
           date,
           ( SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT' )
         )
         || time,
         'DD-MON-YY HH24:MI:SS'
       )
FROM   table

然后第二次隐式转换为客户端程序可以显示的内容将使您的查询等效于:

SELECT TO_CHAR(
         TO_DATE(
           TO_CHAR(
             date,
             (SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT')
           )
           || time,
           'DD-MON-YY HH24:MI:SS'
         ),
         (SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT')
       )
FROM   table

我猜你的NLS_DATE_FORMATDD-MON-YY(或DD-MON-YYYY) - 否则初始转化会失败,而且没有时间组件,因此用户界面的转换是日期回到字符串也不包括时间组件。

如果您希望DATE使用特定格式,请使用TO_CHAR进行展示。

SELECT TO_CHAR(
         TO_DATE(
           TO_CHAR( date, 'DD-MON-YYYY' ) || ' ' || time,
           'DD-MON-YYYY HH24:MI:SS'
         ),
         'DD-MON-YYYY HH24:MI:SS'
       )
FROM   table;

或者您可以alter the session variable(但这可能会破坏您的初始隐式字符串转换)所以,不要这样做,只需将所有隐式字符串转换更改为显式转换并指定格式模型即可正在使用。