Transact-SQL bao gồm một loạt các hàm giúp chúng ta làm việc với ngày và giờ. Một trong những tác vụ phổ biến hơn khi làm việc với ngày tháng là trích xuất các phần khác nhau của ngày tháng. Ví dụ, đôi khi chúng ta chỉ muốn năm hoặc tháng. Những thời điểm khác, chúng tôi có thể muốn ngày trong tuần. Dù bằng cách nào, có rất nhiều cách để thực hiện việc này trong SQL Server.
Đặc biệt, các hàm sau cho phép bạn trả về ngày, tháng và năm từ một ngày trong SQL Server.
-
DAY()
,MONTH()
vàYEAR()
-
DATEPART()
-
DATENAME()
-
FORMAT()
Các chức năng này được giải thích bên dưới.
Các hàm DAY (), MONTH () và YEAR ()
Cách rõ ràng nhất để trả về ngày, tháng và năm từ một ngày là sử dụng các hàm T-SQL có cùng tên. Có, T-SQL có các hàm được xây dựng đặc biệt cho mục đích trả về ba thời điểm ngày tháng này.
Dưới đây là một ví dụ về cách chúng hoạt động:
DECLARE @date datetime2 = '2018-06-02 08:24:14.3112042'; SELECT DAY(@date) AS DAY, MONTH(@date) AS MONTH, YEAR(@date) AS YEAR;
Kết quả:
+-------+---------+--------+ | DAY | MONTH | YEAR | |-------+---------+--------| | 2 | 6 | 2018 | +-------+---------+--------+
Các hàm này trả về datepart dưới dạng số nguyên. Chúng trả về cùng một kết quả mà DATEPART()
hàm trả về cho thời gian đã chỉ định.
Hàm DATEPART ()
DATEPART()
chức năng được xây dựng đặc biệt để trả về các phần cụ thể của một ngày. Do đó, chúng ta có thể sử dụng hàm này để trả về kết quả chính xác giống như ví dụ trước:
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;
Kết quả:
+-------+-----------+---------+--------+ | DAY | WEEKDAY | MONTH | YEAR | |-------+-----------+---------+--------| | 2 | 7 | 6 | 2018 | +-------+-----------+---------+--------+
Một lợi ích của việc sử dụng chức năng này là bạn cũng có thể trả lại các phần khác của ngày và giờ. Như bạn có thể thấy với ví dụ này, tôi đã trả lại ngày trong tuần cũng như ngày (day
là ngày trong tháng, weekday
là ngày trong tuần). Bạn cũng có thể trả về các phần thời gian khác nhau, chẳng hạn như phút, giây, mili giây, v.v. Để biết thêm ví dụ, hãy xem DATEPART()
Ví dụ trong SQL Server.
DATEPART()
hàm trả về kết quả của nó dưới dạng số nguyên và do đó, bạn sẽ không thể lấy tên tháng hoặc tên ngày trong tuần từ ngày. Nhưng đừng lo lắng, bạn có thể sử dụng DATENAME()
hoặc FORMAT()
chức năng cho điều đó.
Hàm DATENAME ()
DATENAME()
chức năng tương tự như DATEPART()
, ngoại trừ việc nó trả về kết quả là một chuỗi ký tự thay vì một số nguyên. DATENAME()
cũng trả về tháng và ngày trong tuần dưới dạng tên đầy đủ của chúng, thay vì giá trị số của chúng.
Ví dụ:
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;
Kết quả:
+-------+-----------+---------+--------+ | DAY | WEEKDAY | MONTH | YEAR | |-------+-----------+---------+--------| | 2 | Saturday | June | 2018 | +-------+-----------+---------+--------+
Để biết thêm ví dụ về hàm này, hãy xem DATENAME()
Ví dụ trong SQL Server.
Hàm FORMAT ()
Chúng ta có thể sử dụng FORMAT()
hàm để trả về các giá trị giống như với DATENAME()
chức năng và hơn thế nữa.
Đây là một chức năng linh hoạt hơn những cái trước. Nó cho phép bạn định dạng ngày / giờ cũng như các giá trị số dưới dạng chuỗi. Giá trị trả về là nvarchar hoặc null (tùy thuộc vào đầu vào) và độ dài của chuỗi được xác định theo định dạng được chỉ định.
FORMAT()
cũng cung cấp nhiều tùy chọn hơn về cách trình bày datepart. Bạn có thể chỉ định có hiển thị nó dưới dạng một ký tự, hai ký tự, ba, bốn và thậm chí năm trong một số trường hợp hay không.
Dưới đây là các ví dụ để minh chứng.
Ngày
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;
Kết quả:
+-----+------+-------+----------+ | d | dd | ddd | dddd | |-----+------+-------+----------| | 2 | 02 | Sat | Saturday | +-----+------+-------+----------+
Tháng
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;
Kết quả:
+-----+------+-------+--------+ | M | MM | MMM | MMMM | |-----+------+-------+--------| | 6 | 06 | Jun | June | +-----+------+-------+--------+
Năm
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;
Kết quả:
+-----+------+-------+--------+---------+ | y | yy | yyy | yyyy | yyyyy | |-----+------+-------+--------+---------| | 18 | 18 | 2018 | 2018 | 02018 | +-----+------+-------+--------+---------+
Lưu ý rằng chúng tôi có tùy chọn định dạng phần năm dưới dạng năm chữ số.
Giới thiệu về số lượng chữ số
Khi trả về một datepart ở dạng chữ số, bộ định dạng xác định số lượng chữ số tối thiểu để trả về. Ví dụ:khi sử dụng yyy
, năm sẽ được trả về dưới dạng ba chữ số nếu năm là 0008
nhưng dưới dạng bốn chữ số nếu năm là 2008
.
Ví dụ:
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;
Kết quả:
+-----+------+-------+--------+---------+ | y | yy | yyy | yyyy | yyyyy | |-----+------+-------+--------+---------| | 8 | 08 | 008 | 0008 | 00008 | +-----+------+-------+--------+---------+
Ngoài ra, khi sử dụng tùy chọn duy nhất (ví dụ:d
) với tư cách là bộ chỉ định ngày, bạn sẽ cần thêm khoảng trắng nếu bạn chỉ muốn phần ngày đó được trả về bởi chính nó. Nếu bạn không làm điều này, bạn sẽ nhận được nhiều hơn thời gian hẹn hò duy nhất đó.
Ví dụ:
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';
Kết quả:
+---------+------------+---------+------------+---------+------------+ | Space | No Space | Space | No Space | Space | No Space | |---------+------------+---------+------------+---------+------------| | 2 | 6/2/2008 | 6 | June 2 | 8 | June 2008 | +---------+------------+---------+------------+---------+------------+
Để biết thêm FORMAT()
ví dụ, hãy xem Cách định dạng ngày và giờ trong SQL Server.