Hàm Xử Lý DATE/TIME Trong SQL - Phần 2

Bài viết này sẽ hướng dẫn chi tiết cho bạn cách sử dụng tất cả các hàm xử lý Date/Time trong SQL với cú pháp và những ví dụ cụ thể để dễ hình dung và nắm bắt hàm tốt hơn.

Các hàm xử lý Date/Time trong SQL

Hàm ADDDATE()

Có 2 dạng hàm ADDDATE:

1. ADDDATE(expr, day)

Thêm một khoảng thời gian nhất định vào tham số thời gian được truyền.

  • expr: khoảng thời gian bạn muốn thay đổi.
  • day: một số nguyên ngày bạn muốn thêm vào biểu thức expr.
mysql> SELECT ADDDATE('2019-01-02', 31); +---------------------------------------------------------+ | ADDDATE('2019-01-02', 31) | +---------------------------------------------------------+ | 2019-02-02 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

2. ADDDATE(date, interval expr unit)

Khi đối số thứ hai được gọi dưới dạng INTERVAL, hàm ADDDATE() có chức năng giống hàm DATE_ADD().

Ví dụ hàm DATE_ADD sử dụng như này:

mysql> SELECT DATE_ADD('2019-01-02', INTERVAL 31 DAY); +---------------------------------------------------------+ | DATE_ADD('2019-01-02', INTERVAL 31 DAY) | +---------------------------------------------------------+ | 2019-02-02 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Và ADDDATE có chức năng tương tự:

Hàm ADDDATE() trong SQL

Hàm ADDTIME()

ADDTIME() trong SQL có dạng: ADDTIME(expr1,expr2).

Hàm này cộng giá trị expr2 vào expr1 và trả về kết quả. Expr1 là một biểu thức dạng time hoặc datetime, còn expr2 là một biểu thức time.

mysql> SELECT ADDTIME('2018-12-31 23:59:59.999999','1 1:1:1.000002'); +---------------------------------------------------------+ | DATE_ADD('2018-12-31 23:59:59.999999','1 1:1:1.000002') | +---------------------------------------------------------+ | 2019-01-02 01:01:01.000001 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm CONVERT_TZ()

CONVERT_TZ() trong SQL có dạng: CONVERT_TZ(dt,from_tz,to_tz).

Hàm này được sử dụng để chuyển đổi giá trị datetime dt từ múi giờ from_tz thành múi giờ to_tz và trả về kết quả. CONVERT_TZ() trả về NULL nếu các đối số không hợp lệ.

Ví dụ 1:

mysql> SELECT CONVERT_TZ('2019-01-01 12:00:00','GMT','MET'); +---------------------------------------------------------+ | CONVERT_TZ('2019-01-01 12:00:00','GMT','MET') | +---------------------------------------------------------+ | 2019-01-01 13:00:00 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Ví dụ 2:

mysql> SELECT CONVERT_TZ('2019-01-01 12:00:00','+00:00','+10:00'); +---------------------------------------------------------+ | CONVERT_TZ('2019-01-01 12:00:00','+00:00','+10:00') | +---------------------------------------------------------+ | 2019-01-01 22:00:00 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm CURDATE()

CURDATE() trong SQL trả về ngày hiện tại có định dạng 'YYYY-MM-DD' hoặc YYYYMMDD, tùy thuộc vào việc hàm đang được sử dụng trong ngữ cảnh chuỗi hay số.

mysql> SELECT CURDATE(); +---------------------------------------------------------+ | CURDATE() | +---------------------------------------------------------+ | 2019-03-15 | +---------------------------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT CURDATE() + 0; +---------------------------------------------------------+ | CURDATE() + 0 | +---------------------------------------------------------+ | 20190315 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm CURRENT_DATE()

CURRENT_DATE hay CURRENT_DATE() trong SQL trả về ngày hiện tại có định dạng 'YYYY-MM-DD' hoặc YYYYMMDD, tùy thuộc vào việc hàm đang được sử dụng trong ngữ cảnh chuỗi hay số.

Hàm này sử dụng tương tự như CURDATE().

mysql> SELECT CURRENT_DATE; +---------------------------------------------------------+ | CURRENT_DATE | +---------------------------------------------------------+ | 2019-03-15 | +---------------------------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT CURRENT_DATE() + 1; +---------------------------------------------------------+ | CURRENT_DATE() + 1 | +---------------------------------------------------------+ | 20190316 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm CURTIME()

CURTIME() trong SQL trả về thời gian hiện tại dưới dạng giá trị 'HH: MM: SS' hoặc HHMMSS, tùy thuộc vào việc hàm đang được sử dụng trong ngữ cảnh chuỗi hay số.

mysql> SELECT CURTIME(); +---------------------------------------------------------+ | CURTIME() | +---------------------------------------------------------+ | 14:50:26 | +---------------------------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT CURTIME() + 0; +---------------------------------------------------------+ | CURTIME() + 0 | +---------------------------------------------------------+ | 145026 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm CURRENT_TIME()

Hàm CURRENT_TIME hay CURRENT_TIME() trong SQL trả về thời gian hiện tại dưới dạng giá trị 'HH: MM: SS' hoặc HHMMSS, tùy thuộc vào việc hàm đang được sử dụng trong ngữ cảnh chuỗi hay số.

Hàm này sử dụng tương tự như CURTIME().

Hàm CURRENT_TIMESTAMP()

