代码之家  ›  专栏  ›  技术社区  ›  Oleksandr Stefanovskyi Adam

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

  •  0
  • Oleksandr Stefanovskyi Adam  · 技术社区  · 7 年前

    我有以下疑问:

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

    date DATE

    time VARCHAR2(4000 CHAR)

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

    有什么解决办法吗?

    1 回复  |  直到 7 年前
        1
  •  4
  •   MT0    7 年前

    [TL;DR] DD-MON-YY )不显示时间组件。


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

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

    对于SQL/Plus和SQL developer,这通常是 NLS_DATE_FORMAT 会话参数。您可以找到使用查询的格式:

    SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT'
    

    日期 将日期隐式转换为字符串,查询等价于:

    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\u DATE\u格式 DD-MON-YY DD-MON-YYYY )-否则,初始转换将失败,并且没有时间组件,因此UI从日期到字符串的转换也不包括时间组件。

    如果你想要 使用特定格式,然后只需使用 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 (但这可能会破坏您最初的隐式字符串转换)因此,不要这样做,只需将所有隐式字符串转换更改为显式转换,并指定您正在使用的格式模型。