你不能使用零年to_date('0000-01-01', 'YYYY-MM-DD')
,但奇怪的是,你可以用日期文字date '0000-01-01'
。在它自己变成第一年,但你可以使用它的计算;您可以添加的时间间隔也可以根据您的数值,例如:如果参数为空,
SELECT DATE '0000-01-01' + NUMTOYMINTERVAL(my_year, 'YEAR') AS my_date
FROM my_table;
的numtoyminterval
function返回空还说到一个固定的日期也给你空:
alter session set nls_date_format = 'SYYYY-MM-DD';
select date '0000-01-01' + numtoyminterval(null, 'YEAR') from dual;
DATE'0000-01-01'+NUMTOYMINTERVAL(NULL,'YEAR')
---------------------------------------------
select date '0000-01-01' + numtoyminterval(2015, 'YEAR') from dual;
DATE'0000-01-01'+NUMTOYMINTERVAL(2015,'YEAR')
---------------------------------------------
2015-01-01
select date '0000-01-01' + numtoyminterval(9999, 'YEAR') from dual;
DATE'0000-01-01'+NUMTOYMINTERVAL(9999,'YEAR')
---------------------------------------------
9999-01-01
select date '0000-01-01' + numtoyminterval(-4712, 'YEAR') from dual;
DATE'0000-01-01'+NUMTOYMINTERVAL(-4712,'YEAR')
----------------------------------------------
-4712-01-01
这并非万无一失;它仍然会错误,如果你尝试-4713之前去:
select date '0000-01-01' + numtoyminterval(-4713, 'YEAR') from dual;
SQL Error: ORA-01841: (full) year must be between -4713 and +9999, and not be 0
...
虽然你可以避免与列的检查约束。而由于今年的0到-1无声的翻译,你会得到同样的答案,如果你my_year
值为0或1:
select date '0000-01-01' + numtoyminterval(0, 'YEAR') from dual;
DATE'0000-01-01'+NUMTOYMINTERVAL(0,'YEAR')
------------------------------------------
-0001-01-01
select date '0000-01-01' + numtoyminterval(-1, 'YEAR') from dual;
DATE'0000-01-01'+NUMTOYMINTERVAL(-1,'YEAR')
-------------------------------------------
-0001-01-01
戈登·利诺夫的情况下的做法是更强大的,但如果你这可能工作”只有真正处理'理智'的正面年份。如果没有,这是有点有趣...
'my_year'的价值是什么? –
@AlexK。 - 任何适合'my_year NUMBER(4,0)NULL'列的东西,包括'NULL'。 –