2012-09-18 234 views
0

我有這個公式在我的專欄來計算某一週的開始日期:獲得周第一天(星期日)

dateadd(week,[Week]-(1), 
dateadd(day,(-1), 
    dateadd(week, 
    datediff(week,(0), 
    CONVERT([varchar](4),[Year],(0))+'-01-01'), 
    (1)))) 

WeekYear其他領域,如382012

問題是,它計算星期一(17日)的星期38/2012的開始日期,我希望它是一個星期日(9月16日),這可能嗎?

非常感謝。

+0

爲什麼DATEADD(日,( - 2)是不是在這種情況下,良好有了這個,你會得到永遠星期日作爲一週的開始 –

+0

@AndrásOttó這似乎是最簡單的變化,但本週1/2011?最終顯示爲26/12/2010 ...而不是02/01/2011 – sprocket12

+0

從我的答案中刪除SELECT和FROM ..是否給出相同的計算字段? – RichardTheKiwi

回答

0

如果你希望星期的第一天是星期天,你可以使用DATEFIRST setting來改變你的數據庫。

+1

它不一定非常脆弱。 DATEFIRST的設置是相當簡單的。 – RichardTheKiwi

+0

DATEFIRST在計算區域?(對不起,我忘了提及上面的公式是在計算區域) – sprocket12

1

假設一週的第一天是星期天,這將返回給您一週中的第一天,給定一週數和一年。
適用標準排除,例如不要試圖一年1499

declare @tbl table ([Week] int, [Year] int) 
insert @tbl select 38,2012 
    union all select 1,2012 
    union all select 0,2012 
    union all select 1,2013 

select DATEADD(
    Week, 
    [Week]-1, 
    DATEADD(
     Day, 
     ([email protected]@datefirst)-DATEPART(dw, CAST([Year]*10000+101 AS VARCHAR(8))), 
     CAST([Year]*10000+101 AS VARCHAR(8)))) 
from @TBL 

結果

2012-09-16 00:00:00.000 
2012-01-01 00:00:00.000 
2011-12-25 00:00:00.000 
2012-12-30 00:00:00.000 

注意,週數從1開始,如果本週不啓動星期日,那麼這一週的第一天可能會在更早的一年結束(第4行)。因爲周是相對的,你可以使用第0周,-1等,它仍然會給你一個結果(第3行),無論是對還是錯。

您可能還注意到我使用了不同的方法創建了一年中的日期,只是作爲替代方法。


查詢的 ([email protected]@datefirst)部分使其健全,無論您的 DATEFIRST設置如何。

+0

爲什麼不使用'(1 - @@ DATEFIRST)'並且刪除'-1' '[周] -1'? – Johan

0
function getFirstDateOfThisWeek(d) 
    { 
     var TempDate = new Date(d || new Date());    
     TempDate.setDate(TempDate.getDate() + (@Config.WeekStartOn - 1 - TempDate.getDay() - 7) % 7);    
     return TempDate; 
    } 

    var StartDate = getFirstDateOfThisWeek(new Date()); //1st date of this week 
相關問題