按周计算日期

时间:2009-04-03 12:03:13

标签: sql-server vb.net datetime

我需要一年中特定周数的周开始日期和周结束日期(vb.net或SQL Server)

例如,如果weeknumber = 1和2009年,我应该得到:

的StartDate = 1 /二千○九分之一 结束日期= 1 /二千○九分之三

如果是weeknumber = 2和2009年,那么:

的StartDate = 1 /二千○九分之四 结束日期= 1 /二千〇九分之一十

实际上我通过在Query中使用datepart(wk,Date)获得周数,然后按周数分组。现在我需要分组的周数的开始日期和结束日期。

- Raheel

5 个答案:

答案 0 :(得分:2)

你在寻找这样的东西:

Dim day As DayOfWeek = DateTime.Now.DayOfWeek
Dim days As Integer = day - DayOfWeek.Monday
Dim startDate As DateTime = DateTime.Now.AddDays(-days)
Dim endDate As DateTime = startDate.AddDays(6)

当然,您可以更改它,以便本周从您认为应该的任何一天开始(周日,周一?)

答案 1 :(得分:1)

据官方统计,2009年第1周的第一天是29-12-2008,但如果你愿意的话,你可以很容易地将它截断到年份。

有关详细信息和代码,请参阅this question

答案 2 :(得分:1)

值得考虑Calendar Table

答案 3 :(得分:1)

是的,这一周的哪一天开始了?星期天或星期一?

datepart(dw,date)返回星期几(1到7),但是“[t]工作日datepart产生的数字取决于SET DATEFIRST设置的值,它设置了一周的第一天。“

但假设您的数据库设置正确,它将返回正确的东西。

好的,如果它返回1,我们是在第一天,或者更一般地说,第一天是

1 - 我们日期之前的datepart(dw,date)天

如果它返回7我们是在一周的最后一天,或更一般地说,最后一天是

7 - 我们日期之后的datepart(dw,date)天

我们使用dateadd(dd,n,date)来获取我们日期起n天的日期,所以:

select
 date_column, 
 datepart(wk, date_column ) as week_number, 
 dateadd( dd, 1 - datepart( dw, date_column ),date_column ) as week_start, 
 dateadd( dd, 7 - datepart( dw, date_column ), date_column ) as week_end
from table ;

给了我们所需要的东西。

请注意,一年中第一周的第一天是在上一个日历年,因为根据定义,一周开始(周日或周一或您设置的任何一周),但一年可以开始在一周的任何一天。同样,一年中最后一周的最后一天可能在下一个日历年。

答案 4 :(得分:0)

尝试这个TSQL:

DECLARE @Year int
DECLARE @WeekNo int
SET @Year = 2009
SET @WeekNo = 1

DECLARE @DaysInWeekOne int
DECLARE @FirstOfJan smalldatetime
DECLARE @ThirtyFirstOfDec smalldatetime
DECLARE @StartDateDayOfYear int
DECLARE @EndDateDayOfYear int

--GET THE START AND END OF THE YEAR
SELECT
    @ThirtyFirstOfDec = Cast(('12/31/' + Cast(@Year as varchar)) as smalldatetime)
,   @FirstOfJan = Cast(('01/01/' + Cast(@Year as varchar)) as smalldatetime)

--GET THE AMOUNT OF DAYS IN WEEK ONE
SELECT
    @DaysInWeekOne = 7 - (DatePart(dw, @FirstOfJan) - 1)

--GET THE START AND END DAYOFYEAR VALUES FOR THE GIVEN WEEK
SELECT
    @StartDateDayOfYear = CASE WHEN ((@WeekNo-1)*7)-(7-@DaysInWeekOne) < 0 THEN 0 ELSE ((@WeekNo-1)*7)-(7-@DaysInWeekOne) END
,   @EndDateDayOfYear = ((@WeekNo-1)*7)-(7-@DaysInWeekOne) + 6

--SELECT THE START DATE AND END DATE MAKING SURE IF THE COUNT RUNS OVER THE YEAR THAT WE SHOW THE 31/12
SELECT
    @Year As mYear
,   @WeekNo As WeekNo
,   dateadd(dd, @StartDateDayOfYear, (@FirstOfJan)) As StartDate
,   CASE 
        WHEN dateadd(dd, @EndDateDayOfYear,   (@FirstOfJan)) > @ThirtyFirstOfDec THEN @ThirtyFirstOfDec 
        ELSE dateadd(dd, @EndDateDayOfYear, @FirstOfJan) 
    END As EndDate