以下两个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;
输出:
VALUE CONVERTED_VALUE 2022-01-21 2:49:38.251 2022-02:49:38.251000 22-01-21 2:49:38.251000 2022-01-21 02:49:38.251000