Przejdź do treści
Powrót do Centrum Pomocy
Ilustracja artykułu: Dateadd sql server — kompletny przewodnik 2026
Aplikacje Microsoft

Dateadd sql server — kompletny przewodnik 2026

Funkcja DATEADD dodaje (lub odejmuje) określoną liczbę jednostek czasu do wskazanej daty i zwraca nową, zmodyfikowaną wartość typu datetime, datetime2, smalldat

10 min czytania·Zaktualizowano dzisiaj
Autor:Piotr ZielińskiSprawdzone przezKatarzyna NowakAktualizacja: 9 czerwca 2026
Faktura VAT 23% + KSeFDostawa 1-3 min e-mailemGwarancja działania klucza5,0 / 5,0(KluczeSoft)

Dateadd sql server to jedna z najczęściej używanych, a zarazem najczęściej błędnie rozumianych funkcji w języku T-SQL. Niezależnie od tego, czy dopiero zaczynasz pracę z bazami danych Microsoft SQL Server, czy jesteś doświadczonym administratorem — zrozumienie, jak precyzyjnie manipulować datami, potrafi zadecydować o poprawności raportów finansowych, harmonogramów produkcyjnych czy systemów rozliczeniowych. W tym przewodniku pokażę Ci nie tylko suchą składnię, ale przede wszystkim praktyczne scenariusze biznesowe, które spotkasz w codziennej pracy. Jeśli szukasz sprawdzonego źródła wiedzy przed wdrożeniem nowego rozwiązania w firmie — trafiłeś idealnie.


Czym jest funkcja DATEADD w SQL Server?

Funkcja DATEADD dodaje (lub odejmuje) określoną liczbę jednostek czasu do wskazanej daty i zwraca nową, zmodyfikowaną wartość typu datetime, datetime2, smalldatetime, date lub datetimeoffset. Inaczej mówiąc: bierzesz datę bazową, mówisz silnikowi bazy danych „chcę przesunąć ją o X dni / miesięcy / godzin” i otrzymujesz wynik.

Od wersji SQL Server 2022 (oraz w chmurze Azure SQL Database, SQL Managed Instance i Microsoft Fabric) funkcja nie zmieniła swojego zachowania względem poprzednich wydań — Microsoft utrzymuje pełną wsteczną kompatybilność. W 2026 roku nadal obowiązuje standardowa sygnatura:

DATEADD (datepart, number, date)

Gdzie datepart to jednostka czasu (np. year, month, day), number to liczba całkowita (dodatnia lub ujemna), a date to wyrażenie daty. Wynik jest zawsze nową wartością — oryginalna data nie ulega modyfikacji, co jest kluczowe przy budowaniu zapytań osadzonych w widokach i procedurach składowanych.


Składnia i parametry — pełna referencja na 2026 rok

Parametr datepart — dozwolone wartości

Pierwszy argument funkcji dateadd sql server określa, jaką jednostkę czasu modyfikujesz. Oto kompletna tabela wartości obsługiwanych przez SQL Server 2025 i 2026:

datepartSkrótPrzykład przesunięcia
yearyy, yyyy+1 = ten sam dzień za rok
quarterqq, q+1 = ten sam dzień w następnym kwartale
monthmm, m+1 = za miesiąc
dayofyeardy, yidentyczne jak day
daydd, d+1 = następny dzień
weekwk, ww+1 = za tydzień
weekdaydw, w+1 = następny dzień (identyczne jak day)
hourhh+1 = za godzinę
minutemi, n+1 = za minutę
secondss, s+1 = za sekundę
millisecondms+1 = za milisekundę
microsecondmcs+1 = za mikrosekundę
nanosecondns+1 = za nanosekundę

Warto zapamiętać: weekday (dw) oraz dayofyear (dy) zachowują się identycznie jak day — nie oczekuj, że weekday pominie weekend. To częsta pułapka nawet wśród średnio zaawansowanych programistów T-SQL.

Parametr number — liczby dodatnie i ujemne

Drugi parametr akceptuje wartości typu int. Podanie liczby ujemnej powoduje przesunięcie wstecz. Na przykład DATEADD(day, -30, GETDATE()) zwróci datę sprzed 30 dni. Jeżeli wartość nie jest liczbą całkowitą — SQL Server obcina część ułamkową, nie zaokrągla. Zatem DATEADD(month, 2.9, '2026-01-15') doda 2 miesiące, a nie 3.

Parametr date — typy wejściowe

Trzeci argument akceptuje: date, datetime, datetime2, datetimeoffset, smalldatetime oraz time (tylko przy datepartach czasowych). Jeżeli przekażesz time i spróbujesz dodać month — otrzymasz błąd. Ta reguła nie zmieniła się od lat i w 2026 nadal obowiązuje.


Praktyczne przykłady użycia DATEADD

