Hàm thời gian trong MySQL

MySQL không lưu trữ dữ liệu múi giờ khi lưu trữ dấu thời gian. Nó cũng sử dụng thời gian của máy chủ lưu trữ làm cơ sở để tạo đầu ra của NOW()

Hàm thời gian trong MySQL

Làm dấu thời gian năm ngày giờ phút trong MySQL

Làm tròn hoặc cắt bớt dấu thời gian đặc biệt hữu ích khi bạn nhóm theo thời gian . Nếu bạn làm tròn theo năm hoặc ngày, bạn có thể sử dụng các hàm tương ứng:

SELECT YEAR(now()); -- or DATE();

Tuy nhiên, bạn phải cẩn thận nếu bạn nhóm theo tháng. MONTH() Ví dụ, sử dụng will, make November 2018 và November 2017 đều chỉ dịch thành "11". Nếu đó là những gì bạn muốn, thì bạn có thể sử dụng MONTH(). Tuy nhiên, nếu bạn muốn phân biệt giữa các tháng của những năm khác nhau, bạn cần sử dụng DATE_FORMAT():

SELECT date_format(now(),'%Y-%m'); -- 2025-01
SELECT date_format(now(),'%Y-%m-%d'); -- 2025-01-20
SELECT date_format(now(),'%Y-%m-%d %H'); -- 2025-01-20 20
SELECT date_format(now(),'%Y-%m-%d %H:%i'); -- 2025-01-20 20:45

Cách truy vấn Ngày và Giờ trong MySQL

MySQL có các hàm sau để lấy ngày và giờ hiện tại:

SELECT now(); -- date and time
SELECT curdate(); --date
SELECT curtime(); --time in 24-hour format

Để tìm các hàng giữa hai ngày hoặc dấu thời gian:

SELECT *
FROM events
where event_date between '2018-01-01' and '2018-01-31';

-- Can include time by specifying in YYYY-MM-DD hh:mm:ss format:
SELECT *
FROM events
WHERE event_date BETWEEN '2018-01-01 12:00:00' AND '2018-01-01 23:30:00';

Để tìm các hàng được tạo trong tuần trước:

SELECT *
FROM events
WHERE event_date > date_sub(now(), interval 1 week);

Hàm thời gian trong MySQL
Hàm thời gian trong MySQL

Ngoài ra còn có DATE_ADD(). Ví dụ, để tìm các sự kiện được lên lịch từ một tuần trước đến 3 ngày kể từ bây giờ:

SELECT *
FROM events
WHERE event_date BETWEEN date_sub(now(), interval 1 week) AND date_add(now(), interval 3 day);

Bạn có thể trích xuất một phần dấu thời gian bằng cách áp dụng hàm tương ứng:

SELECT year(now()); -- or month(), day(), hour(), minute(), second()

Để lấy ngày trong tuần từ dấu thời gian, hãy sử dụng DAYOFWEEK() hàm:

-- returns 1-7 (integer), where 1 is Sunday and 7 is Saturday
SELECT dayofweek('2018-12-12');
-- returns the string day name like Monday, Tuesday, etc
SELECT dayname(now());

Để chuyển đổi dấu thời gian sang dấu thời gian Unix (giây nguyên):

-- This will assume time to be 12am
SELECT unix_timestamp('2018-12-09');

-- You can specify an exact timestamp to be converted down to the second
SELECT unix_timestamp('2018-12-09 14:53:21');

-- calling unix_timestamp without a parameter will be like calling it for current timestamp
SELECT unix_timestamp(); -- same as SELECT unix_timestamp(now());

Để tính toán sự khác biệt giữa hai dấu thời gian, hãy chuyển đổi chúng thành dấu thời gian Unix rồi thực hiện phép trừ:

-- show seconds between delivery and shipping timestamps
SELECT unix_timestamp(delivered_at) - unix_timestamp(shipped_at);
FROM deliveries;

-- convert computed difference to hh:mm:ss format:
SELECT sec_to_time(unix_timestamp(delivered_at) - unix_timestamp(shipped_at))
FROM deliveries;

Lưu ý rằng MySQL cũng có các hàm DATEDIFF()TIMEDIFF() hàm, nhưng chúng chỉ có thể được sử dụng với các giá trị ngày tháng hoặc giá trị thời gian thuần túy.

Cách nhóm theo thời gian trong MySQL

Khi bạn muốn nhóm theo phút, giờ, ngày, tuần, v.v., bạn có thể chỉ nhóm theo cột dấu thời gian, tuy nhiên, sau đó bạn sẽ nhận được một nhóm mỗi giây, có thể không phải là điều bạn muốn. Thay vào đó, bạn cần "cắt bớt" dấu thời gian của mình thành mức độ chi tiết mà bạn muốn, như phút, giờ, ngày, tuần, v.v. Hàm bạn cần ở đây là DATE_FORMAT:

SELECT
date_format(created_at,'%Y-%m-%d %H-%i'), -- leave out -%i if you want to group by hour
count(1)
FROM users
GROUP BY 1;

Việc nhóm theo ngày sẽ dễ hơn vì bạn chỉ cần sử dụng hàm DATE():

SELECT
date(created_at),
count(1)
FROM users
GROUP BY 1;

Nếu bạn không có người dùng mới cho mỗi phút/giờ/ngày, bạn sẽ có khoảng trống trong dữ liệu của mình. Để có một hàng cho mỗi khoảng thời gian, ngay cả khi không có dữ liệu, bạn sẽ muốn tạo dữ liệu cho nó.

Cách chuyển đổi UTC sang múi giờ địa phương trong MySQL

MySQL không lưu trữ dữ liệu múi giờ khi lưu trữ dấu thời gian. Nó cũng sử dụng thời gian của máy chủ lưu trữ làm cơ sở để tạo đầu ra của NOW(); Để chuyển đổi dấu thời gian từ múi giờ này sang múi giờ khác, bạn có thể sử dụng hàm CONVERT_TZ:

-- using named time zones
SELECT CONVERT_TZ('2018-01-01 12:00:00','UTC','MET');

-- using offset time zones
SELECT CONVERT_TZ('2018-01-01 12:00:00','+00:00','+10:00');

TAGS: mysql
About the Author