无法在 Oracle 数据库中将日期和 varchar 转换为日期
Unable to convert date and varchar to date in Oracle db
我有以下查询:
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
。
有什么解决办法吗?
[TL;DR] 您的日期有时间部分,但您依赖于隐式字符串转换并且默认格式模型(可能 DD-MON-YY
)不显示时间分量。
您的查询:
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_FORMAT
是 DD-MON-YY
(或 DD-MON-YYYY
) - 否则初始转换将失败并且没有时间组件所以 UI' s 从日期到字符串的转换也不包括时间部分。
如果您想要 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(但这可能会破坏您最初的隐式字符串转换)所以,不要那样做,只需将所有隐式字符串转换更改为显式字符串转换并指定您的格式模型正在使用。
我有以下查询:
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
。
有什么解决办法吗?
[TL;DR] 您的日期有时间部分,但您依赖于隐式字符串转换并且默认格式模型(可能 DD-MON-YY
)不显示时间分量。
您的查询:
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_FORMAT
是 DD-MON-YY
(或 DD-MON-YYYY
) - 否则初始转换将失败并且没有时间组件所以 UI' s 从日期到字符串的转换也不包括时间部分。
如果您想要 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(但这可能会破坏您最初的隐式字符串转换)所以,不要那样做,只需将所有隐式字符串转换更改为显式字符串转换并指定您的格式模型正在使用。