Dodawanie dni i odejmowanie godzin

Najprostszy przypadek to przesunięcie daty o konkretną liczbę dni:

SELECT DATEADD(day, 7, '2026-06-08') AS ZaTydzien;
-- Wynik: 2026-06-15

Przesunięcie wstecz o 3 godziny:

SELECT DATEADD(hour, -3, GETDATE()) AS TrzyGodzinyTemu;

W biznesie spotkasz to przy generowaniu przedziałów czasowych dla raportów — np. „pokaż zamówienia z ostatnich 48 godzin”. Wystarczy:

WHERE OrderDate >= DATEADD(hour, -48, GETDATE())

Obliczanie końca miesiąca i pierwszego dnia kolejnego

Częsty scenariusz księgowy: potrzebujesz ostatniego dnia bieżącego miesiąca. Użyj EOMONTH, ale jeśli chcesz to zrobić wyłącznie z DATEADD (np. dla wersji przed SQL Server 2012):

SELECT DATEADD(day, -1, DATEADD(month, 1, DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1))) AS OstatniDzienMiesiaca;

W nowszych wersjach SQL Server lepiej używać natywnego EOMONTH(GETDATE()), ale znajomość konstrukcji z DATEADD przydaje się przy migracji starszych systemów w 2026 roku — wiele firm wciąż utrzymuje bazy na SQL Server 2016 czy 2019.

Generowanie sekwencji dat

W połączeniu z funkcjami okienkowymi i ROW_NUMBER() możesz wygenerować kalendarz:

WITH Liczby AS (
  SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) - 1 AS n
  FROM sys.all_columns
)
SELECT DATEADD(day, n, '2026-01-01') AS Data
FROM Liczby
WHERE n < 365;

Taka konstrukcja przydaje się w hurtowniach danych, gdzie tabela dat (dimDate) wymaga uzupełnienia o nowe wiersze na początku roku fiskalnego.


DATEDIFF, DATEPART i DATENAME — jak łączyć z DATEADD?

DATEADD rzadko występuje samodzielnie. W prawdziwych zapytaniach towarzyszą mu trzy siostrzane funkcje: DATEDIFF, DATEPART i DATENAME. Opanowanie ich współdziałania to fundament produktywności T-SQL.

DATEDIFF — obliczanie różnicy

DATEDIFF zwraca liczbę jednostek czasu pomiędzy dwiema datami. Częsty wzorzec: znajdź wiek transakcji w dniach:

SELECT DATEDIFF(day, OrderDate, GETDATE()) AS WiekDni FROM Orders;

Połączone z DATEADD daje potężne narzędzie: użytkownik podaje przedział „ostatnie N dni”, a Ty dynamicznie generujesz datę graniczną.

DATEPART — wyciąganie składowej daty

DATEPART zwraca konkretny element daty (rok, miesiąc, dzień tygodnia). Przykład: znajdź wszystkie faktury wystawione w poniedziałki — bez przeliczania dat na tekst:

WHERE DATEPART(weekday, InvoiceDate) = 2

W połączeniu z DATEADD możesz np. obliczyć pierwszy poniedziałek po danej dacie.

DATENAME — nazwa słowna

DATENAME działa podobnie do DATEPART, ale zwraca nazwę miesiąca lub dnia tygodnia w języku ustawionym na serwerze. W raportach SSRS 2026 często widuje się:

SELECT DATENAME(month, DATEADD(month, 1, GETDATE())) AS PrzyszlyMiesiac;

DATEADD w SQL Server 2025 i 2026 — co nowego?

Wydanie SQL Server 2025 (kompilacja wewnętrzna, następca wersji 2022) wprowadziło kilka usprawnień w silniku dat, ale sama funkcja DATEADD pozostała nienaruszona. Microsoft skupił się na optymalizacjach wydajnościowych i integracji z Azure Arc. W 2026 roku warto znać trzy obszary:

Obsługa datetimeoffset i stref czasowych

Od SQL Server 2016 DATEADD obsługuje typ datetimeoffset, ale w wersji 2025 poprawiono wydajność operacji na tym typie przy przesunięciach o dni i godziny. Jeśli Twoja aplikacja działa globalnie — używaj AT TIME ZONE razem z DATEADD:

SELECT DATEADD(hour, 5, SYSDATETIMEOFFSET()) AT TIME ZONE 'Central European Standard Time';

Wydajność w kolumnach generowanych

W SQL Server 2025 zoptymalizowano sposób, w jaki optymalizator zapytań traktuje kolumny wyliczane (computed columns) zawierające DATEADD. Dzięki temu indeksy na takich kolumnach są teraz wykorzystywane agresywniej — co ma znaczenie przy tabelach faktów liczących miliardy wierszy.

SQL Server w Microsoft Fabric

