W SQL Server FORMAT()
Funkcja umożliwia sformatowanie wartości daty/godziny i liczb jako sformatowanego ciągu poprzez przekazanie „ciągu formatującego” jako drugiego argumentu (pierwszy argument to wartość, która jest formatowana).
Oto przykład działania tej funkcji:
FORMAT(@date, 'dd/MM/yyyy');
W tym przypadku ciąg formatu to dd/MM/rrrr .
Ten konkretny ciąg formatu określa, że @date
wartość powinna być sformatowana z dwucyfrowym dniem, dwucyfrowym miesiącem i czterocyfrowym rokiem, w tej kolejności oraz z ukośnikami jako separatorami.
Dałoby to coś takiego:
21/05/2019
łańcuch formatu to łańcuch, który zawiera jeden lub więcej predefiniowanych specyfikatorów formatu , które są pojedynczymi znakami lub grupami znaków, które definiują sposób formatowania danych wyjściowych.
SQL Server akceptuje tylko ciągi formatu, które są obsługiwane przez .NET Framework.
Ciąg formatu może być ciągiem formatu standardowego lub ciągiem formatu niestandardowego. Oto jak to działa:
- ciąg znaków formatu standardowego to wstępnie zdefiniowany ciąg formatu. Zawiera pojedynczy specyfikator formatu, który jest interpretowany jako reprezentujący określony, predefiniowany format. Ciągi formatu standardowego są w rzeczywistości aliasami ciągów formatu niestandardowego. Jednak rzeczywisty używany ciąg formatu niestandardowego często zależy od kultury.
- łańcuch formatu niestandardowego z drugiej strony składa się z jednego lub więcej niestandardowych specyfikatorów formatu, które w połączeniu ze sobą definiują format. Pozwala to na znacznie większą elastyczność w definiowaniu wyglądu danych wyjściowych.
Przykład 1 – Standardowy ciąg formatu
Oto przykład pokazujący, jak działają standardowe ciągi formatu.
SELECT FORMAT(1234, 'C') AS Result;
Wynik:
+-----------+ | Result | |-----------| | $1,234.00 | +-----------+
W tym przykładzie C
jest ciągiem formatu. W tym przypadku jest to standardowy ciąg formatu liczbowego składający się z jednego specyfikatora formatu. Ten konkretny specyfikator formatu służy do reprezentowania kwoty w walucie.
Możemy również uzyskać ten sam wynik, używając niestandardowego ciągu formatu liczb.
Przykład 2 – Ciąg formatu niestandardowego
Ten przykład generuje te same dane wyjściowe, co w poprzednim przykładzie. Różnica polega na tym, że w tym przykładzie używam niestandardowego ciąg formatu zamiast standardowego.
SELECT FORMAT(1234, '$#,###.00') AS Result;
Wynik:
+-----------+ | Result | |-----------| | $1,234.00 | +-----------+
łańcuch formatu niestandardowego pozwala na stworzenie własnego, niestandardowego formatu. Możesz łączyć ciągi ze specyfikatorami formatu, aby zbudować własny format niestandardowy.
W tym przykładzie używam #
specyfikator formatu, który jest symbolem zastępczym dla cyfry. Jeśli cyfra nie jest obecna, w wynikowym ciągu nie pojawia się żadna cyfra.
Używam również 0
specyfikator formatu, który jest również symbolem zastępczym dla dowolnej cyfry. Ale w tym przypadku, jeśli cyfra nie jest obecna, zamiast tego używane jest zero.
Dołączam również $
, ,
i .
ciągi literałów w ciągu formatu. Są one uwzględniane w danych wyjściowych dokładnie tak, jak są.
Jeśli zmniejszymy liczbę wejściową, zobaczymy, jak różni się wynik między 0
i #
specyfikatory formatu i ich porównanie z C
specyfikator formatu standardowego z poprzedniego przykładu:
SELECT FORMAT(34, 'C') AS 'C', FORMAT(34, '$0,000.00') AS '0', FORMAT(34, '$#,###.00') AS '#';
Wynik:
+--------+-----------+--------+ | C | 0 | # | |--------+-----------+--------| | $34.00 | $0,034.00 | $34.00 | +--------+-----------+--------+
Jak można sobie wyobrazić, niestandardowe ciągi formatu zapewniają znacznie większą elastyczność niż ciągi formatu standardowego.
Istnieje jednak wiele scenariuszy, w których ciągi formatu standardowego mogą być bardziej zaawansowane, zwłaszcza jeśli chodzi o generowanie dynamicznych wyników, które uwzględniają kulturę. Więcej o kulturze wkrótce.
Przykład 3 – Formatowanie daty i godziny
Wartości daty/godziny umożliwiają również wybór standardowych lub niestandardowych ciągów formatu. Oto przykład wartości daty/godziny sformatowanej za pomocą standardowego ciągu formatu, a także niektórych niestandardowych ciągów formatu.
DECLARE @date datetime2(7); SET @date = '2080-05-01 23:09:08.1234567'; SELECT FORMAT(@date, 'd') AS 'd', FORMAT(@date, 'M/d/yyyy') AS 'M/d/yyyy', FORMAT(@date, 'dd/MM/yy') AS 'dd/MM/yy', FORMAT(@date, 'ddd, MMM dd, yy') AS 'ddd, MMM dd, yy', FORMAT(@date, 'dddd, dd MMMM yyyy') AS 'dddd, dd MMMM yyyy';
Wynik:
+----------+------------+------------+-------------------+------------------------+ | d | M/d/yyyy | dd/MM/yy | ddd, MMM dd, yy | dddd, dd MMMM yyyy | |----------+------------+------------+-------------------+------------------------| | 5/1/2080 | 5/1/2080 | 01/05/80 | Wed, May 01, 80 | Wednesday, 01 May 2080 | +----------+------------+------------+-------------------+------------------------+
Pierwsza z nich używa standardowego ciągu formatującego, a pozostałe cztery używają niestandardowych ciągów formatujących.
Aby uzyskać pełną listę dostępnych ciągów formatu daty i godziny, zobacz:
- Lista standardowych ciągów formatu daty/godziny
- Lista niestandardowych ciągów formatu daty/godziny
Przykład 4 – Kultura
Wyniki ciągów formatu mogą czasami zależeć od używanej kultury. Na przykład w Stanach Zjednoczonych format daty krótkiej jest przedstawiany jako „M/d/rrrr”, ale w Wielkiej Brytanii jest przedstawiany jako „dd/MM/rrrr”.
Domyślnie język bieżącej sesji jest używany do definiowania kultury. Jednak FORMAT()
funkcja pozwala to zmienić.
Składnia funkcji wygląda następująco:
FORMAT ( value, format [, culture ] )
Pozwala więc określić kulturę jako opcjonalny argument.
Oto przykład, w którym różne kultury mogą skutkować pojedynczym ciągiem formatu dającym wiele różnych formatów.
DECLARE @date datetime2(7); SET @date = '2080-05-01 23:09:08.1234567'; SELECT FORMAT(@date, 'd', 'en-us') AS 'US English', FORMAT(@date, 'd', 'en-gb') AS 'British', FORMAT(@date, 'd', 'de-de') AS 'German', FORMAT(@date, 'd', 'jp-jp') AS 'Japanese';
Wynik:
+--------------+------------+------------+------------+ | US English | British | German | Japanese | |--------------+------------+------------+------------| | 5/1/2080 | 01/05/2080 | 01.05.2080 | 05/01/2080 | +--------------+------------+------------+------------+
W tym przypadku wszystkie cztery kraje używają d
standardowy ciąg formatu daty i godziny. Jednak wszyscy używają innego argumentu kulturowego. Daje to inny wynik pasujący do każdej kultury.
I to nie tylko standard ciągi formatu, na które ma wpływ kultura. Kultura może również wpływać na wynik niestandardowego ciągi formatu. Oto przykład:
DECLARE @date datetime2(7); SET @date = '2080-05-01 23:09:08.1234567'; SELECT FORMAT(@date, 'dddd, dd MMMM', 'en-us') AS 'US English', FORMAT(@date, 'dddd, dd MMMM', 'de-de') AS 'German', FORMAT(@date, 'dddd, dd MMMM', 'vi') AS 'Vietnamese', FORMAT(@date, 'dddd, dd MMMM', 'sv') AS 'Swedish';
Wynik:
+-------------------+------------------+----------------------+----------------+ | US English | German | Vietnamese | Swedish | |-------------------+------------------+----------------------+----------------| | Wednesday, 01 May | Mittwoch, 01 Mai | Thứ Tư, 01 Tháng Năm | onsdag, 01 maj | +-------------------+------------------+----------------------+----------------+
Masz również możliwość korzystania z niezmiennej kultury (iv
). Kultura niezmienna jest kulturowo niewrażliwa. Jest powiązany z językiem angielskim, ale nie z żadnym krajem/regionem. Aby uzyskać więcej informacji i przykładów, zobacz Jak określić niezmienną kulturę podczas korzystania z FORMAT() w SQL Server.