Truy vấn ngày tháng trong SQL Server

 

Để công việc của chúng ta thuận tiện hơn, tôi và các bạn hãy cùng nhau tìm hiểu các hàm làm việc với kiểu dữ liệu Ngày tháng/ Thời gian trong SQL.

Truy vấn ngày tháng trong SQL Server

Mục lục

1 Hàm GETDATE

Hàm GETDATE trả về ngày giờ lúc thực hiện câu truy vấn.

Ví dụ:

select getdate()

2 Hàm DAY/ MONTH/ YEAR

Hàm DAY trả về ngày của một một giá trị thuộc kiểu datetime.

Hàm MONTH trả về tháng của một giá trị thuộc kiểu datetime

Hàm YEAR trả về năm của một giá trị thuộc kiểu datetime.

Ví dụ:

select day(orderdate) as DAYOFORDER, month(orderdate) as MONTHOFORDER, year(orderdate) as YEAROFORDER from orders o inner join customers c on c.cus tomerid = o.customerid where c.customerid = 3

Truy vấn ngày tháng trong SQL Server

3 Hàm DATEPART

Trong quá trình làm việc với các CSDL, đôi lúc ta muốn biết xem một ng ày nào đó thuộc quý mấy trong năm, hay thuộc tuần thứ mấy trong tháng . Hàm DATEPART giúp giải quyết các yêu cầu trên một cách dễ dàng.

Cấu trúc hàm DATEPART như sau:

DATEPART (yêu_cầu_trích_xuất, giá_trị_trích_xuất) giá_trị_trích_xuất là một giá trị thuộc kiểu datetime. yêu_cầu_trích_xuất: ngày, tháng, năm, quý,….

Khi có một yêu cầu trích xuất nào đó, chúng ta sẽ có các chữ viết tắt tương ứng với các yêu cầu đó. Bảng dưới đây mô tả các yêu chữ viết tắt và các yêu cầu trích xuất tương ứng.

Ý ngh ĩa

Ch ữ viết tắt

Năm

yy, yyyy

Quý

qq,q

Tháng

mm,m

Số ngày đã qua trong n ăm

dy,y

Ngày

dd,d

Tu ần

wk,ww

Số ngày đã qua trong tu ần

dw

Gi ờ

hh

Phút

mi,n

Giây

ss,s

Ví dụ:

select datepart(yyyy, orderdate)as YEAROFORDERDATE, datepart(qq, orderdate)as QUARTEROFORDERDATE, datepart(m, orderdate) as MONTHOFORDERDATE, datepart(wk, orderdate) as WEEKOFORDERDATE, datepart(d, orderdate) as DATEOFORDERDATE, datepart(dy, Orderdate), datepart(dw, orderdate) from orders

Truy vấn ngày tháng trong SQL Server

4 Hàm DATENAME

Tương tự hàm DATEPART nhưng hàm DATENAME tr ả về một chuỗi ký tự

Ví dụ:

select datename(yyyy, orderdate)as YEAROFORDERDATE, datename(qq, orderdate)as QUARTEROFORDER DATE, datename(m, orderdate) as MONTHOFORDERDATE, datename(wk, orderdate) as WEEKOFORDERDATE, datename(d, orderdate) as DATEOFORDERDATE, datename(dy, Orderdate), datename(dw, orderdate) from orders

 

5. Hàm CAST và CONVERTER

Chuyển đổi một giá trị thuộc kiểu dữ liệu này sang một kiểu dữ liệu khác. Hàm CAST và CONVERTER cung cấp cùng một chức năng. Một điểm thuận lợi khi dùng CONVERTER là khi chuyển đổi, hàm này cũng cho phép người dùng sẽ định dạng lại giá tri kết quả theo ý muốn.

Cấu trúc hàm CAST và CONVERTER như sau:

CAST (biểu_thức/giá_ trị AS kiểu_dữ liệu [độ_dài_kiểu_dữ_liệu ]) CONVERT ( kiểu_dữ liệu [độ_dài_kiểu_dữ_liệu ] , biểu_thức/giá_ trị [ ,kiểu_định_dạng] )

Năm 2 chữ số

Năm 4 chữ số

Output

 

0 ho ặc 100

mon dd yyyy hh:mi AM (PM)

1

101

mm/dd/yy

2

102

yy.mm.dd

3

103

dd/mm/yy

4

104

dd.mm.yy

5

105

dd-mm-yy

6

106

dd mon yy

7

107

Mon dd, yy

8

108

hh:mm:ss

 

9 ho ặc 109

mon dd yyyy hh:mi:ss:mmmAM (PM)

10

110

mm-dd-yy

11

111

yy/mm/dd

12

112

yymmdd

 

13 ho ặc 113

dd mon yyyy hh:mm:ss:mmm(24h)

14

114

hh:mi:ss:mmm(24h)

Ví dụ:

select CUSTOMERNAME, convert (varchar, BIRTHDAY, 103) as BIRTHDAY, ADDRESS from Customers where Customername = 'Le Thi Hoa' and year(getdate()) - year(BIRTHDAY) > 20

Hàm CONVERT và hàm CAST có thể sử dụng kết hợp với nhau để cho kết qua như mong muốn.

Ví dụ:

select c.CUSTOMERID, c.CUSTOMERNAME, convert(varchar(20),cast(SUM(i.UNITPRICE*od.QUANTITY) as money),1) as SUMTOTAL from customers c inner join orders o on o.customerid = c.customerid inner join orderdetail od on o.orderid = od.orderid inner join items i on i.itemid = od.itemid group by c.customerid, c.customername

 

