我有一个看起来像这样的表:
SELECT
[Year],
[Week]
FROM [BI_Planning].[dbo].[tblWeekCalendar]
我手动设置了2018年1周15日的记录。
我想有一个选择,让我本周(15)+ 7周前进 像这样的东西:
然而,当第16周到来时,我应该有16 + 7周,这意味着2018年的新行 - 23
今年也必须参加比赛,因为今年年底我想有2019-1等等。
要使用select datepart(iso_week,getdate())
这可能吗?
答案 0 :(得分:1)
而不是手动插入或添加7来计算周数,您应该使用默认的SQL函数DATEPART
来获取正确的周数。
您可以在以下日期范围内生成周数。
DECLARE @StartDate DATETIME = '2018-01-01'
DECLARE @EndDate DATETIME = '2019-12-31'
SELECT DISTINCT DATEPART( wk, T1.DATE) AS [Week],Year(T1.DATE)
FROM (
SELECT
@StartDate + RN AS DATE
FROM (SELECT ROW_NUMBER()
OVER (
ORDER BY (SELECT NULL)) RN
FROM master..[spt_values]) T) T1
WHERE T1.DATE <= @EndDate
ORDER BY Year(T1.DATE)
如果您还想要WeekStart和WeekEnd,您可以尝试以下内容。
DECLARE @StartDate DATETIME = '2018-01-01'
DECLARE @EndDate DATETIME = '2019-12-31'
SELECT MIN(T1.DATE) WeekStart, MAX(T1.DATE) WeekEnd, [Week], [Year]
FROM
(
SELECT DATEPART( wk, T1.DATE) AS [Week],Year(T1.DATE) AS [Year], T1.DATE
FROM (
SELECT
@StartDate + RN AS DATE
FROM (SELECT ROW_NUMBER()
OVER (
ORDER BY (SELECT NULL)) RN
FROM master..[spt_values]) T) T1
WHERE T1.DATE <= @EndDate
) T1
GROUP BY [Week], [Year]
ORDER BY [Year],[Week]
答案 1 :(得分:0)
尝试以下方法
DECLARE @Weekstart int = DATEPART(WW, '2018-01-01')
DECLARE @WeekEnd int = DATEPART(WW, '2018-12-31')
CREATE TABLE #Temp
(
Year int,
WeekNo int
)
INSERT INTO #Temp (Year, WeekNo) VALUES (DATEPART(YYYY, GETDATE()),1)
DECLARE @Count INT
DECLARE @TotalCount INT
SET @TotalCount = DATEPART(WW, '2018-12-31')
SET @Count = 1
WHILE (@Count < @TotalCount)
BEGIN
DECLARE @WeekNo INT
SELECT @WeekNo = MAX(ISNULL(WeekNo, 0))+1 FROM #Temp
INSERT INTO #Temp (Year, WeekNo) VALUES (DATEPART(YYYY, GETDATE()),@WeekNo)
SET @Count = @Count+1
END
INSERT INTO #Temp (Year, WeekNo) VALUES (DATEPART(YYYY, GETDATE())+1,1)
答案 2 :(得分:0)
你必须解决你想要处理的问题,说从2015年到2016年的过渡。你可以使用这样的代码来帮助解决你的7周前瞻:
testValue2
这假设您可以在每年年初的“重置”到1月1日 - 如果您进行真正的7天前进,您可以进入不稳定的情景(例如,从某些年份缺少第1周,例如2016年)。