2011-03-30 75 views
0

的對應日曆日我有一個SQL(DB2)語句以下獸......計算往年

select ((date(days(date(cast(year('2012-03-28')-6 as char(4))|| '-01-01')) -(dayofweek(date(cast(year('2012-03-28')-6 as char(4))|| '-01-01'))-1))+7 days)+(((week('2012-03-28')-2)* 7)+dayofweek('2012-03-28')-1) days) AS CAL_COMP_DATE 
from sysibm.sysdummy1 

以週三,2012-03-28,將返回的輸入日期星期三, 2006-03-29。注意它與星期四相匹配。它與前幾年的相應日曆日相匹配。

在C#或VB.NET中是否有更完美的方式來實現相同的目標?我試過把這個查詢翻譯成VB.NET,但一直沒有做到這一點,它看起來很可怕,不可維護。

+0

就像丹尼爾說的,你沒有提供所有必要的邏輯。你想根據日曆年的第n個星期三進行匹配嗎?或輪到最近的同一個工作日或其他規則?你可以修改他提供的任何內容。 – nycdan 2011-03-30 17:11:51

回答

3

我不完全理解找到那一天的規則。但你可以沿着這些線路使用一些東西:

var originalDate = new DateTime(2012,03,28); 
var newDate = originalDate.AddYears(-6); 
var daysToAdd = originalDate.DayOfWeek - newDate.DayOfWeek; 
if(daysToAdd < -3) 
    daysToAdd += 7; 
if(daysToAdd > 3) 
    daysToAdd -= 7; 
newDate = newDate.AddDays(daysToAdd); 

這總是向相同的DayOfWeek輪到最近的一天。

+1

'-5',但是對輸出應該是非常困惑。 – 2011-03-30 17:06:44

+0

'-4'是故意的,因爲2012-03-28和2007-03-28有同樣的DayOfWeek,所以我不能真正測試我的邏輯減去天數:-) – 2011-03-30 17:08:36

+0

這似乎工作到目前爲止.. 。我一直測試到2016年。會有什麼奇怪的「陷阱」閏年或什麼? – TaylorOtwell 2011-03-30 17:12:57