โครงสร้างฐานข้อมูลทดสอบ ประกอบคำอธิบาย
-- -- Table structure for table `tbl_mydata` -- CREATE TABLE `tbl_mydata` ( `id` int(11) NOT NULL, `name` varchar(1) DEFAULT NULL, `date1` datetime DEFAULT NULL, `date2` datetime DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- -- Dumping data for table `tbl_mydata` -- INSERT INTO `tbl_mydata` (`id`, `name`, `date1`, `date2`) VALUES (1, 'A', '2014-08-01 00:30:00', '2014-08-01 00:30:00'), (2, 'B', '2014-08-02 00:30:00', '2014-08-03 00:30:00'), (3, 'C', '2014-08-03 00:30:00', '2014-08-05 00:30:00'), (4, 'D', '2014-08-04 00:30:00', '2014-08-07 00:30:00'), (5, 'E', '2014-08-05 00:30:00', '2014-08-09 00:30:00'), (6, 'F', '2014-08-06 00:30:00', '2014-08-11 00:30:00'), (7, 'G', '2014-08-07 00:30:00', '2014-08-13 00:30:00'), (8, 'H', '2014-08-07 15:20:00', '2014-08-15 00:30:00'), (9, 'I', '2014-08-09 00:30:00', '2014-08-17 00:30:00'), (10, 'J', '2014-08-10 00:30:00', '2014-08-19 00:30:00'), (11, 'K', '2014-08-11 00:30:00', '2014-08-21 00:30:00'), (12, 'L', '2014-08-12 00:30:00', '2014-08-23 00:30:00'), (13, 'M', '2014-08-13 00:30:00', '2014-08-25 00:30:00'), (14, 'N', '2014-08-14 00:30:00', '2014-08-27 00:30:00'), (15, 'O', '2014-08-15 00:30:00', '2014-08-29 00:30:00'); -- -- Indexes for dumped tables -- -- -- Indexes for table `tbl_mydata` -- ALTER TABLE `tbl_mydata` ADD PRIMARY KEY (`id`); -- -- AUTO_INCREMENT for dumped tables -- -- -- AUTO_INCREMENT for table `tbl_mydata` -- ALTER TABLE `tbl_mydata` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=16; COMMIT;
ให้รู้ข้อมูลเบื้องต้น
curdate() ใน mysql คือ วันที่ปัจจุบัน ไม่มีเวลา เช่น 2010-08-01
SELECT curdate()
now() ใน mysql คือ วันที่และเวลาปัจจุบัน เช่น 2014-08-01 00:01:00
SELECT now()
การเทียบข้อมูล เท่ากับ หรือไม่เท่ากับ =,!=
กรณีรูปแบบข้อมูลวันที่ ที่เก็บตรงกัน สามารถเปรียบเทียบค่าได้เลย
เช่น
datetime กับ datetime
หรือ
date กับ date
ในตารางฐานข้อมูลตัวอย่าง เราเก็บข้อมูลเป็น datetime
หากต้องการเปรียบ แบบ date สามารถทำได้ โดยใช้ คำสั่งฟังก์ชั่น date ใน mysql
เช่น
// สมมติ date1 เท่ากับ 2014-08-01 00:30:00
date(date1)='2014-08-01' // ก็จะแสดงข้อมุลตามเงื่อนไขวันที่ถูกต้อง
ชุดข้อมูลสำหรับทดสอบ
// การแสดงข้อมูลในสัปดาห์ โดยเริ่มจากวันจันทร์ ถึงวันอาทิตย์
// วิธีนี้ มีการใช้งาน php เพื่อกำหนดช่วง ของวัน
// ตัวอย่างจากข้อมูล ในตารางมี ช่วงสัปดาห์ อยู่ 3 ช่วง
// ช่วงที่ 1 วันที่ 1 ถึง 3 ช่วงวัน ศุกร์ เสาร์ อาทิตย์
// ช่วงที่ 2 วันที่ 4 ถึง 10 เต็มสัปดาห์ วัน จันทร์ถึงอาทิตย์
// ช่วงที่ 3 วันที่ 11 ถึง 15 ช่วงวั จันทร์ อังคาร พุธ พฤหัส ศุกร์
// ถ้าวันที่ตอนนี้คือ 2014-08-06 ดังนั้น ข้อมูลทั้งหมดที่จะแสดง คือ ข้อมูลสัปดาห์ ช่วงที่ 2
$startWeekDay_back=(date("w",strtotime("2014-08-06"))!=0)?-(date("w",strtotime("2014-08-06")))+1:-7;
$startWeekDay_next=(date("w",strtotime("2014-08-06"))!=0)?7-(date("w",strtotime("2014-08-06"))):0;
$q="
SELECT * FROM tbl_mydata WHERE date(date1)>=date_add('2014-08-06',interval ".$startWeekDay_back." day)
AND date(date1)<=date_add('2014-08-06',interval ".$startWeekDay_next." day)
";
// วิธีที่สอง วิธีนี้ ใช้การจัดการในคำสั่ง โดยใช้ YEARWEEK(date,[mode]) ฟังก์ชั่น
// โดยฟังก์ชั่นนี้ จะคืนค่าเป็น ปีสี่หลักต่อด้วยตัวเลขสัปดาห์ เช่น
// SELECT YEARWEEK('2014-08-06',3) จะเท่ากับ 201432 คือปี 2014 และสัปดาห์ที่ 32
// ค่า mode เรากำหนด 3 เพื่อให้จำนวนสัปดาห์เริ่มที่วันจันทร์ มีสัปดาห์ตั้งแต่ 1-53
// ถ้าจะหาว่าวันนี้เป็นปีและสัปดาห์ที่เท่าไหร่ ก็กำหนดเป็น
// SELECT YEARWEEK(CURDATE(),3)
// ดังนั้น เราจะใช้ค่านี้ ในการกำหนดวันในสัปดาห์ เพราะวันที่ในสัปดาห์เดียวกัน จะมีค่า YEARWEEK เท่ากัน
// เราจะได้คำสั่ง sql ง่ายๆ ดังนี้
SELECT * FROM tbl_mydata WHERE YEARWEEK(date(date1),3)=YEARWEEK('2014-08-06',3)
// วิธ๊นี้ง่ายที่สุด เมื่อเทียบกับกรณีกำหนดเงื่อนไขด้วย php ซึ่งผลลัพธ์ที่ได้ก็จะเหมือนกัน
| ID | Name | Date1 | Date2 |
| 1 | A | 2014-08-01 00:30:00 | 2014-08-01 00:30:00 |
| 2 | B | 2014-08-02 00:30:00 | 2014-08-03 00:30:00 |
| 3 | C | 2014-08-03 00:30:00 | 2014-08-05 00:30:00 |
| 4 | D | 2014-08-04 00:30:00 | 2014-08-07 00:30:00 |
| 5 | E | 2014-08-05 00:30:00 | 2014-08-09 00:30:00 |
| 6 | F | 2014-08-06 00:30:00 | 2014-08-11 00:30:00 |
| 7 | G | 2014-08-07 00:30:00 | 2014-08-13 00:30:00 |
| 8 | H | 2014-08-07 15:20:00 | 2014-08-15 00:30:00 |
| 9 | I | 2014-08-09 00:30:00 | 2014-08-17 00:30:00 |
| 10 | J | 2014-08-10 00:30:00 | 2014-08-19 00:30:00 |
| 11 | K | 2014-08-11 00:30:00 | 2014-08-21 00:30:00 |
| 12 | L | 2014-08-12 00:30:00 | 2014-08-23 00:30:00 |
| 13 | M | 2014-08-13 00:30:00 | 2014-08-25 00:30:00 |
| 14 | N | 2014-08-14 00:30:00 | 2014-08-27 00:30:00 |
| 15 | O | 2014-08-15 00:30:00 | 2014-08-29 00:30:00 |
// ถ้าวันที่ตอนนี้คือ 2014-08-10 แสดงข้อมูลวันที่ ย้อนหลัง 1 สัปดาห์ รวมวันปัจจุบัน
SELECT * FROM tbl_mydata WHERE date(date1)>=date_add('2014-08-10',interval -1 week)
AND date(date1)<=curdate()
// .ใช้แบบนี้แทนได้ ถ้า วันที่กำหนดคือวันที่ปัจจุบัน
SELECT * FROM tbl_mydata WHERE date(date1)>=date_add(curdate(),interval -1 week)
AND date(date1)<=curdate()
| ID | Name | Date1 | Date2 |
| 1 | A | 2014-08-01 00:30:00 | 2014-08-01 00:30:00 |
| 2 | B | 2014-08-02 00:30:00 | 2014-08-03 00:30:00 |
| 3 | C | 2014-08-03 00:30:00 | 2014-08-05 00:30:00 |
| 4 | D | 2014-08-04 00:30:00 | 2014-08-07 00:30:00 |
| 5 | E | 2014-08-05 00:30:00 | 2014-08-09 00:30:00 |
| 6 | F | 2014-08-06 00:30:00 | 2014-08-11 00:30:00 |
| 7 | G | 2014-08-07 00:30:00 | 2014-08-13 00:30:00 |
| 8 | H | 2014-08-07 15:20:00 | 2014-08-15 00:30:00 |
| 9 | I | 2014-08-09 00:30:00 | 2014-08-17 00:30:00 |
| 10 | J | 2014-08-10 00:30:00 | 2014-08-19 00:30:00 |
| 11 | K | 2014-08-11 00:30:00 | 2014-08-21 00:30:00 |
| 12 | L | 2014-08-12 00:30:00 | 2014-08-23 00:30:00 |
| 13 | M | 2014-08-13 00:30:00 | 2014-08-25 00:30:00 |
| 14 | N | 2014-08-14 00:30:00 | 2014-08-27 00:30:00 |
| 15 | O | 2014-08-15 00:30:00 | 2014-08-29 00:30:00 |
// ถ้าวันที่ตอนนี้คือ 2014-08-10 แสดงข้อมูลวันที่ ย้อนหลัง 4 วัน และล่วงหน้า 4 วัน
SELECT * FROM tbl_mydata WHERE date(date1)>=date_add('2014-08-10',interval -4 day)
AND date(date1)<=date_add('2014-08-10',interval 4 day)
// .ใช้แบบนี้แทนได้ ถ้า วันที่กำหนดคือวันที่ปัจจุบัน
SELECT * FROM tbl_mydata WHERE date(date1)>=date_add(curdate(),interval -4 day)
AND date(date1)<=date_add(curdate(),interval 4 day)
| ID | Name | Date1 | Date2 |
| 1 | A | 2014-08-01 00:30:00 | 2014-08-01 00:30:00 |
| 2 | B | 2014-08-02 00:30:00 | 2014-08-03 00:30:00 |
| 3 | C | 2014-08-03 00:30:00 | 2014-08-05 00:30:00 |
| 4 | D | 2014-08-04 00:30:00 | 2014-08-07 00:30:00 |
| 5 | E | 2014-08-05 00:30:00 | 2014-08-09 00:30:00 |
| 6 | F | 2014-08-06 00:30:00 | 2014-08-11 00:30:00 |
| 7 | G | 2014-08-07 00:30:00 | 2014-08-13 00:30:00 |
| 8 | H | 2014-08-07 15:20:00 | 2014-08-15 00:30:00 |
| 9 | I | 2014-08-09 00:30:00 | 2014-08-17 00:30:00 |
| 10 | J | 2014-08-10 00:30:00 | 2014-08-19 00:30:00 |
| 11 | K | 2014-08-11 00:30:00 | 2014-08-21 00:30:00 |
| 12 | L | 2014-08-12 00:30:00 | 2014-08-23 00:30:00 |
| 13 | M | 2014-08-13 00:30:00 | 2014-08-25 00:30:00 |
| 14 | N | 2014-08-14 00:30:00 | 2014-08-27 00:30:00 |
| 15 | O | 2014-08-15 00:30:00 | 2014-08-29 00:30:00 |
// ถ้าวันที่ตอนนี้คือ 2014-08-10 แสดงข้อมูลวันที่ ล่วงหน้า 4 วัน (ต้องมีข้อมูลของวันที่ล่วงหน้า
// ข้อมูลถึงจะแสดง )
SELECT * FROM tbl_mydata WHERE date(date1)>='2014-08-10'
AND date(date1)<=date_add('2014-08-10',interval 4 day)
// .ใช้แบบนี้แทนได้ ถ้า วันที่กำหนดคือวันที่ปัจจุบัน
SELECT * FROM tbl_mydata WHERE date(date1)>=curdate()
AND date(date1)<=date_add(curdate(),interval 4 day)
| ID | Name | Date1 | Date2 |
| 1 | A | 2014-08-01 00:30:00 | 2014-08-01 00:30:00 |
| 2 | B | 2014-08-02 00:30:00 | 2014-08-03 00:30:00 |
| 3 | C | 2014-08-03 00:30:00 | 2014-08-05 00:30:00 |
| 4 | D | 2014-08-04 00:30:00 | 2014-08-07 00:30:00 |
| 5 | E | 2014-08-05 00:30:00 | 2014-08-09 00:30:00 |
| 6 | F | 2014-08-06 00:30:00 | 2014-08-11 00:30:00 |
| 7 | G | 2014-08-07 00:30:00 | 2014-08-13 00:30:00 |
| 8 | H | 2014-08-07 15:20:00 | 2014-08-15 00:30:00 |
| 9 | I | 2014-08-09 00:30:00 | 2014-08-17 00:30:00 |
| 10 | J | 2014-08-10 00:30:00 | 2014-08-19 00:30:00 |
| 11 | K | 2014-08-11 00:30:00 | 2014-08-21 00:30:00 |
| 12 | L | 2014-08-12 00:30:00 | 2014-08-23 00:30:00 |
| 13 | M | 2014-08-13 00:30:00 | 2014-08-25 00:30:00 |
| 14 | N | 2014-08-14 00:30:00 | 2014-08-27 00:30:00 |
| 15 | O | 2014-08-15 00:30:00 | 2014-08-29 00:30:00 |
// ถ้าวันที่ตอนนี้คือ 2014-08-10 แสดงข้อมูลวันที่ ย้อนหลัง 4 วัน
SELECT * FROM tbl_mydata WHERE date(date1)>=date_add('2014-08-10',interval -4 day)
AND date(date1)<='2014-08-10'
// .ใช้แบบนี้แทนได้ ถ้า วันที่กำหนดคือวันที่ปัจจุบัน
SELECT * FROM tbl_mydata WHERE date(date1)>=date_add(curdate(),interval -4 day)
AND date(date1)<=curdate()
| ID | Name | Date1 | Date2 |
| 1 | A | 2014-08-01 00:30:00 | 2014-08-01 00:30:00 |
| 2 | B | 2014-08-02 00:30:00 | 2014-08-03 00:30:00 |
| 3 | C | 2014-08-03 00:30:00 | 2014-08-05 00:30:00 |
| 4 | D | 2014-08-04 00:30:00 | 2014-08-07 00:30:00 |
| 5 | E | 2014-08-05 00:30:00 | 2014-08-09 00:30:00 |
| 6 | F | 2014-08-06 00:30:00 | 2014-08-11 00:30:00 |
| 7 | G | 2014-08-07 00:30:00 | 2014-08-13 00:30:00 |
| 8 | H | 2014-08-07 15:20:00 | 2014-08-15 00:30:00 |
| 9 | I | 2014-08-09 00:30:00 | 2014-08-17 00:30:00 |
| 10 | J | 2014-08-10 00:30:00 | 2014-08-19 00:30:00 |
| 11 | K | 2014-08-11 00:30:00 | 2014-08-21 00:30:00 |
| 12 | L | 2014-08-12 00:30:00 | 2014-08-23 00:30:00 |
| 13 | M | 2014-08-13 00:30:00 | 2014-08-25 00:30:00 |
| 14 | N | 2014-08-14 00:30:00 | 2014-08-27 00:30:00 |
| 15 | O | 2014-08-15 00:30:00 | 2014-08-29 00:30:00 |
// วันที่อยู่ในช่วง วันที่และเวลาที่กำหนด SELECT * FROM tbl_mydata WHERE date1>='2014-08-02 00:30:00' AND date1<='2014-08-05 00:30:00' // หรือใช้ BETWEEN ... AND .... SELECT * FROM tbl_mydata WHERE date1 BETWEEN '2014-08-02 00:30:00' AND '2014-08-05 00:30:00'
| ID | Name | Date1 | Date2 |
| 1 | A | 2014-08-01 00:30:00 | 2014-08-01 00:30:00 |
| 2 | B | 2014-08-02 00:30:00 | 2014-08-03 00:30:00 |
| 3 | C | 2014-08-03 00:30:00 | 2014-08-05 00:30:00 |
| 4 | D | 2014-08-04 00:30:00 | 2014-08-07 00:30:00 |
| 5 | E | 2014-08-05 00:30:00 | 2014-08-09 00:30:00 |
| 6 | F | 2014-08-06 00:30:00 | 2014-08-11 00:30:00 |
| 7 | G | 2014-08-07 00:30:00 | 2014-08-13 00:30:00 |
| 8 | H | 2014-08-07 15:20:00 | 2014-08-15 00:30:00 |
| 9 | I | 2014-08-09 00:30:00 | 2014-08-17 00:30:00 |
| 10 | J | 2014-08-10 00:30:00 | 2014-08-19 00:30:00 |
| 11 | K | 2014-08-11 00:30:00 | 2014-08-21 00:30:00 |
| 12 | L | 2014-08-12 00:30:00 | 2014-08-23 00:30:00 |
| 13 | M | 2014-08-13 00:30:00 | 2014-08-25 00:30:00 |
| 14 | N | 2014-08-14 00:30:00 | 2014-08-27 00:30:00 |
| 15 | O | 2014-08-15 00:30:00 | 2014-08-29 00:30:00 |
// วันที่มากกว่า วันที่และเวลาที่กำหนด SELECT * FROM tbl_mydata WHERE date1>'2014-08-07 00:30:00'
| ID | Name | Date1 | Date2 |
| 1 | A | 2014-08-01 00:30:00 | 2014-08-01 00:30:00 |
| 2 | B | 2014-08-02 00:30:00 | 2014-08-03 00:30:00 |
| 3 | C | 2014-08-03 00:30:00 | 2014-08-05 00:30:00 |
| 4 | D | 2014-08-04 00:30:00 | 2014-08-07 00:30:00 |
| 5 | E | 2014-08-05 00:30:00 | 2014-08-09 00:30:00 |
| 6 | F | 2014-08-06 00:30:00 | 2014-08-11 00:30:00 |
| 7 | G | 2014-08-07 00:30:00 | 2014-08-13 00:30:00 |
| 8 | H | 2014-08-07 15:20:00 | 2014-08-15 00:30:00 |
| 9 | I | 2014-08-09 00:30:00 | 2014-08-17 00:30:00 |
| 10 | J | 2014-08-10 00:30:00 | 2014-08-19 00:30:00 |
| 11 | K | 2014-08-11 00:30:00 | 2014-08-21 00:30:00 |
| 12 | L | 2014-08-12 00:30:00 | 2014-08-23 00:30:00 |
| 13 | M | 2014-08-13 00:30:00 | 2014-08-25 00:30:00 |
| 14 | N | 2014-08-14 00:30:00 | 2014-08-27 00:30:00 |
| 15 | O | 2014-08-15 00:30:00 | 2014-08-29 00:30:00 |
// ดูเฉพาะวันที่ที่ตรงกันกับวันที่ที่กำหนด เวลาใดก็ได้ SELECT * FROM tbl_mydata WHERE date(date1)='2014-08-07'
| ID | Name | Date1 | Date2 |
| 1 | A | 2014-08-01 00:30:00 | 2014-08-01 00:30:00 |
| 2 | B | 2014-08-02 00:30:00 | 2014-08-03 00:30:00 |
| 3 | C | 2014-08-03 00:30:00 | 2014-08-05 00:30:00 |
| 4 | D | 2014-08-04 00:30:00 | 2014-08-07 00:30:00 |
| 5 | E | 2014-08-05 00:30:00 | 2014-08-09 00:30:00 |
| 6 | F | 2014-08-06 00:30:00 | 2014-08-11 00:30:00 |
| 7 | G | 2014-08-07 00:30:00 | 2014-08-13 00:30:00 |
| 8 | H | 2014-08-07 15:20:00 | 2014-08-15 00:30:00 |
| 9 | I | 2014-08-09 00:30:00 | 2014-08-17 00:30:00 |
| 10 | J | 2014-08-10 00:30:00 | 2014-08-19 00:30:00 |
| 11 | K | 2014-08-11 00:30:00 | 2014-08-21 00:30:00 |
| 12 | L | 2014-08-12 00:30:00 | 2014-08-23 00:30:00 |
| 13 | M | 2014-08-13 00:30:00 | 2014-08-25 00:30:00 |
| 14 | N | 2014-08-14 00:30:00 | 2014-08-27 00:30:00 |
| 15 | O | 2014-08-15 00:30:00 | 2014-08-29 00:30:00 |
// วันที่และเวลา เท่ากับวันที่ที่กำหนด SELECT * FROM tbl_mydata WHERE date1='2014-08-04 00:30:00'
| ID | Name | Date1 | Date2 |
| 1 | A | 2014-08-01 00:30:00 | 2014-08-01 00:30:00 |
| 2 | B | 2014-08-02 00:30:00 | 2014-08-03 00:30:00 |
| 3 | C | 2014-08-03 00:30:00 | 2014-08-05 00:30:00 |
| 4 | D | 2014-08-04 00:30:00 | 2014-08-07 00:30:00 |
| 5 | E | 2014-08-05 00:30:00 | 2014-08-09 00:30:00 |
| 6 | F | 2014-08-06 00:30:00 | 2014-08-11 00:30:00 |
| 7 | G | 2014-08-07 00:30:00 | 2014-08-13 00:30:00 |
| 8 | H | 2014-08-07 15:20:00 | 2014-08-15 00:30:00 |
| 9 | I | 2014-08-09 00:30:00 | 2014-08-17 00:30:00 |
| 10 | J | 2014-08-10 00:30:00 | 2014-08-19 00:30:00 |
| 11 | K | 2014-08-11 00:30:00 | 2014-08-21 00:30:00 |
| 12 | L | 2014-08-12 00:30:00 | 2014-08-23 00:30:00 |
| 13 | M | 2014-08-13 00:30:00 | 2014-08-25 00:30:00 |
| 14 | N | 2014-08-14 00:30:00 | 2014-08-27 00:30:00 |
| 15 | O | 2014-08-15 00:30:00 | 2014-08-29 00:30:00 |