- vừa được xem lúc

Tính toán và xử lí ngày tháng bằng câu lệnh SQL

0 0 3

Người đăng: Lê Thư

Theo Viblo Asia

Vừa qua mình vừa có 1 task liên quan đến việc tính toán và xử lí ngày tháng bằng câu lệnh SQL. Trong quá trình tìm hiểu và thực hiền mình có rút ra 1 chút kinh nghiệm hay hay nên hôm nay muốn chia sẽ cùng mọi người, mong có thế giúp các bạn khi cần thiết ?

1. Kiểu dữ liệu ngày SQL.

MySQL có các loại dữ liệu sau cho một ngày hoặc giá trị ngày / thời gian trong cơ sở dữ liệu:

  • Date - format YYYY-MM-DD
  • DATETIME - format: YYYY-MM-DD HH:MI:SS
  • TIMESTAMP - format: YYYY-MM-DD HH:MI:SS
  • YEAR - format YYYY hoặc YY

Sql server có các loại dữ liệu sau cho một ngày hoặc giá trị ngày / thời gian trong cơ sở dữ liệu:

  • DATE - format YYYY-MM-DD
  • DATETIME - format: YYYY-MM-DD HH:MI:SS
  • SMALLDATETIME - format: YYYY-MM-DD HH:MI:SS
  • TIMESTAMP - format: 1 số duy nhất

2. Các funtion thường sử dụng.

Tên Chức năng
DATE() Trả về ngày từ biểu thức datetime
CURDATE() Trả về ngày hiện tại của máy tính
YEAR() Trả về năm của ngày đã chỉ định
MONTH() Trả về tháng của ngày đã chỉ định
DAY() Trả về ngày của ngày được chỉ định
TIME() Trả về giờ của ngày được chỉ định
DATE() Trả về ngày từ biểu thức datetime
DATE_ADD() Trả về ngày từ biểu thức datetime
DATEDIFF() Trả về ngày từ biểu thức datetime
DATE_SUB() Trả về ngày từ biểu thức datetime
NOW() Trả về thời gian hiện tại
DAYOFWEEK() Trả về ngày của tuần
DAYNAME() Trả về tên ngày
MONTHNAME() Trả về tên tháng
STR_TO_DATE() Format chuỗi về ngày

....... Ngoài ra còn rất nhiều hàm khác nhưng mình xin phép trình bày một số hàm mà chúng ta hay sử dụng như trên.

3. Tính toán

3.1 Còn bao nhiêu ngày nữa ?

Câu hỏi này chắc chắn chạy qua đầu của chúng ta ít nhất là hàng tuần nếu không nói là hàng ngày ?

MySQL giải quyết loại câu hỏi này với hàm DATEDIFF()

DATEDIFF() trừ hai giá trị ngày và trả về số ngày giữa chúng.

SELECT DATEDIFF(CURDATE(), birthday) AS days_difference FROM friends LIMIT 5;

và kết quả là đây :

sau khi lấy được số ngày, bạn muốn xem người đó năm nay bao nhiêu tuổi ? bạn chỉ cần chia cho 365 ngày là ra kết quả số tuổi.

SELECT ROUND(DATEDIFF(CURDATE(), birthday) / 365, 0) AS years FROM friends LIMIT 5;

Hàm ROUND()toán học được sử dụng để làm tròn kết quả thành một số nguyên.

Bạn cũng có thể tính toán tuổi của friends bằng cách sau

SELECT first_name, last_name, (YEAR(CURDATE()) - YEAR(birthday)) - (RIGHT(CURDATE(), 5) < RIGHT(birthday, 5)) AS years
FROM friends

Giải thích 1 chút :

Hàm CURDATE () trả về ngày hiện tại của máy tính, hàm YEAR () trả về năm của ngày đã chỉ định, hàm MONTH () trả về tháng của ngày đã chỉ định, hàm DAY () trả về ngày của ngày được chỉ định Hàm RIGHT () trả về số lượng ký tự như được chỉ định trong hàm từ chuỗi hoặc ngày đã cho. Phần của biểu thức so sánh các trả về từ hàm RIGHT () ước tính 1 hoặc 0. kết quả là :

Sau khi select được số tuổi của các friend trong khoa trong list friend của mình bạn muốn sắp xếp số tuổi theo thứ tự giảm dần hoặc tăng dần thì chúng ta chỉ cần

ORDER BY age ASC; //sắp xếp tăng dần
ORDER BY age DESC; // sắp xếp giảm dần 

vào cuối mệnh đề trên.

3.2 Chúng ta không bao giờ quên sinh nhật phải không?



Giả sử chúng ta muốn biết ngày trong tuần là sinh nhật của một người bạn. Có lẽ chúng tôi nhìn vào friends bàn mỗi tuần và biết được ai sẽ sinh nhật, nếu có, và ghi chú ngày hôm nay là ngày gì.

Các DAYOFWEEK()hàm trả về một giá trị số cho tham số giá trị ngày tháng. Những con số đó đại diện cho:

1 = Chủ nhật,

2 = Thứ hai, v.v.

Chúng ta có thể đặt một CASE biểu thức để sử dụng ở đây.

