您不能将零年与to_date('0000-01-01', 'YYYY-MM-DD') 一起使用,但奇怪的是您可以与日期文字date '0000-01-01' 一起使用。其本身成为-1年,但您可以使用它进行计算;您也可以根据您的数值添加一个间隔,例如:
SELECT DATE '0000-01-01' + NUMTOYMINTERVAL(my_year, 'YEAR') AS my_date
FROM my_table;
numtoyminterval function 如果参数为 null,则返回 null,将其添加到固定日期也会为您返回 null:
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
Gordon Linoff 的案例方法更加稳健,但如果您只是真正处理“理智”积极的年份,这可能会奏效。如果没有,那就有点意思了……