โครงสร้างฐานข้อมูลทดสอบ ประกอบคำอธิบาย
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | -- -- 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
1 | SELECT curdate() |
now() ใน mysql คือ วันที่และเวลาปัจจุบัน เช่น 2014-08-01 00:01:00
1 | 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 |