SELECT first_name, last_name, birthday, CASE WHEN DAYOFWEEK(birthday) = '1' THEN 'Sunday' WHEN DAYOFWEEK(birthday) = '2' THEN 'Monday' WHEN DAYOFWEEK(birthday) = '3' THEN 'Tuesday' WHEN DAYOFWEEK(birthday) = '4' THEN 'Wednesday' WHEN DAYOFWEEK(birthday) = '5' THEN 'Thursday' WHEN DAYOFWEEK(birthday) = '6' THEN 'Friday' WHEN DAYOFWEEK(birthday) = '7' THEN 'Saturday' ELSE 'not a day of week' END AS day_of_week
FROM friends
LIMIT 10

Awesome! Điều đó hoạt động hoàn hảo. Nhưng nó khá dài để lấy tên 1 ngày trong tuần.

MySQL có một function DAYNAME() phù hợp cho việc này. Đơn giản chỉ cần cung cấp cho nó một giá trị ngày và bạn là vàng.

SELECT first_name, last_name, DAYNAME(birthday)
FROM friends
LIMIT 10

3.3 Xử lí tháng

Các hàm MONTH() được sử dụng để lấy các giá trị số theo tháng từ một giá trị ngày tháng cung cấp. Như trong 1 nghĩa (tháng 1) và 12 cho (tháng 12) với mọi thứ khác ở giữa.

SELECT (MONTH(birthday)) AS month, COUNT(*) AS number_of_birthdays
FROM friends
GROUP BY month
ORDER BY month ASC

Trong truy vấn này, hàm COUNT() đến số người có ngày sinh trong mỗi tháng : Vậy liệu chúng ta có thể lấy tên của tháng không ? câu trả lởi chắc chắn là có rồi

Sử dụng hàm MONTHNAME(), lấy tên của Tháng thực tế từ giá trị ngày đã qua, so với số Tháng qua MONTH().

SELECT DISTINCT (MONTHNAME(birthday)) AS month, COUNT(*) AS number_of_birthdays
FROM friends
GROUP BY month

Kết quả

3.4 Xử lí ngày

Khi bạn có thêm 1 người bạn mới, bạn vui vẻ nhập thông tin người bạn ấy vào Nhưng, ngày sinh nhật ở dạng chuỗi như 'ngày 10tháng 08 năm 2017'.

SELECT STR_TO_DATE("August 10 2017", "%M %d %Y")

Giải thích một chút nào ?

%M %d,%Y được định dạng là %M - Tên tháng. %d - Số ngày trong tháng. %Y - 4 chữ số năm.

3.5 Ngày có giá trị NOT NULL

để kiểm tra nếu giá trị ngày không phải là NULL.

SELECT first_name, last_name, birthday
FROM friends
WHERE birthday IS NOT NULL;

Câu lệnh MySQL ở trên sẽ lọc các hàng có ngày birthday KHÔNG phải là NULL.

3.5 Lấy ra những ngày trong khoảng ngày từ ngày... đến ngày ...

SELECT *
FROM friends
WHERE birthday BETWEEN '1996-10-05 00:00:00' AND '1996-12-25 23:59:59'

4. Kết luận

Thông qua các ví dụ thực tế trên, mong có thể giúp chúng ta có cái nhìn rõ hơn với việc xử lí ngày tháng bằng câu lệnh SQL. Bài viết của mình vẫn còn nhiều thiếu sót rất mong nhận được sự góp ý đóng góp của các bạn để bài viết được hoàn thiện hơn ?

Tài liệu tham khảo :

https://www.w3resource.com/mysql/advance-query-in-mysql/date-calculation.php

https://www.w3school.com https://codeburst.io/handy-mysql-date-functions-with-examples-93dbd79849c5

Bình luận

Bài viết tương tự

- vừa được xem lúc

Giới thiệu Typescript - Sự khác nhau giữa Typescript và Javascript

Typescript là gì. TypeScript là một ngôn ngữ giúp cung cấp quy mô lớn hơn so với JavaScript.

0 0 500

- vừa được xem lúc

Cài đặt WSL / WSL2 trên Windows 10 để code như trên Ubuntu

Sau vài ba năm mình chuyển qua code trên Ubuntu thì thật không thể phủ nhận rằng mình đã yêu em nó. Cá nhân mình sử dụng Ubuntu để code web thì thật là tuyệt vời.

0 0 376

- vừa được xem lúc

Đặt tên commit message sao cho "tình nghĩa anh em chắc chắn bền lâu"????

. Lời mở đầu. .

1 1 701

- vừa được xem lúc

Tìm hiểu về Resource Controller trong Laravel

Giới thiệu. Trong laravel, việc sử dụng các route post, get, group để gọi đến 1 action của Controller đã là quá quen đối với các bạn sử dụng framework này.

0 0 335

- vừa được xem lúc

Phân quyền đơn giản với package Laravel permission

Như các bạn đã biết, phân quyền trong một ứng dụng là một phần không thể thiếu trong việc phát triển phần mềm, dù đó là ứng dụng web hay là mobile. Vậy nên, hôm nay mình sẽ giới thiệu một package có thể giúp các bạn phân quyền nhanh và đơn giản trong một website được viết bằng PHP với framework là L

0 0 421

- vừa được xem lúc

Bạn đã biết các tips này khi làm việc với chuỗi trong JavaScript chưa ?

Hi xin chào các bạn, tiếp tục chuỗi chủ đề về cái thằng JavaScript này, hôm nay mình sẽ giới thiệu cho các bạn một số thủ thuật hay ho khi làm việc với chuỗi trong JavaScript có thể bạn đã hoặc chưa từng dùng. Cụ thể như nào thì hãy cùng mình tìm hiểu trong bài viết này nhé (go).

0 0 414