sql - 错误 ORA-01841:(完整)年份必须在 -4713 和 +9999 之间,并且在使用 yyyymmdd 格式加载数据时不能为 0
问题描述
下面的语句在11-Jan-2019
我们检查 paydate 的值时抛出一个错误,20190111
并且它从源头上是正确的。但是,代码仍然会引发错误。
ORA-01841: (完整)年份必须介于 -4713 和 +9999 之间,而不是 0
INSERT INTO <New_TABLE_NAME>
SELECT *
FROM <old_table_name>
WHERE paydate =TO_DATE(e_paydate,'YYYYMMDD');
解决方案
TO_DATE( date_string, format_model )
将字符串作为其第一个参数。假设paydate
是一种DATE
数据类型,那么您要求 Oracle 将paydate
a隐式转换DATE
为字符串(将使用NLS_DATE_FORMAT
session 参数),然后将其传递给TO_DATE
函数以将其转换回日期。
因此,您的查询实际上是:
SELECT *
FROM <old_table_name>
WHERE paydate =TO_DATE(
TO_CHAR(
paydate,
( SELECT value FROM NLS_SESSION_PARAMETERS WHERE parameter = 'NLS_DATE_FORMAT' )
),
'YYYYMMDD'
);
如果NLS_DATE_FORMAT
不匹配YYYYMMDD
,那么您将获得异常或意外行为。
相反,如果您想将日期与自身进行比较并确定其时间部分是否在午夜,则只需使用TRUNC
:
SELECT *
FROM <old_table_name>
WHERE paydate = TRUNC( paydate );
推荐阅读
- python - 如何精确匹配时间戳中的一个冒号并将其转换为句点?
- javascript - 这个意想不到的输出是怎么来的?
- excel - Excel - 使用 SUMIF/INDEX/MATCH 将数周合并为数月
- azure-devops - 在 ARM 模板中管理复杂的 SQL 查询
- julia - Julia SymPy.det(M) 不起作用,但 SymPy.det([M[1] M[2]; M[3] M[4]]) 起作用
- javascript - 如何通过多个相同的属性过滤对象数组
- text-parsing - 在python中删除以octothorpe开头的列表元素会省略一些元素
- r - R plot:如何正确调整挑剔的边距?
- c++ - 概念并没有像预期的那样解决歧义。代码示例有什么问题?
- python - pivottable.js display 引入了源 pandas Dataframe 中不存在的 NULL 值