W 2026 roku Microsoft Fabric oferuje natywną obsługę DATEADD w swoich endpointach SQL-owych (zarówno Warehouse, jak i Lakehouse SQL Endpoint). Funkcja zachowuje się identycznie jak w klasycznym SQL Server, więc umiejętności zdobyte w on-premises przenosisz bezpośrednio do chmury.


Najczęstsze błędy i pułapki

Pułapka nr 1: mylenie weekday z dniem roboczym

DATEADD(weekday, 1, '2026-06-05') — piątek. Wynik to sobota. Funkcja nie pomija weekendów. Jeśli potrzebujesz przesunięcia wyłącznie o dni robocze, musisz napisać własną logikę warunkową.

Pułapka nr 2: przepełnienie zakresu dat

SQL Server akceptuje daty od 1 stycznia 1753 do 31 grudnia 9999 (dla datetime). Próba dodania miliona lat zakończy się błędem:

The datepart parameter is out of range.

Pułapka nr 3: brakujące godziny przy zmianie czasu

DATEADD(hour, 24, '2026-03-28 02:00:00') w strefie CET nie uwzględni przejścia na czas letni. Wynik to 2026-03-29 02:00:00 — a w rzeczywistości z punktu widzenia zegara ściennego minęło 23 lub 25 godzin. Do obliczeń biznesowych z uwzględnieniem DST używaj datetimeoffset i AT TIME ZONE.

Pułapka nr 4: niejawne konwersje typów

Przekazanie łańcucha znaków jako daty działa, ale poleganie na domyślnej konwersji to proszenie się o błąd przy zmianie ustawień językowych serwera. Zawsze jawnie konwertuj:

-- ŹLE, zależne od języka serwera:
DATEADD(day, 10, '06/08/2026')

-- DOBRZE:
DATEADD(day, 10, '2026-06-08')

Częste pytania

Czy DATEADD działa na typie time?

Tak, ale tylko z datepartami czasowymi: hour, minute, second, millisecond, microsecond, nanosecond. Próba dodania day lub month do wartości typu time kończy się błędem.

Jaka jest różnica między day a dayofyear?

Z perspektywy DATEADD — żadna. Obie wartości dają identyczny rezultat. Różnica istnieje tylko w DATEPART, gdzie dayofyear zwraca numer dnia w roku (1–366), a day — numer dnia w miesiącu.

Czy liczba w DATEADD może być ułamkiem?

SQL Server obcina część ułamkową (nie zaokrągla), ale takie zachowanie jest niezalecane w kodzie produkcyjnym — zmniejsza czytelność i może prowadzić do nieporozumień.

Jak dodać miesiące, unikając problemu z 31. dniem?

Jeśli do 31 stycznia dodasz miesiąc, DATEADD(month, 1, '2026-01-31') zwróci 28 lutego 2026 (lub 29 w roku przestępnym). To poprawne i zgodne z dokumentacją — SQL Server nie próbuje „dopasować” wyniku do 31. dnia.

Czy DATEADD obsługuje lata przestępne?

Tak, w pełni. DATEADD(year, 1, '2024-02-29') zwraca 2025-02-28, ponieważ rok 2025 nie jest przestępny. Silnik automatycznie koryguje datę do poprawnej wartości kalendarzowej.

Jak szybko działa DATEADD na dużych tabelach?

DATEADD jest funkcją deterministyczną i wysoce zoptymalizowaną. W SQL Server 2025 operacja na 10 milionach wierszy z WHERE DATEADD(day, -30, GETDATE()) wykonuje się w czasie poniżej sekundy na przeciętnym sprzęcie serwerowym — pod warunkiem odpowiedniego indeksowania.

Czy mogę używać DATEADD wewnątrz WHERE bez utraty wydajności?

Tak, pod warunkiem, że nie stosujesz DATEADD na kolumnie. Porównaj:

-- WOLNO: funkcja na kolumnie uniemożliwia użycie indeksu
WHERE DATEADD(day, 30, OrderDate) > GETDATE()

-- SZYBKO: funkcja na wartości stałej, indeks działa
WHERE OrderDate > DATEADD(day, -30, GETDATE())

Czy DATEADD działa inaczej w Azure SQL niż w on-premises?

Nie. Microsoft utrzymuje spójność API między SQL Server on-premises a Azure SQL Database. Jedyna różnica to ścieżka wdrożenia aktualizacji — Azure otrzymuje poprawki szybciej.

Czy funkcja DATEADD obsługuje kalendarze inne niż gregoriański?

Nie natywnie. SQL Server zawsze operuje na kalendarzu gregoriańskim. Jeśli potrzebujesz obsługi kalendarza hijri lub fiscal 4-4-5 — musisz zbudować własną warstwę abstrakcji.

Czy warto kupić licencję SQL Server 2025 dla lepszej wydajności DATEADD?

