ทำความเข้าใจ Date & Time Function MySQL ถ้ารู้แล้วจะทำให้ชีวิตดีขึ้น 10 เท่า

Sharing is caring!

สำหรับข้อมูล Datatype ประเภท Date ,DateTime ,Time ,Timestamp ,Year เหล่านี้ จะทำให้เรามึนงงและเป็นปัญหา และจะจัดการได้ยาก ยกตัวอย่างเคสต่าง ๆ เหล่านี้ เช่น

  • หาวันเวลา ปัจจุบัน
  • ต้องการเปลี่ยน format ของ column Date ให้ส่วนของค่าที่ Query มาได้
  • ต้องการที่จะหาวัน ที่ต้องการเมื่อในอดีตที่ผ่านมา
  • อยากที่จะคำนวนช่วงเวลา นาที ,ชั่วโมง ,วัน ,เดือน หรือ ปีของ Datetime ทั้ง 2 columns ว่า มีช่วงห่างกันเท่าไหร่
  • ต้องการหาวันสุดท้ายของเดือน เช่น 28 ,29 ,30 ,31
  • และอื่น ๆ อีกมากมาย

*** Function ต่าง ๆ ที่จะยกตัวอย่าง บาง function จะมาใน MySQL 8.0 อาจจะไม่ทำงานบน MySQL ที่ต่ำกว่า 8.0 ***

https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_date

ลองเล่น Function ต่าง ๆ กัน

Function ที่หา Date จากปัจจุบัน

/* แสดงวันที่ เวลา ปัจจุบัน */
SELECT NOW();  /* '2020-09-22 09:15:09' */
SELECT CURRENT_TIMESTAMP(); /* '2020-09-22 09:22:11' */
/* แสดงวันที่ปัจจุบัน เท่านั้น */
SELECT CURRENT_DATE();  /* '2020-09-22' */
SELECT CURRENT_DATE; /* '2020-09-22' */
SELECT CURDATE(); /* '2020-09-22' */
/* แสดงเวลา ปัจจุบัน เท่านั้น */
SELECT CURRENT_TIME();  /* '09:21:30' */
SELECT CURRENT_TIME; /* '09:21:30' */
SELECT CURTIME(); /* '09:21:30' */
/* แสดงวัน ของแต่ละเดือน */ 
SELECT DAY(NOW()); /* 22 */
SELECT DAYOFMONTH(NOW()); /* 22 */
/ * แสดงลำดับวัน ของสัปดาห์ */
SELECT DAYOFWEEK(NOW());  /* 3 (คือวัน วันอังคาร) */
/* แสดงวันที่ ลำดับ ใน 1 ปี ( 0 - 365 ) */
SELECT DAYOFYEAR(NOW()); /* 266 (2020-09-22)*/

แปลง หรือ เปลี่ยน format ของ Date

/* แสดง format ของ Date ต้นทาง */
SET @SOURCE_DATE = DATE('2020-09-22'); 
SELECT @SOURCE_DATE as origin_date; /* '2020-09-22' */
SELECT DATE_FORMAT(@SOURCE_DATE,'%d/%m/%Y') as dmy_date;  /* '22/09/2020' */
SELECT DATE_FORMAT(@SOURCE_DATE,'%d/%m/%Y %H:%i:%s') as dmyhms_date; /* '22/09/2020 00:00:00' */

หาวันก่อนหน้า (วันที่ในอดีต) หรือวันถัดไป (วันที่ในอนาคต)

SET @SOURCE_DATE = TIMESTAMP('2020-09-22 00:00:00');
SELECT DATE_ADD(@SOURCE_DATE , INTERVAL 10 MONTH) as add_10_month; /* '2021-07-22 00:00:00' (เพิ่ม 10 วินาที ) */
SELECT DATE_ADD(@SOURCE_DATE , INTERVAL 10 DAY) as add_10_day; /* '2020-10-02 00:00:00' (เพิ่ม 10 วินาที ) */
SELECT DATE_ADD(@SOURCE_DATE , INTERVAL 10 HOUR) as add_10_hour; /* '2020-09-22 10:00:00' (เพิ่ม 10 วินาที ) */
SELECT DATE_ADD(@SOURCE_DATE , INTERVAL 10 MINUTE) as add_10_minute; /* '2020-09-22 00:10:00' (เพิ่ม 10 วินาที ) */
SELECT DATE_ADD(@SOURCE_DATE , INTERVAL 10 SECOND) as add_10_second; /* '2020-09-22 00:00:10' (เพิ่ม 10 วินาที ) */


