Sql server 从SQL Server 2012中的年、周、日名称检索日期

Sql server 从SQL Server 2012中的年、周、日名称检索日期,sql-server,sql-server-2012,Sql Server,Sql Server 2012,感谢大家阅读我的问题,通过提供年、周数和日名称从SQL Server 2012检索日期,我遇到了一个大问题 如果我有 Year = 2016 Week number = 1 Day Name ='FRI' First day of week='SUN' 预期结果: 01-01-2016 我该怎么做 编辑:我从中找到了类似的解决方案,但我没有月份名称 我的建议基于您提供的链接中问题的解决方案。 基本上,我创建了一个日历,保存从一年的1月1日到之后的@x周的日期,然后查询该日历: -- prov

感谢大家阅读我的问题,通过提供年、周数和日名称从SQL Server 2012检索日期,我遇到了一个大问题

如果我有

Year = 2016
Week number = 1
Day Name ='FRI'
First day of week='SUN'
预期结果:

01-01-2016
我该怎么做


编辑:我从中找到了类似的解决方案,但我没有月份名称

我的建议基于您提供的链接中问题的解决方案。 基本上,我创建了一个日历,保存从一年的1月1日到之后的@x周的日期,然后查询该日历:

-- provided data:
DECLARE @Year int = 2016,
        @WeekNumber int = 1,
        @DayName char(3) = 'Fri';

-- Calculate start date and end date
DECLARE @StartDate date, 
        @EndDate date;

SELECT  @StartDate = CAST('01-01-'+ CAST(@Year as char(4)) as date),
        @EndDate = DATEADD(WEEK, @WeekNumber, @StartDate)

-- Create the calendar
;WITH CTE AS 
(
    SELECT @StartDate as TheDate
    UNION ALL
    SELECT DATEADD(DAY, 1, TheDate)
    FROM CTE 
    WHERE DATEADD(DAY, 1, TheDate) <= @EndDate
)

-- Finally, query the calendar:
SELECT  TheDate
FROM CTE
WHERE DATEPART(WEEK, TheDate) = @WeekNumber 
AND YEAR(TheDate) = @Year 
AND DATENAME(WEEKDAY, TheDate) LIKE @DayName + '%'
OPTION(MAXRECURSION 0)
注意:如果指定的日期为mon,此解决方案将不返回任何行,因为2016年的第一周从周五开始

试试这个

   DECLARE @Year        varchar(4)
DECLARE @WeekDayday  varchar(10) 
DECLARE @WeekNumber  int        
SET @Year        ='2016'  
SET @WeekDayday  ='fri'   
SET @WeekNumber  =1


--used to solve
DECLARE @StartDate datetime
       ,@EndDate   datetime
       ,@FirstWeek int

SET @StartDate='01-01-'+' '+@Year
SET @EndDate=@StartDate+38
SET @FirstWeek=DATENAME(week,@StartDate)-1

;with AllDates AS
(
    SELECT @StartDate AS DateOf, DATENAME(week,@StartDate)-@FirstWeek AS WeekOf, DATENAME(weekday,@StartDate) AS WeekDayOf
    UNION ALL
    SELECT DateOf+1, DATENAME(week,DateOf+1)-@FirstWeek AS WeekOf, DATENAME(weekday,DateOf+1) AS WeekDayOf
        FROM AllDates
    WHERE DateOf<@EndDate
)
SELECT
    DateOf
    FROM AllDates
    WHERE WeekOf=@WeekNumber AND WeekDayOf LIKE @WeekDayday+'%'
    ORDER BY DateOf
通过评估月份名称和周数来改进答案如何:

--given info
DECLARE @Year        varchar(4);
DECLARE @MonthName   varchar(10);
DECLARE @WeekDayday  varchar(10);
DECLARE @WeekNumber  int;

SET @Year        = '2016';
SET @WeekDayday  = 'Tue';  
set @WeekNumber  = 46;

