在oracle where子句中,字符串到时间戳在没有显式转换的情况下如何工作



以下两个SQL都在我的Oracle数据库中工作,结果或结果计数完全相同且正确。CREATE_TIME是一个时间戳列。

select * from EMPLOYEE where CREATE_TIME =(or >) '2022-01-21 2:49:38.251'
select * from EMPLOYEE where CREATE_TIME =(or >) '22-01-21 2:49:38.251000'

我很好奇它是如何工作的,因为String格式不同,我没有使用TO_*转换函数,Oracle NLS(作为默认转换规则(显示完全不同的格式。

PARAMETER -> VALUE
NLS_TIMESTAMP_TZ_FORMAT -> DD-MON-RR HH.MI.SSXFF AM TZR
NLS_TIME_TZ_FORMAT -> HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_FORMAT -> DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_FORMAT -> HH.MI.SSXFF AM

搜索了信息但没有找到答案,如果有人能回答我并提供信息/文档链接供参考,我们将不胜感激。

如果您尝试使用CAST(value AS TIMESTAMP)或等效的隐式强制转换(如在查询中(从字符串值到时间戳执行显式强制转换,则Oracle将隐式转换为等效的:

TO_TIMESTAMP(
value,
(SELECT value FROM NLS_SESSION_PARAMETERS WHERE parameter = 'NLS_TIMESTAMP_FORMAT')
)

如果您有样本数据:

CREATE TABLE table_name (value) AS
SELECT '2022-01-21 2:49:38.251'  FROM DUAL UNION ALL
SELECT '22-01-21 2:49:38.251000' FROM DUAL;

你可以使用看到它的作用

ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'DD-MON-RR HH24.MI.SSXFF';
SELECT value,
TO_CHAR(
CAST(value AS TIMESTAMP),
'YYYY-MM-DD HH24:MI:SS.FF'
) AS converted_value
FROM   table_name;

输出错误:

ORA-01843: not a valid month

As,给定字符串到日期的转换规则,MON格式模型也将匹配MONTH,但它将不匹配数字MM格式,因此01月份会生成错误。

但是:

ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'RR-MM-DD HH24:MI:SSXFF'
SELECT value,
TO_CHAR(
CAST(value AS TIMESTAMP),
'YYYY-MM-DD HH24:MI:SS.FF'
) AS converted_value
FROM   table_name;

输出:

VALUECONVERTED_VALUE
2022-01-21 2:49:38.2512022-02:49:38.251000
22-01-21 2:49:38.2510002022-01-21 02:49:38.251000

最新更新