Sql server 按周或年获取日期
我需要一年中特定周数的周开始日期和周结束日期(vb.net或SQL Server) 例如,如果weeknumber=1和year 2009,我应该得到: 起始日期=1/1/2009 截止日期=1/3/2009 如果weeknumber=2且为2009年,则: 起始日期=1/4/2009 截止日期=1/10/2009 实际上,我通过在查询中使用datepart(wk,Date)得到了周数,然后我按周数分组。现在我需要分组周数的开始日期和结束日期 --Sql server 按周或年获取日期,sql-server,vb.net,datetime,Sql Server,Vb.net,Datetime,我需要一年中特定周数的周开始日期和周结束日期(vb.net或SQL Server) 例如,如果weeknumber=1和year 2009,我应该得到: 起始日期=1/1/2009 截止日期=1/3/2009 如果weeknumber=2且为2009年,则: 起始日期=1/4/2009 截止日期=1/10/2009 实际上,我通过在查询中使用datepart(wk,Date)得到了周数,然后我按周数分组。现在我需要分组周数的开始日期和结束日期 -- 拉希尔你在找这样的东西吗: Dim day A
拉希尔你在找这样的东西吗:
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)
当然,你可以改变它,让一周从你认为应该的任何一天开始(太阳、周一?)你在找这样的事情吗:
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)
当然,你可以改变它,让一周从你认为应该的任何一天开始(太阳,周一?这可能值得考虑一个。这可能值得考虑一个。是的,一周从哪一天开始?星期天,还是星期一 datepart(dw,date)返回一周中的某一天(1到7),但“工作日datepart生成的数字取决于set DATEFIRST设置的值,该值设置了一周中的第一天。” 但如果数据库设置正确,它将返回正确的结果 好的,如果它返回1,我们在第一天,或者更一般地说,第一天是 1-日期部分(dw,日期)在我们的日期之前的天 如果它返回7,我们是在一周的最后一天,或者更一般地说,是最后一天 日期部分(dw,日期)在我们的日期后7天 我们使用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 ;
给我们所需要的
请注意,一年中第一周的第一天晚上是在上一个日历年中,因为根据定义,一周开始于(星期日或星期一或您设定的任何日期),但一年可以从一周中的任何一天开始。同样,一年中最后一周的最后一天可能在下一个日历年。是的,一周从哪一天开始?星期天,还是星期一 datepart(dw,date)返回一周中的某一天(1到7),但“工作日datepart生成的数字取决于set DATEFIRST设置的值,该值设置了一周中的第一天。” 但如果数据库设置正确,它将返回正确的结果 好的,如果它返回1,我们在第一天,或者更一般地说,第一天是 1-日期部分(dw,日期)在我们的日期之前的天 如果它返回7,我们是在一周的最后一天,或者更一般地说,是最后一天 日期部分(dw,日期)在我们的日期后7天 我们使用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 ;
给我们所需要的
请注意,一年中第一周的第一天晚上是在上一个日历年中,因为根据定义,一周开始于(星期日或星期一或您设定的任何日期),但一年可以从一周中的任何一天开始。类似地,一年中最后一周的最后一天可能在下一个日历年。尝试以下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
DECLARE@Year int
声明@WeekNo int
设置@Year=2009
设置@WeekNo=1
声明@DaysInWeekOne int
声明@FirstOfJan smalldatetime
声明@ThirtyFirstOfDec smalldatetime
声明@StartDateOfYear int
声明@EndDateDayOfYear int
--了解今年的开始和结束
挑选
@ThirtyFirstOfDec=以smalldatetime的形式进行转换('12/31/'+转换(@Year as varchar)))
,@FirstOfJan=Cast('01/01/'+Cast(@Year as varchar))作为smalldatetime)
--获取第一周的天数
挑选
@DaysInWeekOne=7-(DatePart(dw,一月一日)-1)
--获取给定周的开始和结束日期值
挑选
@StartDateDayOfYear=当((@WeekNo-1)*7)-(7-@DaysInWeekOne)<0时,则其他0((@WeekNo-1)*7)-(7-@DaysInWeekOne)结束
,@EndDateDayOfYear=((@WeekNo-1)*7)-(7-@DaysInWeekOne)+6
--选择开始日期和结束日期,确保计数是否在我们显示的31/12年度内运行
挑选
@作为mYear的一年
,@WeekNo作为WeekNo
,dateadd(dd,@StartDateDayOfYear,(@FirstOfJan))作为StartDate
案例
当dateadd(dd,@EndDateDayOfYear,(@FirstOfJan))>ThirtyFirstOfDec时,则为@ThirtyFirstOfDec
ELSE dateadd(dd,@EndDateDayOfYear,@FirstOfJan)
结束为结束日期
试试这个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
DECLARE@Year int
声明@WeekNo int
设置@Year=2009
设置@WeekNo=1
声明@DaysInWeekOne int
声明@FirstOfJan smalldatetime
声明@ThirtyFirstOfDec smalldatetime
声明@StartDateOfYear int
声明@EndDateDayOfYear int
--了解今年的开始和结束
挑选
@ThirtyFirstOfDec=以smalldatetime的形式进行转换('12/31/'+转换(@Year as varchar)))
,@FirstOfJan=Cast('01/01/'+Cast(@Year as varchar))作为smalldatetime)
--获取第一周的天数
挑选
@DaysInWeekOne=7-(DatePart(dw,一月一日)-1)
--获取给定周的开始和结束日期值
挑选
@StartDateDayOfYear=当((@WeekNo-1)*7)-(7-@DaysInWeekOne)<0时,则其他0((@WeekNo-1)*7)-(7-@DaysInWeekOne)结束
,@EndDateDayOfYear=((@WeekNo-1)*7)-(7-@DaysInWeekOne)+6
--选择开始日期和结束日期,确保计数是否在我们显示的31/12年度内运行
挑选
@作为mYear的一年
,@WeekNo作为WeekNo
,dateadd(dd,@StartDateDayOfYear,(@FirstOfJan))作为StartDate
案例
当dateadd(dd,@EndDateDayOfYear,(@FirstOfJan))>ThirtyFirstOfDec时,则为@ThirtyFirstOfDec
ELSE dateadd(dd,@EndDateDayOfYear,@FirstOfJan)
结束为结束日期