Hàm CURRENT_TIMESTAMP hay CURRENT_TIMESTAMP() trong SQL trả về datetime hiện tại dưới dạng một giá trị trong định dạng 'YYYY-MM-DD HH: MM: SS' hoặc YYYYMMDHHMMSS, tùy thuộc vào việc hàm đang được sử dụng trong ngữ cảnh chuỗi hay số.

Hàm này sử dụng tương tự như NOW().

mysql> SELECT CURRENT_TIMESTAMP; +---------------------------------------------------------+ | CURRENT_TIMESTAMP | +---------------------------------------------------------+ | 2019-03-15 07:36:12 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm DATE()

DATE() trong SQL có dạng: DATE(expr).

Hàm DATE() trả về phần ngày của biểu thức expr dưới dạng date hoặc datetime được truyền vào.

mysql> SELECT DATE('2019-12-31 01:02:03'); +---------------------------------------------------------+ | DATE('2019-12-31 01:02:03') | +---------------------------------------------------------+ | 2019-12-31 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm DATEDIFF()

DATEDIFF() trong SQL có dạng: DATEDIFF (expr1, expr2).

Hàm này trả về chênh lệch giữa hai giá trị thời gian dựa trên khoảng thời gian được chỉ định expr1 và expr2. Hai giá trị thời gian này phải là biểu thức dưới dạng date hoặc datetime. Chỉ tính phần ngày của các giá trị được sử dụng trong tính toán.

mysql> SELECT DATEDIFF('2019-12-31 23:59:59','2019-12-30'); +---------------------------------------------------------+ | DATEDIFF('2019-12-31 23:59:59','2019-12-30') | +---------------------------------------------------------+ | 1 | +---------------------------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT DATEDIFF('2019-01-12 23:59:59','2019-02-12 23:59:59'); +---------------------------------------------------------+ | DATEDIFF('2019-01-12 23:59:59','2019-02-12 23:59:59') | +---------------------------------------------------------+ | -31 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm DATE_ADD()

DATE_ADD() trong SQL có dạng: DATE_ADD(date,INTERVAL expr unit).

Hàm DATE_ADD() dùng để thực hiện phép toán cộng '+' số học trên date.

  • Tham số date là một giá trị DATE hoặc DATETIME xác định thời gian ban đầu. 
  • Tham số expr là một biểu thức xác định giá trị khoảng thời gian được cộng vào từ date ban đầu, expr là một chuỗi; nó có thể bắt đầu với một dấu '-' cho khoảng thời gian âm.
  • unit là một từ khóa chỉ các đơn vị trong biểu thức sẽ được thông dịch.

Từ khóa INTERVAL và unit không phân biệt chữ hoa chữ thường.

Bảng dưới đây cho thấy định dạng của đối số expr cho mỗi giá trị unit.

GIÁ TRỊ UNIT ĐỊNH DẠNG CỦA EXPR
MICROSECOND MICROSECOND - Micro giây
SECOND SECOND - Giây
MINUTE MINUTE - Phút
HOUR HOUR - Giờ
DAY DAY - Ngày
WEEK WEEK - Tuần
MONTH MONTH - Tháng
QUARTER QUARTER - Quý
YEAR YEAR - Năm
SECOND_MICROSECOND 'SECOND.MICROSECOND' - Giây.Micro giây
MINUTE_MICROSECOND 'MINUTE.MICROSECOND' - Phút.Micro giây
MINUTE_SECOND 'MINUTE:SECOND' - Phút:Giây
HOUR_MICROSECOND 'HOUR.MICROSECOND' - Giờ.Micro giây
HOUR_SECOND 'HOUR:MINUTES:SECOND' - Giờ:Phút:Giây
HOUR_MINUTE 'HOUR:MINUTE' - Giờ:Phút
DAY_MICROSECOND 'DAY.MICROSECOND' - Ngày.Micro giây
DAY_SECOND 'DAY HOUR:MINUTE:SECOND' - Ngày Giờ:Phút:Giây
DAY_MINUTE 'DAY HOUR:MINUTE' - Ngày Giờ:Phút
DAY_HOUR 'DAY HOUR' - Ngày Giờ
YEAR_MONTH 'YEAR-MONTH' - Năm-Tháng

Các giá trị QUARTER và WEEK bắt đầu có từ phiên bản MySQL 5.0.0.

