2016-12-28 9 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 
関連する問題