2009-10-01 175 views
5

尋找以「11/1/2009」格式獲得日期的方法,這將是下個月的第一個週日。我想在10月的第一個星期日之後運行這個查詢,以獲得即將到來的月份的第一個星期日。使用T-SQL查詢完成此操作的最佳方法是什麼?使用T-SQL獲取下個月的第一個星期日

感謝

+0

所以你只想運行這個查詢一次?或者你想要一個總是使用即將到來的第一個星期日的查詢(如果它發生在當前月份,它會得到這個,但如果它已經過去了,它會得到下個月的)? – Anthony

+0

更正它應該每個月運行以獲取即將到來的月份中第一個星期日的日期。它將在一份工作中運行,並在存儲下一個日期的表格中設置日期。 – Matt

+0

如果你總是想要「下個月」,我不確定,你不需要我發佈的複雜解決方案。 :) –

回答

7

嘗試:

Declare @D Datetime 
Set @D = [Some date for which you want the following months' first sunday] 
Select DateAdd(day, (8-DatePart(weekday, 
    DateAdd(Month, 1+DateDiff(Month, 0, @D), 0)))%7, 
    DateAdd(Month, 1+DateDiff(Month, 0, @D), 0)) 

EDIT注:

第一下個月的是由下式給出:

DateAdd(Month, 1+DateDiff(Month, 0, @D), 0) 

或由: 可以被修飾而得到從現在起兩個月的第一個月將1更改爲2:

DateAdd(Month, 2+DateDiff(Month, 0, @D), 0) 

編輯:爲了應對@NissanFan,並@Anthony:修改這個返回的第一個星期一星期二星期三等等,值8更改爲9,10,11,等....

Declare @Sun TinyInt Set @Sun = 8 
Declare @Mon TinyInt Set @Mon = 9 
Declare @Tue TinyInt Set @Tue = 10 
Declare @Wed TinyInt Set @Wed = 11 
Declare @Thu TinyInt Set @Thu = 12 
Declare @Fri TinyInt Set @Fri = 13 
Declare @Sat TinyInt Set @Sat = 14 
Declare @D Datetime, @FONM DateTime -- FirstofNextMonth 
Set @D = [Some date for which you want the following months' first sunday] 
Set @FONM = DateAdd(Month, 1+DateDiff(Month, 0, @D),0) 

Select 
    DateAdd(day, (@Sun -DatePart(weekday, @FONM))%7, @FONM) firstSunInNextMonth, 
    DateAdd(day, (@Mon -DatePart(weekday, @FONM))%7, @FONM) firstMonInNextMonth, 
    DateAdd(day, (@Tue -DatePart(weekday, @FONM))%7, @FONM) firstTueInNextMonth, 
    DateAdd(day, (@Wed -DatePart(weekday, @FONM))%7, @FONM) firstWedInNextMonth, 
    DateAdd(day, (@Thu -DatePart(weekday, @FONM))%7, @FONM) firstThuInNextMonth, 
    DateAdd(day, (@Fri -DatePart(weekday, @FONM))%7, @FONM) firstFriInNextMonth, 
    DateAdd(day, (@Sat -DatePart(weekday, @FONM))%7, @FONM) firstSatInNextMonth 
+0

非常好。更緊湊。這怎麼能適應選擇,比如說......第一個星期三? –

+0

您會將%7更改爲%3 – Anthony

+0

模量!當然。例如,你知道一個簡單的方法來讓它在一個月的第二個星期二做嗎?很棒的小功能。 –

1

您可以使用DATENAME確定你想要的那一天,我可能會建議一個循環的日期從01移動有問題的月份要到達第一個星期天。

所以讓我們嘗試:

DECLARE @DateTime DATETIME 

設定的日期,開始了,再加入1日起至你發現你在找什麼。使用帶dw的日期名稱...

我們已經用它來確定週末,但假期將是一個問題,我們使用表來存儲它。

0

試試這個代碼的函數:

-- Variables 
DECLARE @DATE DATETIME 
DECLARE @DAY INT 
DECLARE @DAYOFWEEK INT 
DECLARE @TESTDATE DATETIME 

-- Set 
SET @TESTDATE = GETDATE() 
SET @DATE = DATEADD(MONTH, 1, @TESTDATE) 
SET @DAY = DATEPART(DAY, @TESTDATE) 
SET @DATE = DATEADD(DAY, [email protected] + 1, @DATE) 
SET @DAYOFWEEK = DATEPART(WEEKDAY, @DATE) 
IF @DAYOFWEEK > 1 
BEGIN 
    SET @DAYOFWEEK = 8 - @DAYOFWEEK 
END 
ELSE 
BEGIN 
    SET @DAYOFWEEK = 0 
END 

SET @DATE = DATEADD(DAY, @DAYOFWEEK, @DATE) 

-- Display 
PRINT @TESTDATE 
PRINT @DAY 
PRINT @DAYOFWEEK 
PRINT @DATE 
0

這裏是確定下一個月的第一個星期天的非系統特定的方式:

首先,獲取當前的月份和增加一個月。 接下來,將該變量的日期設置爲第一個。 接下來,找到該日期的日期值(假設星期一爲1,星期日爲7)。 接下來,從星期日(7)的日期值中減去月份的第1個月的日期值。

您現在有第一個月和第一個星期日之間的天數。然後,您可以將其添加到日期變量中以獲取第一個星期日,或者,因爲我們知道本月的第一個月是1,您可以只添加一個差異(在上面的最後一步中找到),那就是第一個星期天。 (你必須添加一個,因爲它正在減去,因此如果給定月份的第一個星期天,你最終會得到0)。

我一直在瀏覽T-SQL文檔,關於如何使用我的方法並不直觀,但您將需要「星期幾」的概念,使其工作,無論什麼。

0

這對輔助日曆表來說是最簡單的。例如,請參閱this link

然而,它可以完成沒有一個,雖然它很棘手。在這裏,我假設你想要第一個未來日期,即一個月的第一個星期日。我現在已經寫了一個變量@now,因此測試起來很容易。寫出更簡單也許是可能的,但我認爲這比更快寫出更簡單的解決方案更有可能是正確的。 [加入DAY(d)更正< 8]

SET @now = GETDATE(); 
WITH Seven(i) AS (
    SELECT -1 UNION ALL SELECT 0 UNION ALL SELECT 1 
      UNION ALL SELECT 3 UNION ALL SELECT 4 
      UNION ALL SELECT 5 UNION ALL SELECT 6 
), Candidates(d) AS (
    SELECT DATEADD(WEEK,i+DATEDIFF(WEEK,'19000107',@now),'19000107') 
    FROM Seven 
) 
    SELECT TOP (1) d AS SoonestFutureFirstSunday 
    FROM Candidates 
    WHERE DAY(d) < 8 AND MONTH(d) >= MONTH(@now) 
    AND (MONTH(d) > MONTH(@now) OR DAY(d) > DAY(@now)) 
    ORDER BY d;  ORDER BY d; 
1

下面是一個查詢來獲取第一工作下個月的日

DECLARE @DAYOFWEEK INT,@ReminderDate DateTime 
SET @DAYOFWEEK = DATEPART(WEEKDAY,DateAdd(D,- Day(GetDate())+1, DATEADD(M,1,GetDate()))) 
Print @DAYOFWEEK 
If @DAYOFWEEK = 1 
Set @ReminderDate = DateAdd(D,- Day(GetDate())+2, DATEADD(M,1,GetDate())) 
Else If @DAYOFWEEK =7 
Set @ReminderDate = DateAdd(D,- Day(GetDate())+3, DATEADD(M,1,GetDate())) 
Else 
Set @ReminderDate = DateAdd(D,- Day(GetDate())+1, DATEADD(M,1,GetDate())) 
Print @ReminderDate 
0

我認爲,答案是這

SELECT DATEADD(Month, DATEDIFF(Month, 0, GETDATE()) + 1, 0) + 6 - (DATEPART(Weekday, 
        DATEADD(Month, 
         DATEDIFF(Month,0, GETDATE()) + 1, 0)) 
        + @@DateFirst + 5) % 7 --FIRST sunday of following month 
+0

這是一個鈍的原因是該函數必須工作,無論你的DateFirst設置。不同的國籍在不同的一天開始本週。我們默認Datefirst是7,但總是這樣。不,先生。如果你想要不同的日子,那麼把末尾的五個值改爲0到6之間的任何值,看看會發生什麼 –

0

Reference taken from this blog:

SQL Server 2012引入了一個新的TSQL EOMONTH,以返回包含指定日期的月份的最後一天的可選偏移量。

CREATE TABLE tbl_Test_EOMONTH 
(
    SampleDate DATETIME 
) 
GO 

INSERT INTO tbl_Test_EOMONTH VALUES ('2015-12-20') 
INSERT INTO tbl_Test_EOMONTH VALUES ('2015-11-08') 
INSERT INTO tbl_Test_EOMONTH VALUES ('2015-10-16') 
INSERT INTO tbl_Test_EOMONTH VALUES ('2015-09-26') 
INSERT INTO tbl_Test_EOMONTH VALUES ('2016-01-31') 
GO 

SELECT 
    DATEADD(DAY,8-DATEPART(WEEKDAY,DATEADD(DAY,0,EOMONTH([SampleDate]))) 
    ,EOMONTH([SampleDate])) AS FirstSunday_ofTheNextMonth 
FROM tbl_Test_EOMONTH 
GO 
相關問題