โครงสร้างฐานข้อมูลทดสอบ ประกอบคำอธิบาย
-- -- 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 |