oracle table 中的年份值
year value in table in oracle
我在 oracle 中有这个查询:
DELETE FROM my_table
WHERE to_date(last_update, 'DD/MM/YYYY') < to_date('01/01/2000', 'DD/MM/YYYY');
当我 运行 这个时,我得到这个错误:
ORA-01841: (完整) 年份必须在 -4713 和 +9999 之间并且不能是 0
table 中没有任何 0 值。
谁知道是什么问题?
我假设您已将日期存储为 DD/MM/YYYY
格式的字符串;如果您将它们全部存储为 DATE
数据类型会更好,这样您就不必进行此转换(并且您将为数据使用最合适的数据类型)。
从 Oracle 12 开始,您可以使用:
SELECT *
FROM my_table
WHERE TO_DATE( last_update, 'DD/MM/YYYY' DEFAULT NULL ON CONVERSION ERROR ) IS NULL;
确定引发该异常的行。
如果您已经将它们存储为 DATE
数据类型,那么不要在已经是 DATE
的值上使用 TO_DATE
,因为 TO_DATE
期望string 因此 Oracle 会将您的 DATE
隐式转换为字符串,然后尝试将其转换回来,您的查询有效:
DELETE FROM my_table
WHERE TO_DATE(
TO_CHAR(
last_update,
( SELECT value FROM NLS_SESSION_SETTINGS WHERE PARAMETER = 'NLS_DATE_FORMAT' )
),
'DD/MM/YYYY'
) < to_date('01/01/2000', 'DD/MM/YYYY');
如果 NLS_DATE_FORMAT
和你的格式模型不匹配,那么你会得到错误(或者,更糟的是,查询会成功并且你的数据会不一致,因为它可能已经交换了几天和几个月或几个月和年)。
相反,只需使用:
DELETE FROM my_table
WHERE last_update < DATE '2000-01-01';
如果last_update的数据类型是日期,不要使用to_date函数:
DELETE FROM my_table
WHERE last_update < to_date('01/01/2000', 'DD/MM/YYYY');
我在 oracle 中有这个查询:
DELETE FROM my_table
WHERE to_date(last_update, 'DD/MM/YYYY') < to_date('01/01/2000', 'DD/MM/YYYY');
当我 运行 这个时,我得到这个错误: ORA-01841: (完整) 年份必须在 -4713 和 +9999 之间并且不能是 0
table 中没有任何 0 值。
谁知道是什么问题?
我假设您已将日期存储为 DD/MM/YYYY
格式的字符串;如果您将它们全部存储为 DATE
数据类型会更好,这样您就不必进行此转换(并且您将为数据使用最合适的数据类型)。
从 Oracle 12 开始,您可以使用:
SELECT *
FROM my_table
WHERE TO_DATE( last_update, 'DD/MM/YYYY' DEFAULT NULL ON CONVERSION ERROR ) IS NULL;
确定引发该异常的行。
如果您已经将它们存储为 DATE
数据类型,那么不要在已经是 DATE
的值上使用 TO_DATE
,因为 TO_DATE
期望string 因此 Oracle 会将您的 DATE
隐式转换为字符串,然后尝试将其转换回来,您的查询有效:
DELETE FROM my_table
WHERE TO_DATE(
TO_CHAR(
last_update,
( SELECT value FROM NLS_SESSION_SETTINGS WHERE PARAMETER = 'NLS_DATE_FORMAT' )
),
'DD/MM/YYYY'
) < to_date('01/01/2000', 'DD/MM/YYYY');
如果 NLS_DATE_FORMAT
和你的格式模型不匹配,那么你会得到错误(或者,更糟的是,查询会成功并且你的数据会不一致,因为它可能已经交换了几天和几个月或几个月和年)。
相反,只需使用:
DELETE FROM my_table
WHERE last_update < DATE '2000-01-01';
如果last_update的数据类型是日期,不要使用to_date函数:
DELETE FROM my_table
WHERE last_update < to_date('01/01/2000', 'DD/MM/YYYY');