'01-JAN-1901' 不是时间戳,它是一个字符串。
不要插入字符串;使用日期文字(它将被转换为时间戳):
Insert into GTT_A values (DATE '1901-01-01');
如果您想包含时间组件,则为时间戳文字:
Insert into GTT_A values (TIMESTAMP '1901-01-01 00:00:00');
或者,如果您想使用字符串,则使用带有格式模型的TO_DATE 将字符串显式转换为日期:
Insert into GTT_A values (
TO_DATE(
'01-JAN-1901',
'DD-MON-YYYY',
'NLS_DATE_LANGUAGE=AMERICAN'
)
);
或TO_TIMESTAMP:
Insert into GTT_A values (
TO_TIMESTAMP(
'01-JAN-1901',
'DD-MON-YYYY',
'NLS_DATE_LANGUAGE=AMERICAN'
)
);
如果您依赖隐式转换,那么 Oracle 将尝试将您的字符串隐式转换为日期和您的查询:
Insert into GTT_A values ('01-JAN-1901');
有效地转换为:
Insert into GTT_A values (
TO_TIMESTAMP(
'01-JAN-1901',
( SELECT value
FROM NLS_SESSION_PARAMETERS
WHERE parameter = 'NLS_TIMESTAMP_FORMAT' )
)
);
每个用户都可以在任何时间设置自己的会话参数,这样您的查询可以运行一分钟,然后用户更新他们的会话参数,您的查询将停止工作,而无需更改您的查询。不要依赖隐式转换;做到这一点,您就不需要使用日期/时间戳文字或使用显式转换来转换任何内容。