mysql> SELECT DATE_ADD('2019-12-31 23:59:59', INTERVAL '1:1' MINUTE_SECOND); +---------------------------------------------------------+ | DATE_ADD('2019-12-31 23:59:59', INTERVAL... | +---------------------------------------------------------+ | 2020-01-01 00:01:00 | +---------------------------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT DATE_ADD('2019-01-01', INTERVAL 1 HOUR); +---------------------------------------------------------+ | DATE_ADD('2019-01-01', INTERVAL 1 HOUR) | +---------------------------------------------------------+ | 2019-01-01 01:00:00 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm DATE_SUB()

DATE_SUB() trong SQL có dạng: DATE_SUB(date,INTERVAL expr unit).

Hàm DATE_SUB() dùng để thực hiện phép toán trừ '-' số học trên date.

  • Tham số date là một giá trị DATE hoặc DATETIME xác định thời gian ban đầu. 
  • Tham số expr là một biểu thức xác định giá trị khoảng thời gian bị trừ từ date ban đầu, expr là một chuỗi; nó có thể bắt đầu với một dấu '-'.
  • unit là một từ khóa chỉ các đơn vị trong biểu thức sẽ được thông dịch.

Từ khóa INTERVAL và unit không phân biệt chữ hoa chữ thường.

Định dạng của đối số expr cho mỗi giá trị unit tương tự như hàm DATE_ADD().

Các giá trị QUARTER và WEEK bắt đầu có từ phiên bản MySQL 5.0.0.

mysql> SELECT DATE_SUB('2019-06-15', INTERVAL -10 DAY); +---------------------------------------------------------+ | SELECT DATE_SUB('2019-06-15', INTERVAL -10 DAY); | +---------------------------------------------------------+ | 2019-06-25 | +---------------------------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT DATE_SUB('2019-12-31 23:59:59', INTERVAL '1:1' MINUTE_SECOND); +---------------------------------------------------------+ | DATE_SUB('2019-12-31 23:59:59', INTERVAL... | +---------------------------------------------------------+ | 2019-12-31 23:58:58 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm DATE_FORMAT()

DATE_FORMAT() trong SQL có dạng: DATE_FORMAT(date,format) dùng để định dạng giá trị date theo chuỗi format.

Dưới đây là các specifier có thể được sử dụng trong chuỗi format. Ký tự '%' là bắt buộc trước các ký tự specifier này.

Specifier Giải thích
%a Tên ngày trong tuần viết tắt (Sun..Sat)
%b Tên tháng viết tắt (Jan..Dec)
%c Tháng, dạng giá trị số (0..12)
%D Ngày tháng theo số đếm (0th, 1st, 2nd, 3rd,…)
%d Ngày trong tháng, dạng giá trị số (00..31)
%e Ngày trong tháng, dạng giá trị số (0..31)
%f Microsecond (000000..999999)
%H Giờ, dạng giá trị (00..23)
%h Giờ, dạng giá trị (01..12)
%I Giờ, dạng giá trị (01..12)
%i Phút, dạng giá trị số (00..59)
%j Ngày trong năm (001..366)
%k Giờ, dạng giá trị (0..23)
%l Giờ, dạng giá trị (1..12)
%M Tên tháng (January..December)
%m Tháng, dạng giá trị số (00..12)
%p AM hoặc PM
%r Thời gian, 12h (hh:mm:ss được theo sau bởi AM hoặc PM)
%S Giây (00..59)
%s Giây (00..59)
%T Thời gian, 24h (hh:mm:ss)
%U Tuần trong năm (00..53), với Sunday là ngày đầu tiên của tuần
%u Tuần trong năm (00..53), với Monday là ngày đầu tiên của tuần
%V Tuần trong năm (01..53), với Sunday là ngày đầu tiên của tuần; được sử dụng với %X
%v Tuần trong năm (01..53), với Monday là ngày đầu tiên của tuần; được sử dụng với %x
%W Tên ngày trong tuần (Sunday..Saturday)
%w Ngày trong tuần, dạng số (0=Sunday..6=Saturday)
%X Năm cho tuần, với Sunday là ngày đầu tiên của tuần, giá trị 4 chữ số; được sử dụng với %V
%x Năm cho tuần, với Monday là ngày đầu tiên của tuần, giá trị 4 chữ số; được sử dụng với %v
%Y Năm, giá trị 4 chữ số
%y Năm, giá trị 2 chữ số
%% Một hằng ký tự .%.
%x Đối với bất kỳ .x. nào không được liệt kê ở trên

Ví dụ:

mysql> SELECT DATE_FORMAT('2019-10-04 22:23:00', '%H %k %I %r %T %S %w'); +---------------------------------------------------------+ | DATE_FORMAT('2019-10-04 22:23:00....... | +---------------------------------------------------------+ | 22 22 10 10:23:00 PM 22:23:00 00 5 | +---------------------------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT DATE_FORMAT('2019-10-04 22:23:00', '%W %M %Y'); +---------------------------------------------------------+ | DATE_FORMAT('2019-10-04 22:23:00', '%W %M %Y') | +---------------------------------------------------------+ | Saturday October 2019 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm DAY()

DAY() trong SQL có dạng: DAY(date).

Hàm DAY() trả về ngày trong tháng từ date đã truyền vào, trong khoảng từ 0 đến 31.

mysql> SELECT DAY('2019-06-15'); +---------------------------------------------------------+ | DAY('2019-06-15') | +---------------------------------------------------------+ | 15 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm này sử dụng tương tự như DAYOFMONTH().

Hàm DAYNAME()

DAYNAME() trong SQL có dạng: DAYNAME(date).

Hàm DAYNAME() trả về tên của ngày trong tuần của date đã được truyền vào.

mysql> SELECT DAYNAME('2019-03-15'); +---------------------------------------------------------+ | DAYNAME('2019-03-15') | +---------------------------------------------------------+ | Friday | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm DAYOFMONTH()

DAYOFMONTH() trong SQL có dạng: DAYOFMONTH(date).

Hàm DAYOFMONTH() trả về ngày trong tháng từ date đã truyền vào, trong khoảng từ 0 đến 31.

mysql> SELECT DAYOFMONTH('2019-06-15'); +---------------------------------------------------------+ | DAYOFMONTH('2019-06-15') | +---------------------------------------------------------+ | 15 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm này sử dụng tương tự như DAY().

Hàm DAYOFWEEK()

DAYOFWEEK() trong SQL có dạng: DAYOFWEEK(date).

Hàm DAYOFWEEK() trả về chỉ số ngày trong tuần (1 = Sunday, 2 = Monday... 7 = Saturday). Các giá trị chỉ số này tương ứng với tiêu chuẩn ODBC.

mysql> SELECT DAYOFWEEK('2019-03-15'); +---------------------------------------------------------+ |DAYOFWEEK('2019-03-15') | +---------------------------------------------------------+ | 6 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm DAYOFYEAR()

DAYOFYEAR() trong SQL có dạng: DAYOFYEAR(date).

Hàm DAYOFYEAR() trả về số thứ tự của ngày được truyền trong năm trong khoảng từ 1 đến 366.

mysql> SELECT DAYOFYEAR('2019-03-15'); +---------------------------------------------------------+ | DAYOFYEAR('2019-03-15') | +---------------------------------------------------------+ | 74 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm EXTRACT()

EXTRACT() trong SQL có dạng: EXTRACT(unit FROM date).

Hàm EXTRACT() sử dụng các unit specifier giống như hàm DATE_ADD()DATE_SUB(), nhưng nó trích các phần từ date chứ không thực hiện các phép toán số học trên date.

mysql> SELECT EXTRACT(YEAR_MONTH FROM '2019-03-15 01:02:03'); +---------------------------------------------------------+ | EXTRACT(YEAR_MONTH FROM '2019-03-15 01:02:03') | +---------------------------------------------------------+ | 201903 | +---------------------------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT EXTRACT(YEAR FROM '2019-03-15'); +---------------------------------------------------------+ | EXTRACT(YEAR FROM '2019-03-15') | +---------------------------------------------------------+ | 2019 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm FROM_DAYS()

FROM_DAYS() trong SQL có dạng: FROM_DAYS(N)

Hàm này được sử dụng để chuyển đổi số N thành một giá trị date cụ thể. FROM_DAYS() chỉ được sử dụng với các ngày trong lịch Gregorian (1582).

mysql> SELECT FROM_DAYS(737498); +---------------------------------------------------------+ | FROM_DAYS(737498) | +---------------------------------------------------------+ | 2019-03-15 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm FROM_UNIXTIME()

FROM_UNIXTIME() trong SQL có dạng: FROM_UNIXTIME(unix_timestamp, [format]).

Thời gian Unix (Unix timestamp) là hệ thống nhằm diễn tả một điểm trên trục thời gian, theo trục thời gian nó sử dụng số giây để xác định thời điểm, với điểm gốc từ thời điểm 00:00:00 ngày 1/1/1970 theo giờ UTC.

Ví dụ: Lúc 00:00:00 - 12/02/2016 có giá trị timestamp là 1455235200; Có nghĩa là tính từ 00:00:00 - 1/1/1970 đến 00:00:00 - 12/02/2016 là 1455235200 giây.

Hàm FROM_UNIXTIME() trả về ngày đại diện của đối số unix_timestamp dưới dạng một giá trị trong định dạng 'YYYY-MM-DD HH:MM:SS' hoặc YYYYMMDDHHMMSS tùy thuộc vào việc hàm đang được sử dụng trong ngữ cảnh chuỗi hay số.

Giá trị được thể hiện trong múi giờ hiện tại. Đối số unix_timestamp có thể được tạo ra bởi hàm UNIX_TIMESTAMP().

mysql> SELECT FROM_UNIXTIME(1552688580); +---------------------------------------------------------+ | FROM_UNIXTIME(1552688580) | +---------------------------------------------------------+ | 2019-03-15 22:23:00 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Nếu tham số format được truyền, kết quả sẽ được định dạng theo chuỗi format được liệt kê tương tự như hàm DATE_FORMAT().

mysql> SELECT FROM_UNIXTIME(1552688580, '%W %M %Y'); +---------------------------------------------------------+ | FROM_UNIXTIME(1552688580, '%W %M %Y') | +---------------------------------------------------------+ | Friday March 2019 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm HOUR()

Hàm HOUR() trong SQL có dạng: HOUR(time) trả về giờ từ time được truyền vào. Giá trị trả về nằm trong phạm vi từ 0 đến 23 cho các giá trị thời gian trong ngày.

mysql> SELECT HOUR('10:05:03'); +---------------------------------------------------------+ | HOUR('10:05:03') | +---------------------------------------------------------+ | 10 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm LAST_DAY()

Hàm LAST_DAY() trong SQL có dạng: LAST_DAY(date).

Hàm này có tham số truyền vào là giá trị date hoặc datetime, trả về giá trị tương ứng cho ngày cuối cùng của tháng. Output sẽ là NULL nếu tham số không hợp lệ.

mysql> SELECT LAST_DAY('2019-03-15'); +---------------------------------------------------------+ | LAST_DAY('2019-03-15') | +---------------------------------------------------------+ | 2019-03-31 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm LOCALTIME()

LOCALTIME hay LOCALTIME() trả về datetime hiện tại dưới dạng một giá trị trong định dạng 'YYYY-MM-DD HH: MM: SS' hoặc YYYYMMDHHMMSS, tùy thuộc vào việc hàm đang được sử dụng trong ngữ cảnh chuỗi hay số.

Hàm này sử dụng tương tự như NOW().

mysql> SELECT LOCALTIME(); +---------------------------------------------------------+ | LOCALTIME() | +---------------------------------------------------------+ | 2019-03-15 09:53:17 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm LOCALTIMESTAMP()

Hàm LOCALTIMESTAMP hay LOCALTIMESTAMP() trả về datetime hiện tại dưới dạng một giá trị trong định dạng 'YYYY-MM-DD HH: MM: SS' hoặc YYYYMMDHHMMSS, tùy thuộc vào việc hàm đang được sử dụng trong ngữ cảnh chuỗi hay số.

Hàm này sử dụng tương tự như NOW().

mysql> SELECT LOCALTIMESTAMP; +---------------------------------------------------------+ | LOCALTIMESTAMP | +---------------------------------------------------------+ | 2019-03-15 10:12:12 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm MAKEDATE()

MAKEDATE() trong SQL có dạng: MAKEDATE(year,dayofyear).

Hàm này trả về một ngày với tham số year và dayofyear được truyền. Giá trị dayofyear phải lớn hơn 0 nếu không kết quả sẽ là NULL.

mysql> SELECT MAKEDATE(2019,31); +---------------------------------------------------------+ | MAKEDATE(2019,31) | +---------------------------------------------------------+ | 2019-01-31 | +---------------------------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT MAKEDATE(2019,122); +---------------------------------------------------------+ | MAKEDATE(2019,122) | +---------------------------------------------------------+ | 2019-05-02 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm MAKETIME()

Hàm MAKETIME() trong SQL có dạng: MAKETIME(hour,minute,second), trả về một giá trị time từ các tham số hour, minute, và second được truyền.

mysql> SELECT MAKETIME(12,15,30); +---------------------------------------------------------+ | MAKETIME(12,15,30) | +---------------------------------------------------------+ | '12:15:30' | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm MICROSECOND()

Hàm MICROSECOND() trong SQL có dạng MICROSECOND(expr) trả về microsecond từ biểu thức thời gian (expr) dưới dạng số trong khoảng từ 0 đến 999999.

mysql> SELECT MICROSECOND('12:00:00.123456'); +---------------------------------------------------------+ | MICROSECOND('12:00:00.123456') | +---------------------------------------------------------+ | 123456 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm MINUTE()

Hàm MINUTE() trong SQL có dạng: MINUTE(time), trả về giá trị phút cho từ tham số time được truyền, trong khoảng từ 0 đến 59.

mysql> SELECT MINUTE('19-03-15 10:05:03'); +---------------------------------------------------------+ | MINUTE('19-03-15 10:05:03') | +---------------------------------------------------------+ | 5 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm MONTH()

Hàm MONTH() trong SQL có dạng: MONTH(date), trả về tháng từ tham số date được truyền, trong khoảng từ 0 đến 12.

mysql> SELECT MONTH('2019-02-12') +---------------------------------------------------------+ | MONTH('2019-02-12') | +---------------------------------------------------------+ | 2 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm MONTHNAME()

Hàm MONTHNAME() trong SQL có dạng MONTHNAME(date), trả về tên tháng của tham số date được truyền.

mysql> SELECT MONTHNAME('2019-02-12'); +---------------------------------------------------------+ | MONTHNAME('2019-02-12') | +---------------------------------------------------------+ | February | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm NOW()

Hàm NOW() trong SQL trả về datetime hiện tại dưới dạng một giá trị trong định dạng 'YYYY-MM-DD HH: MM: SS' hoặc YYYYMMDHHMMSS, tùy thuộc vào việc hàm đang được sử dụng trong ngữ cảnh chuỗi hay số. Kết quả của hàm là thời gian ở múi giờ hiện tại.

mysql> SELECT NOW(); +---------------------------------------------------------+ | NOW() | +---------------------------------------------------------+ | 2019-03-15 16:50:26 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm PERIOD_ADD()

PERIOD_ADD() trong SQL có dạng PERIOD_ADD(P,N).

Hàm này thêm số tháng (N) được chỉ định vào một khoảng thời gian (P). P truyền vào dưới định dạng YYMM hoặc YYYYMM và trả về giá trị theo định dạng YYYYMM.

mysql> SELECT PERIOD_ADD(1901,2); +---------------------------------------------------------+ | PERIOD_ADD(1901,2) | +---------------------------------------------------------+ | 201903 | +---------------------------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT PERIOD_ADD(201901,2); +---------------------------------------------------------+ | PERIOD_ADD(201901,2) | +---------------------------------------------------------+ | 201903 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm PERIOD_DIFF()

PERIOD_DIFF() trong SQL có dạng: PERIOD_DIFF(P1,P2).

Hàm này trả về số tháng giữa khoảng thời gian P1 và P2 được truyền vào dưới định dạng YYMM hoặc YYYYMM.

mysql> SELECT PERIOD_DIFF(1902,201803); +---------------------------------------------------------+ | PERIOD_DIFF(1902,201803) | +---------------------------------------------------------+ | 11 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm QUARTER()

Hàm QUARTER() trong SQL có dạng QUARTER(date) trả về quý trong năm từ date được truyền vào, trong khoảng từ 1 đến 4.

mysql> SELECT QUARTER('19-04-01'); +---------------------------------------------------------+ | QUARTER('19-04-01') | +---------------------------------------------------------+ | 2 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm SECOND()

Hàm SECOND() trong SQL có dạng SECOND(time) trả về giá trị giây từ tham số time được truyền vào, trong khoảng từ 0 đến 59.

mysql> SELECT SECOND('10:05:03'); +---------------------------------------------------------+ | SECOND('10:05:03') | +---------------------------------------------------------+ | 3 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm SEC_TO_TIME()

SEC_TO_TIME() trong SQL có dạng: SEC_TO_TIME(second).

Hàm này trả về giá trị được chuyển đổi từ tham số second đã cho thành giờ, phút và giây có định dạng 'HH: MM: SS' hoặc HHMMSS, tuỳ thuộc vào việc hàm này sử dụng chuỗi hay số.

mysql> SELECT SEC_TO_TIME(1202); +---------------------------------------------------------+ | SEC_TO_TIME(1202) | +---------------------------------------------------------+ | 00:20:02 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm STR_TO_DATE()

STR_TO_DATE() trong SQL có dạng: STR_TO_DATE(str,format).

Hàm này ngược với hàm DATE_FORMAT(), trả về một giá trị DATETIME nếu chuỗi str chứa cả hai phần date và time, trả về giá trị DATE hoặc TIME nếu chuỗi chỉ chứa các phần date hoặc time.

mysql> SELECT STR_TO_DATE('03/15/2019', '%m/%d/%Y'); +---------------------------------------------------------+ | STR_TO_DATE('03/15/2019', '%m/%d/%Y') | +---------------------------------------------------------+ | 2019-03-15 | +---------------------------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT STR_TO_DATE('March 15 2019", '%M %d %Y'); +---------------------------------------------------------+ | STR_TO_DATE('March 15 2019", "%M %d %Y') | +---------------------------------------------------------+ | 2019-03-15 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm SUBDATE()

Có 2 dạng hàm SUBDATE:

  • SUBDATE(expr, day)
  • SUBDATE(date, interval expr unit)

1. SUBDATE(expr, day)

Trừ một khoảng thời gian nhất định từ tham số thời gian được truyền.

  • expr: khoảng thời gian bạn muốn thay đổi.
  • day: một số nguyên ngày bạn muốn trừ đi từ biểu thức expr.
mysql> SELECT SUBDATE('2019-03-15', 31); +---------------------------------------------------------+ | SUBDATE('2019-03-15', 31) | +---------------------------------------------------------+ | 2019-02-12 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

2. SUBDATE(date, interval expr unit)

Khi đối số thứ hai được gọi dưới dạng INTERVAL, hàm SUBDATE() có chức năng giống hàm DATE_SUB().

Ví dụ hàm DATE_SUB sử dụng như này:

mysql> SELECT DATE_SUB('2019-03-15', INTERVAL 31 DAY); +---------------------------------------------------------+ | DATE_SUB('2019-03-15', INTERVAL 31 DAY) | +---------------------------------------------------------+ | 2019-02-12 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Và SUBDATE có chức năng tương tự:

mysql> SELECT SUBDATE('2019-03-15', INTERVAL 31 DAY); +---------------------------------------------------------+ | SUBDATE('2019-03-15', INTERVAL 31 DAY) | +---------------------------------------------------------+ | 2019-02-12 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm SUBTIME()

SUBTIME() trong SQL có dạng: SUBTIME(expr1,expr2).

Hàm này trả về giá trị thời gian là hiệu của expr1 trừ expr2. Expr1 là một biểu thức dạng time hoặc datetime, còn expr2 là một biểu thức time.

mysql> SELECT SUBTIME('2019-03-31 23:59:59.999999', '1 1:1:1.000002'); +---------------------------------------------------------+ | SUBTIME('2019-03-31 23:59:59.999999', '1 1:1:1.000002') | +---------------------------------------------------------+ | 2019-03-30 22:58:58.999997 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm SYSDATE()

Hàm SYSDATE() trong SQL trả về date và time hiện tại dưới dạng một giá trị có định dạng 'YYYY-MM-DD HH:MM:SS' hoặc YYYYMMDDHHMMSS, phụ thuộc vào hàm đang được sử dụng trong ngữ cảnh chuỗi hay số.

mysql> SELECT SYSDATE(); +---------------------------------------------------------+ | SYSDATE() | +---------------------------------------------------------+ | 2019-03-15 16:47:44 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm TIME()

Hàm TIME() trong SQL có dạng TIME(expr) trả về giá trị thời gian từ biểu thức expr (time hoặc datetime) được truyền vào.

mysql> SELECT TIME('2019-03-15 01:02:03'); +---------------------------------------------------------+ | TIME('2019-03-15 01:02:03') | +---------------------------------------------------------+ | 01:02:03 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm TIMEDIFF()

TIMEDIFF() trong SQL có dạng: TIMEDIFF(expr1, expr2).

Hàm này trả về chênh lệch giữa hai giá trị thời gian expr1 và expr2, kết quả được biểu diễn dưới dạng một giá trị time. Hai giá trị thời gian này là các biểu thức time hoặc datetime và cả hai phải cùng một kiểu.

mysql> SELECT TIMEDIFF('2019-03-15 23:59:59.000001', '2019-03-14 01:01:01.000002'); +---------------------------------------------------------+ | TIMEDIFF('2019-03-15 23:59:59.000001', ... | +---------------------------------------------------------+ | 46:58:57.999999 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm TIMESTAMP()

Có 2 dạng hàm TIMESTAMP:

  • TIMESTAMP(expr)
  • TIMESTAMP(expr1,expr2)

1. TIMESTAMP(expr)

Khi chỉ có một tham số, hàm TIMESTAMP() trong SQL trả về giá trị datetime với tham số expr có thể là date hoặc datetime.

mysql> SELECT TIMESTAMP("2019-03-15"); +---------------------------------------------------------+ | TIMESTAMP("2019-03-15") | +---------------------------------------------------------+ | 2019-03-15 00:00:00 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

2. TIMESTAMP(expr1,expr2)

Khi hàm TIMESTAMP() có hai tham số thì expr2 sẽ được cộng vào expr1 và trả về giá trị datetime.

  • expr1 có thể là date hoặc datetime.
  • expr2 chỉ có thể là time.
mysql> SELECT TIMESTAMP("2019-03-15", "26:10:11"); +---------------------------------------------------------+ | TIMESTAMP("2019-03-15", "26:10:11") | +---------------------------------------------------------+ | 2019-03-16 02:10:11 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm TIMESTAMPADD()

Trong SQL, hàm TIMESTAMPADD() trả về giá trị datetime mới khi nó được cộng thêm một khoảng thời gian được chỉ định vào tham số thời gian được truyền ban đầu.

Cú pháp TIMESTAMPADD() có dạng: TIMESTAMPADD(unit,interval,datetime_expr).

  • unit: đơn vị thời gian sử dụng để cộng thêm vào biểu thức thời gian ban đầu datetime_expr. Nó có thể là một trong những giá trị sau:
    • FRAC_SECOND (microsecond)
    • SECOND, MINUTE
    • HOUR, DAY
    • WEEK
    • MONTH
    • QUARTER
    • YEAR
  • interval: số lượng khoảng thời gian mà bạn muốn thêm.
  • datetime_expr: biểu thức thời gian ban đầu.
mysql> SELECT TIMESTAMPADD(MINUTE,1,'2019-03-15'); +---------------------------------------------------------+ | TIMESTAMPADD(MINUTE,1,'2019-03-15') | +---------------------------------------------------------+ | 2019-03-15 00:01:00 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm TIMESTAMPDIFF()

Cú pháp hàm có dạng: TIMESTAMPDIFF(unit, datetime_expr1, datetime_expr2).

Hàm TIMESTAMPDIFF() trong SQL trả về một số nguyên thể hiện sự chênh lệch thời gian giữa hai biểu thức datetime_expr1 và datetime_expr2.

  • datetime_expr1, datetime_expr2: tham số ở định dạng date hoặc datetime.
  • unit: đơn vị thời gian của giá trị được trả về. Nó có thể là một trong những giá trị sau:
    • FRAC_SECOND (microsecond)
    • SECOND, MINUTE
    • HOUR, DAY
    • WEEK
    • MONTH
    • QUARTER
    • YEAR
mysql> SELECT TIMESTAMPDIFF(MONTH,'2019-02-01','2019-05-01'); +---------------------------------------------------------+ | TIMESTAMPDIFF(MONTH,'2019-02-01','2019-05-01') | +---------------------------------------------------------+ | 3 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm TIME_FORMAT()

Cú pháp hàm có dạng: TIME_FORMAT(time,format).

Hàm TIME_FORMAT trong SQL được sử dụng như hàm DATE_FORMAT() nhưng tham số format có thể chỉ chứa định dạng giờ, phút và giây.

Specifier Giải thích
%f Microsecond (000000..999999)
%H Giờ, dạng giá trị (00..23)
%h Giờ, dạng giá trị (01..12)
%I Giờ, dạng giá trị (01..12)
%i Phút, dạng giá trị số (00..59)
%p AM hoặc PM
%r Thời gian, 12h (hh:mm:ss được theo sau bởi AM hoặc PM)
%S Giây (00..59)
%s Giây (00..59)
%T Thời gian, 24h (hh:mm:ss)

Ví dụ:

mysql> SELECT TIME_FORMAT('19:30:10', '%h %i %s %p'); +---------------------------------------------------------+ | TIME_FORMAT('19:30:10', '%h %i %s %p') | +---------------------------------------------------------+ | 07 30 10 PM | +---------------------------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT TIME_FORMAT('19:30:10', '%r'); +---------------------------------------------------------+ | TIME_FORMAT('19:30:10', '%r') | +---------------------------------------------------------+ | 07:30:10 PM | +---------------------------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT TIME_FORMAT('97:15:40','%H %k %h %I %l'); +---------------------------------------------------------+ | TIME_FORMAT('97:15:40','%H %k %h %I %l') | +---------------------------------------------------------+ | 97 97 01 01 1 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Nếu giá trị time chứa một phần giờ lớn hơn 23 thì ta sử dụng %H và %k để trả về giá trị lớn hơn dãy giá trị thường dùng 0…23.

Hàm TIME_TO_SEC()

Hàm TIME_TO_SEC() trong SQL có dạng TIME_TO_SEC(time), trả về số giây được chuyển đổi từ tham số time.

mysql> SELECT TIME_TO_SEC('22:23:00'); +---------------------------------------------------------+ | TIME_TO_SEC('22:23:00') | +---------------------------------------------------------+ | 80580 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm TO_DAYS()

Hàm TO_DAYS() trong SQL có dạng TO_DAYS(date), trả về số ngày giữa giá trị thời gian date và năm 0 (tính từ 0000-00-00).

mysql> SELECT TO_DAYS('2019-03-15'); +---------------------------------------------------------+ | TO_DAYS('2019-03-15') | +---------------------------------------------------------+ | 737498 | +---------------------------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT TO_DAYS(190316); +---------------------------------------------------------+ | TO_DAYS(190316) | +---------------------------------------------------------+ | 737499 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm UNIX_TIMESTAMP()

Có 2 dạng hàm UNIX_TIMESTAMP:

  • UNIX_TIMESTAMP()
  • UNIX_TIMESTAMP(date)

1. UNIX_TIMESTAMP()

Trong SQL, nếu hàm UNIX_TIMESTAMP() không có tham số đi kèm sẽ trả về số giây theo Unix timestamp, tức là số giây kể từ '1970-01-01 00:00:00' UTC tới ngày giờ hiện tại dưới dạng số nguyên không dấu. 

mysql> SELECT UNIX_TIMESTAMP(); +---------------------------------------------------------+ | UNIX_TIMESTAMP() | +---------------------------------------------------------+ | 1552677612 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

2. UNIX_TIMESTAMP(date)

Nếu hàm UNIX_TIMESTAMP có tham số date đi kèm, SQL sẽ trả về số giây theo Unix timestamp từ '1970-01-01 00:00:00' UTC tới giá trị ngày giờ date được truyền dưới dạng số nguyên không dấu (date có thể là một chuỗi DATE, DATETIME, TIMESTAMP hay một số ở định dạng YYMMDD hoặc YYYYMMDD).

mysql> SELECT UNIX_TIMESTAMP('1995-02-12 22:23:00'); +---------------------------------------------------------+ | UNIX_TIMESTAMP('1995-02-12 22:23:00') | +---------------------------------------------------------+ | 792627780 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm UTC_DATE() 

Hàm UTC_DATE() hay UTC_DATE trong SQL trả về ngày UTC hiện tại dưới dạng một giá trị có định dạng 'YYYY-MM-DD' hoặc YYYYMMDD, tùy thuộc vào việc hàm đang được sử dụng trong ngữ cảnh chuỗi hay số.

mysql> SELECT UTC_DATE(); +---------------------------------------------------------+ | UTC_DATE() | +---------------------------------------------------------+ | 2019-03-15 | +---------------------------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT UTC_DATE() + 0; +---------------------------------------------------------+ | UTC_DATE() + 0 | +---------------------------------------------------------+ | 20190315 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm UTC_TIME()

Hàm UTC_TIME() hay UTC_TIME trả về giờ UTC hiện tại dưới dạng một giá trị có định dạng 'HH:MM:SS' hoặc HHMMSS, tùy thuộc vào việc hàm đang được sử dụng trong ngữ cảnh chuỗi hay số.

mysql> SELECT UTC_TIME(); +---------------------------------------------------------+ | UTC_TIME() | +---------------------------------------------------------+ | 18:07:53 | +---------------------------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT UTC_TIME() + 0; +---------------------------------------------------------+ | UTC_TIME() + 0 | +---------------------------------------------------------+ | 180753 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm UTC_TIMESTAMP()

Hàm UTC_TIMESTAMP() hay UTC_TIMESTAMP trả về ngày giờ UTC hiện tại dưới dạng một giá trị có định dạng 'YYYY-MM-DD HH:MM:SS' hoặc YYYYMMDDHHMMSS, tùy thuộc vào việc hàm đang được sử dụng trong ngữ cảnh chuỗi hay số.

mysql> SELECT UTC_TIMESTAMP(); +---------------------------------------------------------+ | UTC_TIMESTAMP() | +---------------------------------------------------------+ | 2019-03-15 18:08:04 | +---------------------------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT UTC_TIMESTAMP() + 0; +---------------------------------------------------------+ | UTC_TIMESTAMP() + 0 | +---------------------------------------------------------+ | 20190315180804 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm WEEKDAY()

WEEKDAY() trong SQL có dạng: WEEKDAY(date).

Hàm WEEKDAY() trả về chỉ số ngày trong tuần (0 = Thứ Hai, 1 = Thứ Ba... 6 = Chủ Nhật).

mysql> SELECT WEEKDAY('2019-03-15 22:23:00'); +---------------------------------------------------------+ | WEEKDAY('2019-03-15 22:23:00') | +---------------------------------------------------------+ | 4 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm WEEKOFYEAR()

WEEKOFYEAR() trong SQL có dạng: WEEKOFYEAR(date).

Hàm WEEKOFYEAR() trả về chỉ số tuần của date trong năm là một số nguyên từ 1 đến 53.

mysql> SELECT WEEKOFYEAR('2019-03-15'); +---------------------------------------------------------+ | WEEKOFYEAR('2019-03-15') | +---------------------------------------------------------+ | 11 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Hàm YEAR()

Hàm YEAR() trong SQL có dạng YEAR(date), trả về năm tương ứng của tham số date được truyền. Kết quả trả về nằm trong phạm vi 1000 tới 9999.

mysql> SELECT YEAR('19-03-15'); +---------------------------------------------------------+ | YEAR('19-03-15') | +---------------------------------------------------------+ | 2019 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

Trong phần tiếp theo, chúng ta sẽ tìm hiểu về bảng tạm Temporary Table trong SQL, các bạn nhớ theo dõi nhé.

Bài trước: Hàm xử lý DATE/TIME trong SQL - Phần 1

Bài tiếp: Bảng tạm Temporary Table trong SQL

Từ khóa » Cộng Giờ Trong Sql