我需要一年中特定周数的周开始日期和周结束日期(vb.net或SQL Server)
例如,如果weeknumber = 1和2009年,我应该得到:
的StartDate = 1 /二千○九分之一 结束日期= 1 /二千○九分之三
如果是weeknumber = 2和2009年,那么:
的StartDate = 1 /二千○九分之四 结束日期= 1 /二千〇九分之一十
实际上我通过在Query中使用datepart(wk,Date)获得周数,然后按周数分组。现在我需要分组的周数的开始日期和结束日期。
- Raheel
答案 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