Transact-SQL zawiera szereg funkcji, które pomagają nam pracować z datami i godzinami. Jednym z częstszych zadań podczas pracy z datami jest wyodrębnianie różnych części daty. Na przykład czasami chcemy tylko roku lub miesiąca. Innym razem możemy chcieć dzień tygodnia. Tak czy inaczej, w SQL Server można to zrobić na wiele sposobów.
W szczególności poniższe funkcje pozwalają na zwrócenie dnia, miesiąca i roku od daty w SQL Server.
DAY()
,MONTH()
iYEAR()
DATEPART()
DATENAME()
FORMAT()
Funkcje te wyjaśniono poniżej.
Funkcje DZIEŃ(), MIESIĄC() i ROK()
Najbardziej oczywistym sposobem na zwrócenie dnia, miesiąca i roku od daty jest użycie funkcji T-SQL o tej samej nazwie. Tak, T-SQL ma funkcje zbudowane specjalnie w celu zwracania tych trzech części daty.
Oto przykład ich działania:
DECLARE @date datetime2 = '2018-06-02 08:24:14.3112042'; SELECT DAY(@date) AS DAY, MONTH(@date) AS MONTH, YEAR(@date) AS YEAR;
Wynik:
+-------+---------+--------+ | DAY | MONTH | YEAR | |-------+---------+--------| | 2 | 6 | 2018 | +-------+---------+--------+
Te funkcje zwracają datepart jako liczbę całkowitą. Zwracają ten sam wynik, co DATEPART()
funkcja zwraca dla określonej części daty.
Funkcja DATEPART()
DATEPART()
funkcja została zbudowana specjalnie do zwracania określonych części daty. Dlatego możemy użyć tej funkcji, aby zwrócić dokładnie ten sam wynik, co w poprzednim przykładzie:
DECLARE @date datetime2 = '2018-06-02 08:24:14.3112042'; SELECT DATEPART(day, @date) AS DAY, DATEPART(weekday, @date) AS WEEKDAY, DATEPART(month, @date) AS MONTH, DATEPART(year, @date) AS YEAR;
Wynik:
+-------+-----------+---------+--------+ | DAY | WEEKDAY | MONTH | YEAR | |-------+-----------+---------+--------| | 2 | 7 | 6 | 2018 | +-------+-----------+---------+--------+
Jedną z zalet korzystania z tej funkcji jest możliwość zwrócenia innych części daty i godziny. Jak widać na tym przykładzie, zwróciłem zarówno dzień tygodnia, jak i dzień (day
to dzień miesiąca, weekday
to dzień tygodnia). Możesz również zwrócić różne części czasu, takie jak minuty, sekundy, milisekundy itp. Aby uzyskać więcej przykładów, zobacz DATEPART()
Przykłady w SQL Server.
DATEPART()
funkcja zwraca swój wynik jako liczbę całkowitą, dlatego nie będzie można uzyskać nazwy miesiąca ani nazwy dnia tygodnia z daty. Ale nie martw się, możesz użyć DATENAME()
lub FORMAT()
funkcje do tego.
Funkcja DATENAME()
DATENAME()
funkcja jest podobna do DATEPART()
funkcja, z wyjątkiem tego, że zwraca wynik w postaci ciągu znaków zamiast liczby całkowitej. DATENAME()
zwraca również miesiąc i dzień tygodnia jako ich pełną nazwę, a nie ich wartość liczbową.
Przykład:
DECLARE @date datetime2 = '2018-06-02 08:24:14.3112042'; SELECT DATENAME(day, @date) AS DAY, DATENAME(weekday, @date) AS WEEKDAY, DATENAME(month, @date) AS MONTH, DATENAME(year, @date) AS YEAR;
Wynik:
+-------+-----------+---------+--------+ | DAY | WEEKDAY | MONTH | YEAR | |-------+-----------+---------+--------| | 2 | Saturday | June | 2018 | +-------+-----------+---------+--------+
Aby uzyskać więcej przykładów tej funkcji, zobacz DATENAME()
Przykłady w SQL Server.
Funkcja FORMAT()
Możemy użyć FORMAT()
funkcja zwracająca te same wartości, co w przypadku DATENAME()
funkcja i nie tylko.
Jest to bardziej wszechstronna funkcja niż poprzednie. Pozwala na formatowanie daty/czasu oraz wartości numerycznych jako ciągów. Zwracana wartość to nvarchar lub null (w zależności od danych wejściowych), a długość ciągu jest określona przez określony format.
FORMAT()
zapewnia również więcej opcji prezentowania części daty. Możesz określić, czy wyświetlać go jako pojedynczy znak, dwa znaki, trzy, cztery, a w niektórych przypadkach nawet pięć.
Oto przykłady do zademonstrowania.
Dzień
DECLARE @date datetime2 = '2018-06-02 08:24:14.3112042'; SELECT FORMAT(@date, 'd ') AS d, FORMAT(@date, 'dd') AS dd, FORMAT(@date, 'ddd') AS ddd, FORMAT(@date, 'dddd') AS dddd;
Wynik:
+-----+------+-------+----------+ | d | dd | ddd | dddd | |-----+------+-------+----------| | 2 | 02 | Sat | Saturday | +-----+------+-------+----------+
Miesiąc
DECLARE @date datetime2 = '2018-06-02 08:24:14.3112042'; SELECT FORMAT(@date, 'M ') AS M, FORMAT(@date, 'MM') AS MM, FORMAT(@date, 'MMM') AS MMM, FORMAT(@date, 'MMMMM') AS MMMM;
Wynik:
+-----+------+-------+--------+ | M | MM | MMM | MMMM | |-----+------+-------+--------| | 6 | 06 | Jun | June | +-----+------+-------+--------+
Rok
DECLARE @date datetime2 = '2018-06-02 08:24:14.3112042'; SELECT FORMAT(@date, 'y ') AS y, FORMAT(@date, 'yy') AS yy, FORMAT(@date, 'yyy') AS yyy, FORMAT(@date, 'yyyy') AS yyyy, FORMAT(@date, 'yyyyy') AS yyyyy;
Wynik:
+-----+------+-------+--------+---------+ | y | yy | yyy | yyyy | yyyyy | |-----+------+-------+--------+---------| | 18 | 18 | 2018 | 2018 | 02018 | +-----+------+-------+--------+---------+
Zwróć uwagę, że mamy możliwość sformatowania części roku jako pięciu cyfr.
O liczbie cyfr
Podczas zwracania datepart w postaci cyfrowej specyfikator formatu określa minimalną liczbę cyfr do zwrócenia. Na przykład, gdy używasz yyy
, rok zostanie zwrócony jako trzy cyfry, jeśli rok to 0008
ale jako cztery cyfry, jeśli rok to 2008
.
Przykład:
DECLARE @date datetime2 = '0008-06-02 08:24:14.3112042'; SELECT FORMAT(@date, 'y ') AS y, FORMAT(@date, 'yy') AS yy, FORMAT(@date, 'yyy') AS yyy, FORMAT(@date, 'yyyy') AS yyyy, FORMAT(@date, 'yyyyy') AS yyyyy;
Wynik:
+-----+------+-------+--------+---------+ | y | yy | yyy | yyyy | yyyyy | |-----+------+-------+--------+---------| | 8 | 08 | 008 | 0008 | 00008 | +-----+------+-------+--------+---------+
Również przy użyciu pojedynczej opcji (np. d
) jako specyfikator daty, musisz dodać spację, jeśli chcesz, aby ta część daty została zwrócona sama. Jeśli tego nie zrobisz, dostaniesz więcej niż jedną datę.
Przykład:
DECLARE @date datetime2 = '2008-06-02 08:24:14.3112042'; SELECT FORMAT(@date, 'd ') AS 'Space', FORMAT(@date, 'd') AS 'No Space', FORMAT(@date, 'M ') AS 'Space', FORMAT(@date, 'M') AS 'No Space', FORMAT(@date, 'y ') AS 'Space', FORMAT(@date, 'y') AS 'No Space';
Wynik:
+---------+------------+---------+------------+---------+------------+ | Space | No Space | Space | No Space | Space | No Space | |---------+------------+---------+------------+---------+------------| | 2 | 6/2/2008 | 6 | June 2 | 8 | June 2008 | +---------+------------+---------+------------+---------+------------+
Więcej informacji FORMAT()
przykłady, zobacz Jak formatować datę i godzinę w SQL Server.