-- get month number by week
declare @w int = 0;
declare @m int = 1;
while (@w <= @WeekNumber and @m < 13) begin
  set @w = datepart(wk, datefromparts(@year, @m, 1));
  if (@w <= @WeekNumber and @m < 13) begin
    set @m = @m + 1;
  end;
end;
set @m = @m -1;

-- get month name
set @MonthName = left(DateName(month ,DateAdd(month ,@m ,0 ) - 1), 3);


--used to solve
DECLARE @StartDate datetime
       ,@EndDate   datetime
       ,@FirstWeek int

SET @StartDate='01 '+@MonthName+' '+@Year
SET @EndDate=@StartDate+38
SET @FirstWeek=DATENAME(week,@StartDate)-1


;with AllDates AS
(
    SELECT @StartDate AS DateOf, DATENAME(week,@StartDate)-@FirstWeek AS WeekOf, DATENAME(weekday,@StartDate) AS WeekDayOf
    UNION ALL
    SELECT DateOf+1, DATENAME(week,DateOf+1)-@FirstWeek AS WeekOf, DATENAME(weekday,DateOf+1) AS WeekDayOf
        FROM AllDates
    WHERE DateOf<@EndDate
)
SELECT
    DateOf ,WeekOf ,WeekDayOf
    FROM AllDates
    WHERE datepart(wk, DateOf) = @WeekNumber AND WeekDayOf LIKE @WeekDayday+'%'
    ORDER BY DateOf

如果您有以下数据年份:2016年,WeekNo=1,DayName='MON',您希望得到什么-错误或4-1-2016 dmy?那么一周从哪一天开始——太阳还是周一?@Shohel您描述的是美国标准周和iso周的混合。Iso周从周一开始,可以是2个不同年份的一部分,周四描述了本周属于哪一年。美国标准从星期天开始,一周总是在年与年之间结束,这意味着星期六1/1将是第一周,星期天将是第二周。我强烈建议您不要尝试生成新的StandardRequirements选项MaxRecursion 0或366-使用Week>14@LesH:谢谢你的接球!修正了。@ZoharPeled,你的回答很有帮助。我已经更新了我的问题。刚刚添加了一周的第一天。@Zoharpel没问题-我正要发布几乎完全相同的答案-你赢了我:@Shohel关于一周的第一天,
--given info
DECLARE @Year        varchar(4);
DECLARE @MonthName   varchar(10);
DECLARE @WeekDayday  varchar(10);
DECLARE @WeekNumber  int;

SET @Year        = '2016';
SET @WeekDayday  = 'Tue';  
set @WeekNumber  = 46;

-- get month number by week
declare @w int = 0;
declare @m int = 1;
while (@w <= @WeekNumber and @m < 13) begin
  set @w = datepart(wk, datefromparts(@year, @m, 1));
  if (@w <= @WeekNumber and @m < 13) begin
    set @m = @m + 1;
  end;
end;
set @m = @m -1;

-- get month name
set @MonthName = left(DateName(month ,DateAdd(month ,@m ,0 ) - 1), 3);


--used to solve
DECLARE @StartDate datetime
       ,@EndDate   datetime
       ,@FirstWeek int

SET @StartDate='01 '+@MonthName+' '+@Year
SET @EndDate=@StartDate+38
SET @FirstWeek=DATENAME(week,@StartDate)-1


;with AllDates AS
(
    SELECT @StartDate AS DateOf, DATENAME(week,@StartDate)-@FirstWeek AS WeekOf, DATENAME(weekday,@StartDate) AS WeekDayOf
    UNION ALL
    SELECT DateOf+1, DATENAME(week,DateOf+1)-@FirstWeek AS WeekOf, DATENAME(weekday,DateOf+1) AS WeekDayOf
        FROM AllDates
    WHERE DateOf<@EndDate
)
SELECT
    DateOf ,WeekOf ,WeekDayOf
    FROM AllDates
    WHERE datepart(wk, DateOf) = @WeekNumber AND WeekDayOf LIKE @WeekDayday+'%'
    ORDER BY DateOf