Phần khó khăn nhất khi làm việc với ngày tháng là đảm bảo rằng định dạng của ngày tháng bạn muốn chèn vào phải ăn khớp với định dạng ngày tháng của cột trong cơ sở dữ liệu.

Miễn là dữ liệu của bạn chỉ chứa các thông tin ngày tháng, truy vấn của bạn sẽ làm việc như mong đợi. Tuy nhiên, nếu một phần thời gian (giờ phút giây) có liên quan, nó sẽ trở nên phức tạp.

Trước khi nói về sự phức tạp của truy vấn ngày tháng, chúng ta sẽ xem thử các hàm quan trọng nhất được xây dựng để làm việc với ngày tháng.

Các hàm ngày tháng trong MySQL

Bảng dưới đây liệt kê tất cả các hàm quan trọng nhất được xây dựng trong MySQL:

Function Mô tả
NOW() Trả về ngày tháng và thời gian hiện tại
CURDATE() Trả về ngày hiện tại
CURTIME() Trả về thời gian hiện tại
DATE() Trích xuất các phần ngày của một ngày hoặc biểu thức ngày / thời gian
EXTRACT() Trả về một phần của ngày tháng
DATE_ADD() Thêm một khoảng thời gian nhất định vào một ngày
DATE_SUB() Bớt một khoảng thời gian nhất định từ một ngày
DATEDIFF() Trả về số lượng ngày giữa hai khoảng ngày tháng nào đó
DATE_FORMAT() Hiển thị dữ liệu ngày tháng/thời gian trong các định dạng khác

Các hàm ngày tháng của SQL Server

Bảng dưới đây liệt kê các hàm quan trọng nhất được xây dựng trong SQL Server:

Function Mô tả
GETDATE() Trả về ngày tháng và thời gian hiện tại
DATEPART() Trả về một phần của ngày tháng/thời gian
DATEADD() Thêm hoặc bớt một khoảng thời gian nhất định từ một ngày
DATEDIFF() Trả về thời gian giữa hai ngày tháng
CONVERT() Hiển thị dữ liệu ngày tháng/thời gian trong các định dạng khác nhau

Các kiểu dữ liệu ngày tháng trong SQL

MySQL đi kèm với các kiểu dữ liệu sau đây để lưu trữ giá trị ngày hoặc ngày tháng / thời gian trong cơ sở dữ liệu (Y là năm, M là tháng, D là ngày, H là giờ, MI là phút, SS là giây; YYYY là năm được lưu dưới dạng bốn chữ số, YY là năm được lưu dưới dạng hai chữ số; MM là lưu tháng dưới dạng hai chữ số, ví dụ tháng 7 sẽ là 07):

  • DATE – định dạng YYYY-MM-DD
  • DATETIME – định dạng: YYYY-MM-DD HH:MI:SS
  • TIMESTAMP – định dạng: YYYY-MM-DD HH:MI:SS
  • YEAR – định dạng YYYY or YY

SQL Server đi kèm với các kiểu dữ liệu sau để lưu trữ giá trị ngày tháng hoặc ngày tháng/thời gian trong cơ sở dữ liệu:

  • DATE – định dạng YYYY-MM-DD
  • DATETIME – định dạng: YYYY-MM-DD HH:MI:SS
  • SMALLDATETIME – định dạng: YYYY-MM-DD HH:MI:SS
  • TIMESTAMP – định dạng: một số duy nhất

Lưu ý: Các kiểu ngày tháng lựa chọn cho cột khi bạn tạo bảng mới trong cơ sở dữ liệu!

Để có cái nhìn tổng quan về tất cả các kiểu dữ liệu có thể có, hãy truy cập vào thư mục các kiểu dữ liệu của chúng tôi.

SQL làm việc với ngày tháng

Bạn có thể so sánh hai ngày tháng một cách dễ dàng nếu không có thành phần thời gian tham gia!

Giả sử chúng ta có bảng “Orders” giống như thế này:

OrderId ProductName OrderDate
1 Geitost 2008-11-11
2 Camembert Pierrot 2008-11-09
3 Mozzarella di Giovanni 2008-11-11
4 Mascarpone Fabioli 2008-10-29

Bây giờ chúng ta muốn chọn bản ghi bới OrderDate là “2008-11-11” từ bảng trên.

Chúng ta sử dụng câu lệnh SELECT sau:

SELECT * FROM Orders WHERE OrderDate='2008-11-11'

Kết quả trả về sẽ trông giống như thế này:

OrderId ProductName OrderDate
1 Geitost 2008-11-11
3 Mozzarella di Giovanni 2008-11-11

Bây giờ giả sử bảng “Orders” trông giống như thế này (lưu ý là phần gian có trong cột “OrderDate”):

OrderId ProductName OrderDate
1 Geitost 2008-11-11 13:23:44
2 Camembert Pierrot 2008-11-09 15:45:21
3 Mozzarella di Giovanni 2008-11-11 11:12:01
4 Mascarpone Fabioli 2008-10-29 14:56:59

Nếu chúng ta sử dụng cùng câu lệnh SELECT như trên:

SELECT * FROM Orders WHERE OrderDate='2008-11-11'

Chúng ta sẽ không nhận được kết quả nào. Điều này là bởi câu truy vấn trên chỉ dành cho ngày tháng không có phần thời gian đi kèm.

Mẹo: Nếu bạn giữ câu truy vấn của bạn đơn giản và dễ dàng để bao trì, đừng đưa phần thời gian giờ phút giây vào trong ngày tháng của bạn.