2009-10-01 11 views
5

Szukasz sposobu, aby uzyskać datę w formacie "11/1/2009", która byłaby pierwszą niedzielą następnego miesiąca. Chcę uruchomić to zapytanie po pierwszej niedzieli w październiku, aby uzyskać pierwszą niedzielę nadchodzącego miesiąca. Jaka jest najlepsza metoda wykonania tego przy pomocy zapytania T-SQL?Zdobądź pierwszą niedzielę przyszłego miesiąca za pomocą T-SQL

Dzięki

+0

Więc chcesz uruchomić to zapytanie tylko raz? Lub chcesz zapytanie, które zawsze będzie używać daty nadchodzącej pierwszej niedzieli (tak, że jeśli stało się to w bieżącym miesiącu, dostaje to, ale jeśli minęło, to dostaje następny miesiąc)? – Anthony

+0

Popraw to powinno być uruchamiane co miesiąc, aby uzyskać datę pierwszej niedzieli w nadchodzącym miesiącu. Będzie działać w zadaniu i ustawi datę w tabeli przechowującej następną datę. – Matt

+0

Jeśli zawsze chcesz "następnego" miesiąca, o którym nie byłam pewna, nie potrzebujesz skomplikowanego rozwiązania, które napisałem. :) –

Odpowiedz

7

spróbuj tego:

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)) 

edytować notatki:

Pierwszy następnego miesiąca jest przez wyrażenie:

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

lub przez: które mogą być modyfikowane, aby dać pierwszy miesiąc za dwa miesiące, zmieniając 1 na 2:

EDIT: W odpowiedzi na @NissanFan i @Anthony: Aby zmodyfikować ten powrót pierwszy Poniedziałek Wtorek Środa, etc, zmień wartość 8 do 9, 10, 11, itd ....

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

Bardzo ładne. O wiele bardziej kompaktowy. Jak można to dostosować, by wybrać, powiedzmy ... pierwszą środę? –

+0

Zmieniłbyś moduł% 7 na% 3 – Anthony

+0

! Oczywiście. Czy znasz prosty sposób na zrobienie tego w drugi wtorek miesiąca? Świetna mała funkcja. –

1

Po prostu FYI, a następnie zbliża się z pewnym kodem to zrobić jak o użyciu tabeli kalendarza.

Spójrz na to: http://sqlserver2000.databases.aspfaq.com/why-should-i-consider-using-an-auxiliary-calendar-table.html

To również może pomóc: http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=99696

+0

Mam alwyas przestraszyć używania tabeli do przechowywanych dat takich jak te. Wakacje są w porządku, ponieważ możemy je zlokalizować, ale w weekendy? –

1

Można użyć DATENAME określić dzień chcesz, mogę polecić pętlę, aby przesunąć datę z 01 w danym miesiącu, aby dostać się do pierwszej niedzieli.

Więc spróbujmy:

DECLARE @DateTime DATETIME 

ustawiony na bieżąco, aby rozpocząć mecz, następnie dodać 1 dzień, aż znajdziesz to, czego szukasz. Użyj datename z dw ...

Wykorzystaliśmy to do określenia weekendów, ale święta będą problemem, gdy używamy tabeli do przechowywania tego.

0

Spróbuj tego kodu w funkcji:

-- 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

Oto specyficzny sposób non-System, aby określić pierwszą niedzielę następnego miesiąca:

pierwsze, uzyskać bieżący miesiąc i dodać jeden miesiąc. Następnie ustaw datę tej zmiennej jako pierwszą. Następnie znajdź datę tego dnia (załóżmy, że poniedziałki to 1, a niedziele to 7). Następnie odejmij wartość dnia pierwszego dnia miesiąca od wartości dnia w niedzielę (7).

Masz teraz liczbę dni między pierwszym dniem miesiąca a pierwszą niedzielą. Możesz wtedy dodać to do zmiennej daty, aby otrzymać pierwszą niedzielę, lub, ponieważ wiemy, że pierwszy z miesiąca to 1, możesz po prostu dodać jeden do różnicy (znaleziony w tym ostatnim kroku powyżej) i jest to data w pierwszą niedzielę. (Musisz dodać jeden, ponieważ odejmuje, a zatem jeśli pierwszy z danego miesiąca JEST niedzielny, skończyłbyś z 0).

Przeglądałem dokumentację T-SQL i nie jest w ogóle intuicyjne, jak można wykorzystać moją metodę, ale potrzebna jest koncepcja "numeru dnia tygodnia", aby działała bez względu na sposób co.

0

To byłoby najprostsze z pomocniczą tabelą kalendarza. Zobacz np. this link.

Jednak można to zrobić bez niego, choć jest to dość trudne. Tutaj zakładam, że chcesz pierwszą przyszłą datę, która jest pierwsza niedziela miesiąca. Napisałem to ze zmienną @now dla - no cóż - teraz, więc łatwiej ją przetestować. Być może łatwiej będzie pisać prostsze, ale myślę, że ma to większą szansę na poprawność niż prostsze rozwiązania napisane szybciej. [Poprawione przez dodanie dnia (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

Oto zapytanie, aby pierwszy dzień roboczy następnego miesiąca I

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

liczyć się, że odpowiedź jest to

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

Powód, dla którego jest to nieco rozwlekłe, polega na tym, że funkcja musi działać niezależnie od ustawienia DateFirst. Różne narodowości rozpoczynają tydzień w innym dniu. Domyślnie Datefirst to 7, ale nie zawsze tak jest. Nie proszę pana. Jeśli chcesz mieć różne dni, zmień pięć na końcu na dowolną wartość z zakresu od 0 do 6, aby zobaczyć, co się stanie –

0

Reference taken from this blog:

SQL Serwer 2012 wprowadził jeden nowy TSON EOMONTH, aby zwrócić ostatni dzień miesiąca, który zawiera określoną datę z opcjonalnym przesunięciem.

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 
Powiązane problemy