2016-12-28 25 views

回答

2

我認爲這應該會有訣竅。

DECLARE @year smallint = 2015; 

SELECT 
    TheYear = @year, 
    ISOWeeks= MAX(DATEPART(ISOWK,DATEADD(DD,N,CAST(CAST(@year AS char(4))+'1223' AS date)))) 
FROM (VALUES (1),(2),(3),(4),(5),(6),(7),(8)) t(N); 

你可以包括這樣的功能這樣的邏輯:

CREATE FUNCTION dbo.CalculateISOWeeks(@year smallint) 
RETURNS TABLE WITH SCHEMABINDING AS RETURN 
SELECT ISOWeeks = 
    MAX(DATEPART(ISOWK,DATEADD(DD,N,CAST(CAST(@year AS char(4))+'1223' AS date)))) 
FROM (VALUES (1),(2),(3),(4),(5),(6),(7),(8)) t(N); 

,並使用它像這樣:

SELECT ISOWeeks FROM dbo.CalculateISOWeeks(2014); 

或更好,但...因爲我們計算靜態值,爲什麼不只是將這些值放入表中,然後像下面那樣索引它:

SELECT 
    Yr  = ISNULL(CAST(Yr AS smallint),0), 
    ISOWeeks = ISNULL(CAST(ISOWeeks AS tinyint),0) 
INTO dbo.ISOCounts 
FROM 
(
    SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL))+1949 
    FROM (VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) a(x), 
     (VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) b(x) 
) Years(Yr) 
CROSS APPLY dbo.CalculateISOWeeks(Yr+1950); 

CREATE UNIQUE CLUSTERED INDEX uci_ISOCounts ON dbo.ISOCounts(Yr); 

現在無論何時您需要計算給定年份的ISO週數,您都可以通過索引查找從表中檢索預先計算的值。

SELECT * FROM dbo.ISOCounts WHERE yr = 2014; 

結果:

Yr  ISOWeeks 
------ -------- 
2014 53