-1
我需要一個簡單的查詢來計算任何給定年份的iso週數?如何計算t-sql在一年中的iso週數?
我需要一個簡單的查詢來計算任何給定年份的iso週數?如何計算t-sql在一年中的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