Zależność języka od funkcji daty w SQL Server dotyczy formatu, w jakim interpretowane i zwracane są wartości chronologiczne.
Jak SQL Server wiąże język sesji z datą
W SQL Server ustawienie języka sesji wpływa na sposób obsługi części operacji dotyczących dat i czasu. Polecenie SET LANGUAGE wybiera język używany przez bieżące połączenie, a wraz z nim między innymi domyślny format daty oraz pierwszy dzień tygodnia. Przykładowo ustawienie SET LANGUAGE Polish; powoduje, że nazwy miesięcy i dni tygodnia zwracane przez funkcje tekstowe są polskie, a interpretacja niektórych niejednoznacznych zapisów daty odbywa się według ustawień przypisanych do języka.
Język sesji nie zmienia fizycznego typu danych date, datetime, datetime2 ani datetimeoffset. Wartość daty jest przechowywana jako wartość binarna właściwa dla danego typu, natomiast język ma znaczenie przede wszystkim podczas konwersji tekstu na datę oraz podczas formatowania wyniku zwracanego jako tekst. Ustawienie obowiązuje w ramach konkretnej sesji połączenia, dlatego dwie sesje wykonujące podobne zapytanie mogą otrzymać różne wyniki, jeśli zostały uruchomione z innym językiem domyślnym.
SET LANGUAGE, SET DATEFORMAT i niejednoznaczne zapisy
Do sprawdzenia bieżącego języka sesji można użyć funkcji @@LANGUAGE. Informacje o językach skonfigurowanych w instancji są dostępne w widoku systemowym sys.syslanguages. Sam język ustala między innymi domyślne ustawienie kolejności składników daty, ale kolejność można zmienić niezależnie dla bieżącej sesji poleceniem SET DATEFORMAT. Dostępne ustawienia obejmują między innymi mdy, dmy i ymd.
Różnica między SET LANGUAGE a SET DATEFORMAT jest istotna przy analizie błędów. SET LANGUAGE zmienia szerszy zestaw ustawień sesji, w tym nazwy miesięcy i dni tygodnia oraz wartość pierwszego dnia tygodnia. SET DATEFORMAT zmienia wyłącznie kolejność interpretowania liczbowych składników daty. Jeżeli zapytanie zawiera tekst '03/04/2026', rezultat może oznaczać 3 kwietnia albo 4 marca, zależnie od ustawienia. Taki zapis nie powinien być używany w kodzie, który działa w wielu środowiskach lub połączeniach.
Funkcje daty zależne od ustawień sesji
Wpływ języka jest widoczny w funkcji DATENAME. Dla tej samej wartości daty wyrażenie DATENAME(month, data) może zwrócić nazwę miesiąca w języku angielskim albo polskim, zależnie od ustawienia sesji. Funkcja DATEPART zwraca natomiast liczbę, na przykład numer miesiąca, dnia lub tygodnia. Przy obliczaniu numeru tygodnia i dnia tygodnia znaczenie ma także SET DATEFIRST, ponieważ określa, który dzień jest traktowany jako pierwszy dzień tygodnia.
W praktyce nie należy używać tekstowego wyniku DATENAME jako stabilnego klucza sortowania, wartości do porównań ani elementu logiki biznesowej. Nazwa miesiąca może zmienić się po zmianie języka sesji, a nazwa dnia tygodnia może zależeć od ustawień regionalnych. Bezpieczniejszym rozwiązaniem jest operowanie na typach daty i liczbowych częściach daty, takich jak rok, miesiąc i dzień. Tekst można wygenerować dopiero na granicy systemu, na przykład podczas przygotowywania prezentacji dla użytkownika.
Kontrola konwersji i diagnostyka wyników
Najpewniejszą metodą ograniczenia zależności od języka jest używanie parametrów o typach daty zamiast składania zapytań z tekstowych fragmentów. Gdy tekstowa postać daty jest konieczna, należy stosować jednoznaczne formaty oraz jawne style funkcji CONVERT, odpowiednie do konkretnego typu danych i sposobu użycia. Warto pamiętać, że zachowanie części formatów tekstowych może zależeć od typu docelowego, dlatego format powinien być dobrany świadomie, a nie na podstawie przypadkowego wyniku jednego testu.
Podczas diagnozowania problemu należy sprawdzić pełny kontekst sesji: wartość @@LANGUAGE, ustawienie DATEFORMAT, ustawienie DATEFIRST, typ kolumny oraz sposób wykonywania konwersji. Trzeba również ustalić, czy data pochodzi z parametru, pliku, formularza, procedury składowanej czy bezpośrednio z literału SQL. Jeżeli wyniki zmieniają się po przełączeniu języka, przyczyną zwykle jest niejawna konwersja tekstu albo użycie funkcji zwracającej nazwy zależne od języka, a nie uszkodzenie samej wartości zapisanej w kolumnie.
W przypadku problemów z datami w komputerze biurowym lub aplikacji korzystającej z SQL Server potrzebna jest analiza zarówno zapytania, jak i konfiguracji połączenia. Diagnostyka powinna obejmować sprawdzenie typów danych, parametrów przekazywanych przez aplikację oraz wyników tego samego zapytania uruchomionego w różnych sesjach. Taka weryfikacja pozwala odróżnić błąd interpretacji tekstu od błędu obliczeń, sortowania lub prezentacji daty.