GORAGOD

วันที่บน MySQL

รูปแบบวันที่ของ MySQL จัดเก็บอยู่ในรูปแบบเดียวเท่านั้น คือ YYYY-MM-DD HH:MM:SS สำหรับข้อมูลชนิด DATETIME
        
  • YYYY อยู่ระหว่าง ปี ค.ศ. 1970 ถึง 2069 เท่านั้น ต้องเป็นปี ค.ศ. เท่านั้น
  •     
  • MM อยู่ระหว่าง 1 ถึง 12
  •     
  • DD อยู่ระหว่าง 1 ถึง 31 (สูงสุดแล้วแต่เดือน เช่น กันยายน จะสูงสุดได้แค่ 30 เป็นต้น)
  •     
  • HH อยู่ระหว่าง 0 ถึง 23
  •     
  • MM และ SS อยู่ระหว่าง 0 ถึง 59
สำหรับข้อมูลชนิด DATE จะมีเพียง YYYY-MM-DD เท่านั้น

ในการเก็บข้อมูลวันที่ลงใน MySQL จำเป็นต้องจัดเก็บให้ตรงรูปแบบเพื่อให้ MySQL สามารถนำข้อมูลไปใช้ในการคำนวณได้ เช่น

การแยกวัน เดือน ปี ออกจากวันที่ สามารถทำได้โดยใช้ฟังกชั่น DAY(), MONTH() และ YEAR() บน MySQL โดยมีรูปแบบดังนี้
DAY(date)
MONTH(date)
YEAR(date)

ตัวอย่าง
SELECT DAY('1960/12/31') as `daynum`;
คืนค่าวันที 31
SELECT `birthdate` WHERE YEAR(`birthdate`) = 1987
คืนค่าวันเดือนปี ของคนที่เกิดในปี 1987

นอกจากนั้นยังใช้ในการเรียงลำดับได้ด้วยเช่น
ORDER BY YEAR(`birthday`),MONTH(`birthdate`)
หมายถึงเรียงลำดับ ตาม ปี และ เดือน

ในการจัดเก็บข้อมูลชนิดนี้ถ้าจัดเก็บข้อมูลนอกขอบเขต เช่น จัดเก็บเป็น 0000-00-00 อาจได้รับข้อผิดพลาดจาก MySQL ซึ่งในกรณีที่จำเป็นเราสามารถเปิดให้ MySQL ยอมรับค่านี้ได้ โดยการกำหนด sql_mode = "" ใน my.ini (Hosting ส่วนใหญ่จะสนับสนุนความสามารถนี้อยู่แล้ว)

ในกรณีที่ต้องการเก็บวันที่เป็นปี พ.ศ. เราจะไม่สามารถเก็บวันที่ลงใน MySQL ได้โดยตรง ให้เราทำการแปลงปี พ.ศ. ให้เป็นปี ค.ศ. ก่อน ด้วยการลบปี พ.ศ. ด้วย 543 ก่อนแล้วค่อยจัดเก็บ
// วันที่ ปี พ.ศ.
$date = '2557-12-31 12:30:01';
if (preg_match('/([0-9]{1,4})(\-[0-9]{1,2}\-[0-9]{1,2}(\s[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2})?)/', $date, $match)) {
  echo ($match[1] - 543).$match[2];
}

ในทางกลับกันเมื่อต้องการนำข้อมูล MySQL มาแสดงผลเป็นปี พ.ศ. ก็ต้องเอามาบวกด้วย 543

ในกรณีที่ข้อมูลวันที่ที่จัดเก็บใช้สำหรับการแสดงผลอย่างเดียว ไม่ได้ใช้ในการ Query ใดๆเลย เราสามารถจัดเก็บในรูปแบบ VARCHAR ได้ ซึ่งในกรณีนี้ เราสามารถจัดเก็บในรูปแบบใดๆที่เราต้องการได้เลย เช่นเป็นปี พ.ศ. หรือเป็นวันที่แบบไทยก็ได้ แล้วแต่เราต้องการ

มีอีกวิธีในการจัดเก็บว้นที่ คือเก็บในรูปแบบตัวเลข TIMESTAMP ซึ่งสามารถเก็บได้ระหว่าง ค.ศ. 1970 ถึง 2038 (บางระบบปฏิบัตการณ์อาจอยู่ในช่วง 1901 ถึง 2038) ซึงเราสามารถใช้ฟังก์ชั่น mktime() ในการแปลงวันที่ให้เป็นรูปแบบ TIMESTAMP ได้ (ข้อจำกัดในการจัดเก็บอยู่ที่ความสามารถของของฟังก์ชั่น mktime() ในการแปลงวันที่)
// วันที่ ปี พ.ศ.
$date = '2557-12-31 12:30:01';
if (preg_match('/([0-9]{1,4})-([0-9]{1,2})-([0-9]{1,2})(\s([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2}))?/', $date, $match)) {
  // 1420003801
  $mktime = mktime(isset($match[5]) ? (int)$match[5] : 0, isset($match[6]) ? (int)$match[6] : 0, isset($match[7]) ? (int)$match[7] : 0, (int)$match[2], (int)$match[3], (int)$match[1] - 543);
}

และในการแปลงข้อมูลกลับเป็นวันที่สามารถใช้ฟังก์ชั่น date() แปลงกลับได้
// 31 Dec 2014 12:30:01
echo date('d M Y H:i:s');