2011-03-30 77 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