-1
任意の年にiso週の数を計算する簡単なクエリが必要ですか?t-sqlで1年間のiso週の数を計算するには?
任意の年にiso週の数を計算する簡単なクエリが必要ですか?t-sqlで1年間のiso週の数を計算するには?
これはトリックを行うべきだと思います。
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