你不能使用零年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'。 –