Konkretnie MSSQL 2005.Jak obliczyć ostatni dzień miesiąca w SQL?
Odpowiedz
Oto rozwiązanie, które daje ostatniej sekundzie bieżącego miesiąca. Możesz wyodrębnić część daty lub zmodyfikować ją, aby wrócić tylko dzień. Przetestowałem to na SQL Server 2005.
select dateadd(s, -1, dateadd(mm, datediff(m, 0, getdate()) + 1, 0));
Aby zrozumieć, jak to działa musimy spojrzeć na funkcje dateadd() i datediff().
DATEADD(datepart, number, date)
DATEDIFF(datepart, startdate, enddate)
przypadku uruchomienia tylko najbardziej wewnętrzne wezwanie do DateDiff(), pojawi się aktualny numer miesiąca od datownik 0.
select datediff(m, 0, getdate());
1327
Kolejna część dodaje, że kilka miesięcy plus 1 do 0 znacznik czasu, podając punkt początkowy następnego miesiąca kalendarzowego.
select dateadd(mm, datediff(m, 0, getdate()) + 1, 0);
2010-09-01 00:00:00.000
Wreszcie zewnętrzna DateAdd() po prostu odejmuje jeden sekund od początku znacznika czasu następnego miesiąca, co daje w ostatniej sekundzie bieżącego miesiąca.
select dateadd(s, -1, dateadd(mm, datediff(m, 0, getdate()) + 1, 0));
2010-08-31 23:59:59.000
Ten stary odpowiedź (poniżej) ma błąd, który nie działa na ostatni dzień miesiąca, który ma dni więcej niż następnego miesiąca. Zostawiam to tutaj jako ostrzeżenie dla innych.
Dodaj miesiąc do bieżącej daty, a następnie odejmij wartość zwróconą przez funkcję DZIEŃ zastosowaną do bieżącej daty, używając funkcji DZIEŃ i DATA DATA.
dateadd(day, -day(getdate()), dateadd(month, 1, getdate()))
Co się stanie, jeśli dwie wywołania getdate dadzą odpowiedzi w różnych terminach? –
Przypuszczam, że to możliwe. Będziesz musiał wcześniej zadeklarować zmienną, która będzie zawierała dzisiejszą datę. –
Nie zrobią tego. Tworzymy raporty generujące kolumny: rok, kwartał, miesiąc i rundate (GetDate()), które trwają 30 sekund, a wartość nigdy się nie zmienia. – JeffO
Niektóre linki do możliwych odpowiedzi:
Spróbuj tego:
DATEADD (DAY, -1, DATEADD (MONTH, DATEDIFF (MONTH, 0, CURRENT_TIMESTAMP) + 1, 0)
Często stwierdzam, że ludzie nie przestrzegają logiki tego. Tak więc, chociaż wydaje się, że jest poprawny (jeśli zaakceptowana odpowiedź wydaje się być nieprawidłowa), nie dam +1. Czy jest szansa, że możesz edytować odpowiedź, aby podać wyjaśnienie? – MatBailie
DECLARE
@Now datetime,
@Today datetime,
@ThisMonth datetime,
@NextMonth datetime,
@LastDayThisMonth datetime
SET @Now = getdate()
SET @Today = DateAdd(dd, DateDiff(dd, 0, @Now), 0)
SET @ThisMonth = DateAdd(mm, DateDiff(mm, 0, @Now), 0)
SET @NextMonth = DateAdd(mm, 1, @ThisMonth)
SET @LastDayThisMonth = DateAdd(dd, -1, @NextMonth)
Czasami naprawdę potrzebują ostatni dzień tego miesiąca, ale często to, czego naprawdę chcę to opisać interwał czasowy tym miesiącu. Jest to najlepszy sposób na opisanie interwał czasie tego miesiąca:
WHERE @ThisMonth <= someDate and someDate < @NextMonth
SELECT DATEADD(M, DATEDIFF(M, '1990-01-01T00:00:00.000', CURRENT_TIMESTAMP), '1990-01-31T00:00:00.000')
Objaśnienie:
ogólne podejście: użyj funkcji czasowej.
SELECT '1990-01-01T00:00:00.000', '1990-01-31T00:00:00.000'
Są literałami Datetime, jako pierwszy czas granulatu w pierwszym dniu i ostatnim dniu, odpowiednio, w tym samym 31-dniowego miesiąca. Który miesiąc jest wybrany jest całkowicie arbitralny.
SELECT DATEDIFF(M, '1990-01-01T00:00:00.000', CURRENT_TIMESTAMP)
Jest to różnica w całych miesiącach między pierwszym dniem miesiąca odniesienia a bieżącym znacznikiem czasu. Nazwijmy to @calc
.
SELECT DATEADD(M, @calc, '1990-01-31T00:00:00.000')
Dodaje @calc
miesiąc granulki do ostatniego dnia miesiąca odniesienia, wynikiem których jest obecny timestamp „zaokrąglone” do ostatniego dnia swojego miesiąca. Q.E. D.
+1 za dołączenie wyjaśnienia :) – MatBailie
Dla kompletności w Oracle chcesz zrobić coś takiego ...
select add_months(trunc(sysdate,'MM'),1) ...
lub
select last_day(sysdate)+1 ...
DATEADD(dd, -1, DATEADD(mm, +1, DATEADD(dd, 1 - DATEPART(dd, @myDate), @myDate)))
one kluczowe punkty, jeśli można dostać pierwszy dzień prądu miesiąc, ostatni dzień ostatniego miesiąca i ostatni dzień bieżącego miesiąca.
Poniżej krok po kroku sposób napisać zapytanie:
w SQL Server Data rozpoczyna się od 1901/01/01 (Date 0) i do tej pory w każdym miesiącu może być identyfikowany przez numer. 12 miesiąc to pierwszy miesiąc 1902 r. Oznacza styczeń. Miesiąc 1200 to styczeń 2001 roku. Podobnie każdy dzień może być przypisany przez unikalną liczbę np. Data 0 to 1901/01/01. Data 31 jest 01/02/1901 w styczniu 1901 roku rozpocznie się od 0.
Aby dowiedzieć Pierwszy dzień bieżącego miesiąca (bieżącą datę lub dany dzień)
- najpierw musimy sprawdzić, jak wiele miesięcy minęło od daty 0 (1901/01/01). SELECT DateDiff (MM, 0, GETDATE())
- Dodaj samą liczbę od miesiąca do tej pory 0 (1901/01/01)
SELECT DATEADD (MM, DateDiff (MM, 0, GETDATE()), 0)
Potem dostanie pierwszy dzień bieżącego miesiąca (bieżącą datę lub dany dzień)
Aby uzyskać ostatniego dnia ostatniego miesiąca
Musimy odjąć drugi od pierwszego dnia bieżącego miesiąca
SELECT DATEADD (SS 1, DATEADD (MM DATEDIFF (MM 0 GETDATE()), 0))
Aby uzyskać ostatniego dnia bieżącego miesiąca
Aby uzyskać pierwszy dzień bieżącego miesiąca najpierw sprawdzenie, ile miesięcy zostały przekazane od daty 0 (1901/01/01).Jeśli dodamy kolejny miesiąc z łącznymi miesiącami od daty 0, a następnie dodamy całkowite miesiące z datą 0, otrzymamy pierwszy dzień następnego miesiąca.
SELECT DATEADD(MM, DATEDIFF(MM,0,GETDATE())+1,0)
Jeśli mamy pierwszy dzień następnego miesiąca, a następnie dostać się ostatni dzień bieżącego miesiąca, wszyscy musimy odjąć sekundy.
SELECT DATEADD (SS 1, DATEADD (MM DATEDIFF (MM 0 GETDATE()) + 1,0))
nadziei, że pomaga.
Korzystając z SQL2005, nie masz dostępu do przydatnej funkcji EOMONTH()
, więc musisz to obliczyć samodzielnie.
Ta prosta funkcja wola działa podobnie do EOMONTH
CREATE FUNCTION dbo.endofmonth(@date DATETIME= NULL)
RETURNS DATETIME
BEGIN
RETURN DATEADD(DD, -1, DATEADD(MM, +1, DATEADD(DD, 1 - DATEPART(DD, ISNULL(@date,GETDATE())), ISNULL(@date,GETDATE()))))
END
Zapytanie wykonać:
SELECT dbo.endofmonth(DEFAULT) --Current month-end date
SELECT dbo.endofmonth('02/25/2012') --User-defined month-end date
- 1. Zdobądź ostatni dzień miesiąca?
- 2. Jak uzyskać ostatni dzień miesiąca?
- 3. Jak znaleźć ostatni dzień miesiąca?
- 4. Pierwszy i ostatni dzień bieżącego miesiąca
- 5. Ostatni dzień miesiąca w .NET
- 6. Ostatni dzień poprzedniego miesiąca w funkcji Oracle
- 7. Zdobądź ostatni dzień miesiąca w Ruby
- 8. Get pierwszy i ostatni dzień poprzedniego miesiąca
- 9. R znaleźć ostatni dzień tygodnia miesiąca
- 10. Kalendarz - Pobierz ostatni dzień poprzedniego miesiąca
- 11. dodać dni do miesiąca nieprzekraczającej ostatni dzień miesiąca php
- 12. Jak mogę wybrać "ostatni dzień roboczy miesiąca" w Pandach?
- 13. Jak uzyskać ostatni dzień miesiąca za pomocą php
- 14. Jak uzyskać ostatni dzień miesiąca od określonej daty?
- 15. Jak uzyskać pierwszy i ostatni dzień poprzedniego miesiąca (z sygnaturą czasową) w SQL Server
- 16. Moment js uzyskać pierwszy i ostatni dzień bieżącego miesiąca
- 17. Oblicz ostatni dzień kwartału
- 18. Format daty w dzień, dzień miesiąca, rok
- 19. Znajdź pierwszy i ostatni dzień poprzedniego miesiąca kalendarzowego w usługach raportowania programu SQL Server (VB.Net)
- 20. jak znaleźć ostatni poniedziałek miesiąca
- 21. Jak uzyskać dzień miesiąca w javascript
- 22. Otrzymuj dzień ostatniego piątku każdego miesiąca
- 23. Jak mogę uzyskać pierwszy i ostatni dzień miesiąca z Perl's DateTime?
- 24. Porównaj dzień miesiąca i rok
- 25. jak uzyskać pierwszy dzień i ostatni miesiąc wcześniej przy użyciu sql
- 26. Jak uzyskać pierwszy dzień bieżącego miesiąca?
- 27. Jak ustawić próbnik czasu na datę, zawsze zawiera ostatni dzień miesiąca, pokazując tylko miesiąc i rok?
- 28. Jak zdobyć pierwszy i ostatni dzień z poprzedniego miesiąca z węglem - laravel
- 29. Jak zaplanować zadanie typu laravel w konkretny dzień miesiąca?
- 30. Ustawianie terminu na pierwszy dzień następnego miesiąca?
Nie jestem pewna odpowiedź, oznaczone jako przyjęte acutally działa . Uruchomić "2009 Jan 30" przez to i zobaczyć, co daje? – MatBailie
Witaj? Przyjęta odpowiedź - nie działa ... – MatBailie
Dems, użyłem tego jako inspiracji dla rozwiązania, które wdrożyłem, ale to prawie rok temu, więc nie pamiętam dokładnie, co zrobiłem ... –