Wydajność samej funkcji DATEADD nie zmieniła się drastycznie od wersji 2016. Decyzja o zakupie nowszej wersji SQL Server powinna opierać się na innych czynnikach — skalowalności, bezpieczeństwie, wsparciu dla kontenerów Linux i integracji z chmurą. Jeśli planujesz migrację lub nowe wdrożenie, KluczeSoft.pl oferuje oryginalne licencje Microsoft SQL Server w konkurencyjnych cenach z natychmiastową dostawą — co przy budżetowaniu projektów IT w 2026 roku realnie obniża całkowity koszt posiadania infrastruktury.


Podsumowanie

Funkcja dateadd sql server to coś więcej niż prosty dodatek arytmetyczny do dat. To mechanizm napędzający logikę biznesową w raportach, systemach ERP, hurtowniach danych i integracjach międzyplatformowych. Znajomość jej niuansów — od różnic między weekday a day, przez interakcję z DATEDIFF i DATEPART, aż po optymalizację zapytań na miliardowych zbiorach — odróżnia juniora od inżyniera, któremu można powierzyć architekturę systemu.

Kluczowe wnioski: używaj jawnych konwersji typów, pamiętaj o pułapkach stref czasowych, buduj zapytania tak, aby DATEADD operował na stałych, a nie na kolumnach — i testuj wyniki na danych brzegowych. SQL Server w 2026 roku daje Ci solidne, przewidywalne narzędzie. Wystarczy, że użyjesz go świadomie.

Sprawdź też

Potrzebujesz licencji? Microsoft SQL Server — sprawdź ofertę KluczeSoft.pl — legalne klucze, faktura VAT, dostawa e-mail.

<!-- INLINE-LINKS-V1 -->

Najczęściej zadawane pytania

Tak, ale tylko z datepartami czasowymi: `hour`, `minute`, `second`, `millisecond`, `microsecond`, `nanosecond`. Próba dodania `day` lub `month` do wartości typu `time` kończy się błędem.
Z perspektywy `DATEADD` — żadna. Obie wartości dają identyczny rezultat. Różnica istnieje tylko w `DATEPART`, gdzie `dayofyear` zwraca numer dnia w roku (1–366), a `day` — numer dnia w miesiącu.
SQL Server obcina część ułamkową (nie zaokrągla), ale takie zachowanie jest niezalecane w kodzie produkcyjnym — zmniejsza czytelność i może prowadzić do nieporozumień.
Jeśli do 31 stycznia dodasz miesiąc, `DATEADD(month, 1, '2026-01-31')` zwróci 28 lutego 2026 (lub 29 w roku przestępnym). To poprawne i zgodne z dokumentacją — SQL Server nie próbuje „dopasować” wyniku do 31. dnia.
Tak, w pełni. `DATEADD(year, 1, '2024-02-29')` zwraca `2025-02-28`, ponieważ rok 2025 nie jest przestępny. Silnik automatycznie koryguje datę do poprawnej wartości kalendarzowej.
`DATEADD` jest funkcją deterministyczną i wysoce zoptymalizowaną. W SQL Server 2025 operacja na 10 milionach wierszy z `WHERE DATEADD(day, -30, GETDATE())` wykonuje się w czasie poniżej sekundy na przeciętnym sprzęcie serwerowym — pod warunkiem odpowiedniego indeksowania.
Tak, pod warunkiem, że nie stosujesz `DATEADD` na kolumnie. Porównaj: ```sql -- WOLNO: funkcja na kolumnie uniemożliwia użycie indeksu WHERE DATEADD(day, 30, OrderDate) > GETDATE() -- SZYBKO: funkcja na wartości stałej, indeks działa WHERE OrderDate > DATEADD(day, -30, GETDATE()) ```
Nie. Microsoft utrzymuje spójność API między SQL Server on-premises a Azure SQL Database. Jedyna różnica to ścieżka wdrożenia aktualizacji — Azure otrzymuje poprawki szybciej.
Nie natywnie. SQL Server zawsze operuje na kalendarzu gregoriańskim. Jeśli potrzebujesz obsługi kalendarza hijri lub fiscal 4-4-5 — musisz zbudować własną warstwę abstrakcji.
Wydajność samej funkcji `DATEADD` nie zmieniła się drastycznie od wersji 2016. Decyzja o zakupie nowszej wersji SQL Server powinna opierać się na innych czynnikach — skalowalności, bezpieczeństwie, wsparciu dla kontenerów Linux i integracji z chmurą. Jeśli planujesz migrację lub nowe wdrożenie, KluczeSoft.pl oferuje oryginalne licencje Microsoft SQL Server w konkurencyjnych cenach z natychmiastową dostawą — co przy budżetowaniu projektów IT w 2026 roku realnie obniża całkowity koszt posiadania infrastruktury. ---

Czy ten artykuł był pomocny?