我們的業務考慮從(星期一 - 星期日)開始的一週。我需要編寫一個T-SQL函數,該函數在一年中通過,而不是作爲參數傳遞,它將返回該周的開始和結束日期。不過,我見過很多例子,但問題在於一年內重疊。T-SQL - 根據週數獲取開始和結束日期。
如2011年12月26日(星期一) - 2012年1月1日(星期日)... < <會想認爲這是上週的2011
而且還在T-SQL日期部分( ww,DATE)認爲星期日是本週的開始?
還是我最好創建自己的表,並保存它的開始和結束日期?
我們的業務考慮從(星期一 - 星期日)開始的一週。我需要編寫一個T-SQL函數,該函數在一年中通過,而不是作爲參數傳遞,它將返回該周的開始和結束日期。不過,我見過很多例子,但問題在於一年內重疊。T-SQL - 根據週數獲取開始和結束日期。
如2011年12月26日(星期一) - 2012年1月1日(星期日)... < <會想認爲這是上週的2011
而且還在T-SQL日期部分( ww,DATE)認爲星期日是本週的開始?
還是我最好創建自己的表,並保存它的開始和結束日期?
DECLARE
@Year INT,
@Week INT,
@FirstDayOfYear DATETIME,
@FirstMondayOfYear DATETIME,
@StartDate DATETIME,
@EndDate DATETIME
SET @Year = 2011
SET @Week = 52
-- Get the first day of the provided year.
SET @FirstDayOfYear = CAST('1/1/' + CAST(@YEAR AS VARCHAR) AS DATETIME)
-- Get the first monday of the year, then add the number of weeks.
SET @FirstMondayOfYear = DATEADD(WEEK, DATEDIFF(WEEK, 0, DATEADD(DAY, 6 - DATEPART(DAY, @FirstDayOfYear), @FirstDayOfYear)), 0)
SET @StartDate = DATEADD(WEEK, @Week - 1, @FirstMondayOfYear)
-- Set the end date to one week past the start date.
SET @EndDate = DATEADD(WEEK, 1, @StartDate)
SELECT @StartDate AS StartDate, DATEADD(SECOND, -1, @EndDate) AS EndDate
我認爲你需要從結束日期減去1。經過進一步的審查,我在使用第1周時會收到不好的日期。 – UnhandledExcepSean 2011-12-19 22:40:35
@SpectralGhost感謝您的更正,更新。 – 2011-12-19 22:43:20
這幾周是基於零的,但我更新爲基於可用性的一個。 – 2011-12-19 22:45:06
你應該創建一個包含假期和日子的表格,你不需要考慮你的計數。
之後,計算出初始日期和最終日期之間的日期。 (步驟1)
請在您的表格中選擇,查看您的ini和最終日期之間有多少天。 (步驟2)
最後用步驟1的結果減去步驟2的結果;
如果您需要假期表,請查看以下腳本:http://www.sqlservercentral.com/scripts/Date+Manipulation/74302/免責聲明,我寫了它,但它完全免費... – Sparky 2011-12-19 22:23:24
這是諸如此類的事情,你最好創建一個日曆表:主要的問題是知道如何遙遠的過去/未來來填充它,但除此之外,有表模式包括週數量和日期。根據您想要執行的其他日期查詢,您可能需要額外的列來將日期分解爲其構成部分(例如,對於日/月/年/日的名稱,具有三個單獨的列)。
這個怎麼樣:
--DROP FUNCTION dbo.GetBusinessWeekStart
CREATE FUNCTION dbo.GetBusinessWeekStart(
@Year SMALLINT,
@Week TINYINT
)
RETURNS DATETIME
AS
BEGIN
DECLARE @FirstMonday TINYINT
DECLARE @Result DATETIME
IF ISNULL(@Week,0)<1 OR ISNULL(@Year,0)<1900
BEGIN
SET @Result= NULL;
END
ELSE
BEGIN
SET @FirstMonday=1
WHILE DATEPART(dw,CONVERT(DATETIME, '01/0' + CONVERT(VARCHAR,@FirstMonday) + '/' + CONVERT(VARCHAR,@Year)))<>2
BEGIN
SET @[email protected]+1
END
SET @Result=CONVERT(DATETIME, '01/0' + CONVERT(VARCHAR,@FirstMonday) + '/' + CONVERT(VARCHAR,@Year))
SET @Result=DATEADD(d,(@Week-1)*7,@Result)
IF DATEPART(yyyy,@Result)<>@Year
BEGIN
SET @Result= NULL;
END
END
RETURN @Result
END
GO
--Example
SELECT dbo.GetBusinessWeekStart(2011,15) [Start],dbo.GetBusinessWeekStart(2011,15)+6 [End]
你會如何定義這一年的第一個星期? – Andomar 2011-12-19 21:55:05
那麼,2011年1月3日 - 2011年1月9日。今年的第一個星期一。 – user1106741 2011-12-19 22:00:24
您可以使用'SET DATEFIRST'來指定星期的開始日期。 – Magnus 2011-12-19 22:16:16