我有一個以yyyy-mm-dd格式包含日期的字符串字段。 現在,我想在一年後的那一天之前得到日期(首選爲nvarchar2)。在MySQL中,我可以這樣做:Oracle中的日期操作
select date_add(date_add(str_to_date(mydatefield,'%Y-%m-%d'),INTERVAL 1 YEAR),INTERVAL -1 DAY) from mytable
我該怎麼在Oracle中做到這一點?
而在SQL Server中?
我有一個以yyyy-mm-dd格式包含日期的字符串字段。 現在,我想在一年後的那一天之前得到日期(首選爲nvarchar2)。在MySQL中,我可以這樣做:Oracle中的日期操作
select date_add(date_add(str_to_date(mydatefield,'%Y-%m-%d'),INTERVAL 1 YEAR),INTERVAL -1 DAY) from mytable
我該怎麼在Oracle中做到這一點?
而在SQL Server中?
你會做:
select to_char(add_months(to_date(mydatefield, 'YYYY-MM-DD') - 1, 12), 'YYYY-MM-DD')
,讓你的前一天,提前一年。 - 1
是basic date arithmetic。這個add_months()
function帶你一年,因爲那是12個月。
將該字符串轉換爲to_date()
function的日期,並返回到使用to_char()
的字符串,兩者均使用合適的顯式date format models。
例如:
select to_char(add_months(to_date('2016-07-27', 'YYYY-MM-DD') - 1, 12), 'YYYY-MM-DD') from dual;
TO_CHAR(AD
----------
2017-07-26
select to_char(add_months(to_date('2016-03-01', 'YYYY-MM-DD') - 1, 12), 'YYYY-MM-DD') from dual;
TO_CHAR(AD
----------
2017-02-28
你可以使用的時間間隔,但也可以是尷尬;如果當前日期是2016年3月1日,減去一天的時間間隔並添加一年的時間間隔將給出2017-02-29,這是無效的,並會引發錯誤。或者如果是2016年2月29日,那麼首先增加一年會給予2017-02-29,並且在您將天移回28日之前會出錯。 add_months()
函數是非標準的,但更寬容;儘管你仍然需要了解它會爲邊緣案例做些什麼。
試試這個
select mydatefield,
add_months(date_add(to_date(mydatefield,'YYYY-MM-DD')),12)+1 from mytable
甲骨文:
SELECT Add_months(TO_DATE(mydatefield, 'YYYY/MM/DD'),12)+1
FROM mytable;
MSSQL:
SELECT DATEADD(day, 1,(DATEADD(year, 1,CONVERT(datetime, mydatefield,103))) as mydate from mytable;
你爲什麼要存儲日期爲'varchar'? –
嘿 - 我編輯了你的最後一個問題,MsSQL很混亂(至少有一個志願者誤解爲MySQL)。 – mathguy
你(或者說,商業客戶)需要澄清閏年。如果輸入日期是FEB-29-2016,應該返回什麼? FEB-28-2017或FEB-27-2016?另外,如果輸入是FEB-28-2015,輸出應該是FEB-27-2016還是FEB-28-2016?在這兩種情況下,'add_months()'可能不會返回所需的結果。 ('add_months()'是這類問題最自然的工具)。 – mathguy