Sql server 从SQL Server 2012中的年、周、日名称检索日期
感谢大家阅读我的问题,通过提供年、周数和日名称从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
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