2016-07-27 61 views
1

我有一個以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中?

+1

你爲什麼要存儲日期爲'varchar'? –

+1

嘿 - 我編輯了你的最後一個問題,MsSQL很混亂(至少有一個志願者誤解爲MySQL)。 – mathguy

+0

你(或者說,商業客戶)需要澄清閏年。如果輸入日期是FEB-29-2016,應該返回什麼? FEB-28-2017或FEB-27-2016?另外,如果輸入是FEB-28-2015,輸出應該是FEB-27-2016還是FEB-28-2016?在這兩種情況下,'add_months()'可能不會返回所需的結果。 ('add_months()'是這類問題最自然的工具)。 – mathguy

回答

1

你會做:

select to_char(add_months(to_date(mydatefield, 'YYYY-MM-DD') - 1, 12), 'YYYY-MM-DD') 

,讓你的前一天,提前一年。 - 1basic 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()函數是非標準的,但更寬容;儘管你仍然需要了解它會爲邊緣案例做些什麼。

+1

OP說「之前」意味着你應該減去1天,而不是添加它。奇怪的是,迄今爲止提供的所有三個答案都做同樣的事情......真的很奇怪...... – mathguy

+0

@mathguy - 是的,但OP顯示的代碼使用date_add和+1日期和年度間隔,至少在第一個修訂,所以不清楚哪一個是正確的。這就是爲什麼我提到這個問題,並且有兩個例子。我沒有看到他們已經編輯來糾正這一點。 –

+1

我明白了 - 我只是看着編輯的歷史,而OP則通過添加一個減號來改變他的原始文章。原來並不存在。這解釋了它。 – mathguy

1

試試這個

select mydatefield, 
     add_months(date_add(to_date(mydatefield,'YYYY-MM-DD')),12)+1 from mytable 
1

甲骨文:

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;