SELECT DATE_ADD(@SOURCE_DATE , INTERVAL 10 MONTH) as sub_10_month; /* '2019-11-22 00:00:00' ( ลบ 10  เดือน)  */
SELECT DATE_ADD(@SOURCE_DATE , INTERVAL 10 DAY) as sub_10_day; /* '2020-09-12 00:00:00'  (ลบ10  วัน) */
SELECT DATE_ADD(@SOURCE_DATE , INTERVAL 10 HOUR) as sub_10_hour; /* '2020-09-21 14:00:00' (ลบ 10  ชั่วโมง) */
SELECT DATE_ADD(@SOURCE_DATE , INTERVAL 10 MINUTE) as sub_10_minute; /* '2020-09-21 23:50:00' (ลบ 10  นาที) */
SELECT DATE_ADD(@SOURCE_DATE , INTERVAL 10 SECOND) as sub_10_second; /* '2020-09-21 23:59:50' (ลบ 10  วินาที )*/

คำนวน ปี ,เดือน ,วัน ,ชั่วโมง ,นาที ,วินาที


SET @BEFORE_DATETIME = TIMESTAMP('2020-08-10 10:10:10');
SET @AFTER_DATETIME = TIMESTAMP('2020-09-20 20:20:20');
SELECT  DATEDIFF(@AFTER_DATETIME,@BEFORE_DATETIME) as diff_year;  /* ห่างกัน 41 วัน */

SELECT TIMESTAMPDIFF(YEAR,@BEFORE_DATETIME,@AFTER_DATETIME) as diff_year; /* ห่างกัน 0 ปี */
SELECT TIMESTAMPDIFF(MONTH,@BEFORE_DATETIME,@AFTER_DATETIME) as diff_month; /* ห่างกัน 1 เดือน */
SELECT TIMESTAMPDIFF(DAY,@BEFORE_DATETIME,@AFTER_DATETIME) as diff_day; /* ห่างกัน 41 วัน */
SELECT TIMESTAMPDIFF(HOUR,@BEFORE_DATETIME,@AFTER_DATETIME) as diff_hour; /* ห่างกัน 994 ชั่วโมง */
SELECT TIMESTAMPDIFF(MINUTE,@BEFORE_DATETIME,@AFTER_DATETIME) as diff_minute; /* ห่างกัน 59650 นาที */
SELECT TIMESTAMPDIFF(SECOND,@BEFORE_DATETIME,@AFTER_DATETIME) as diff_second; /* ห่างกัน 3579010 วินาที */

ตัด ปี ,เดือน ,วัน ,ชั่วโมง ,นาที ,วินาที

SET @TARGET_DATETIME = '2020-09-22 10:15:20';
SELECT DATE(@TARGET_DATETIME) as date_date; /* 2020-09-22 */
SELECT YEAR(@TARGET_DATETIME) as year_date; /* 2020 */
SELECT MONTH(@TARGET_DATETIME) as month_date; /* 9 */
SELECT WEEK(@TARGET_DATETIME) as week_date; /* 38 */
SELECT DAY(@TARGET_DATETIME) as day_date; /* 22 */
SELECT HOUR(@TARGET_DATETIME) as hour_date; /* 10 */
SELECT MINUTE(@TARGET_DATETIME) as minute_date; /* 15 */
SELECT SECOND(@TARGET_DATETIME) as second_date; /* 20 */

สำหรับ Function อื่น ๆ ของ Date & Time ของ MySQL Database สามารถเข้าไปศุกษาเพิ่มเติมได้ที่นี่ “Date and Time Functions”

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *