กำลังมองหากิจกรรมในช่วง 30 วันที่ผ่านมา
งานทั่วไปอีกอย่างหนึ่งคือการค้นหาแถวที่เป็นของช่วงวันที่ที่ระบุ ตามหลักการแล้ว สิ่งนี้ไม่ใช่เรื่องยากหากวันที่เริ่มต้นและวันที่สิ้นสุดของช่วงคงที่: SQL สามารถเปรียบเทียบวันที่ได้เช่นเดียวกับตัวเลข
สามารถใช้ตัวดำเนินการเปรียบเทียบกับวันที่: < , > , <=ฯลฯ นอกจากนี้ยังมีตัวดำเนินการพิเศษ BETWEEN ที่สามารถทำงานกับวันที่ได้เช่นกัน ตัวอย่างเช่น ลองเขียนแบบสอบถามที่จะเลือกงานทั้งหมดจากตารางงานที่ต้องทำในฤดูร้อนปี 2022 คำขอจะมีลักษณะดังนี้:
SELECT * FROM task
WHERE task.deadline BETWEEN '2022-06-01' AND '2022-08-31'
ผลลัพธ์ของแบบสอบถามนี้จะเป็น:
รหัส | พนักงาน_id | ชื่อ | วันกำหนดส่ง |
---|---|---|---|
1 | 1 | แก้ไขข้อบกพร่องในส่วนหน้า | 2022-06-01 |
2 | 2 | แก้ไขข้อบกพร่องในส่วนหลัง | 2022-06-15 |
3 | 5 | ซื้อกาแฟ | 2022-07-01 |
4 | 5 | ซื้อกาแฟ | 2022-08-01 |
แต่สิ่งที่ต้องเขียนในคำขอหากเราต้องการรับงานเช่นในช่วง 30 วันที่ผ่านมา โดยที่ 30 วันล่าสุดเชื่อมโยงโดยตรงกับเวลาการดำเนินการค้นหา นั่นคือ หากดำเนินการค้นหาในวันที่ 25 กรกฎาคม คุณต้องเลือกวันที่ตั้งแต่ 25 มิถุนายนถึง 24 กรกฎาคม จะผูกช่วงวันที่กับเวลาปัจจุบันได้อย่างไร
ในการทำเช่นนี้ ให้ใช้ฟังก์ชันการเพิ่มวันที่:
DATE_ADD (date, INTERVAL expression units)
ฉันคิดว่ามันง่ายกว่าที่จะอธิบายด้วยตัวอย่าง:
# | ขอ | ผลลัพธ์ |
---|---|---|
1 | DATE_ADD('2022-06-04' ช่วงเวลา 5 วัน) | 2022-06-09 |
2 | DATE_ADD('2022-06-04' ช่วงเวลา 4 สัปดาห์) | 2022-07-02 |
3 | DATE_ADD('2022-06-04' ช่วงเวลา 2 เดือน) | 2022-08-04 |
4 | ||
5 | DATE_SUB('2022-06-04' ช่วงเวลา 5 วัน) | 2022-05-30 |
6 | DATE_SUB('2022-06-04' ช่วงเวลา 4 สัปดาห์) | 2022-05-07 |
7 | DATE_SUB('2022-06-04' ช่วงเวลา 2 เดือน) | 2022-04-04 |
อย่างไรก็ตาม จำนวนวัน สัปดาห์ เดือน และปีที่แน่นอนสามารถลบออกจากวันที่หนึ่งๆ ได้
และถ้าเรากลับไปตามคำขอของเรา - เพื่อรับข้อมูลในช่วง 30 วันที่ผ่านมา เราต้องการวันที่สองวันในช่วงนี้:
- CURDATE() - จุดสิ้นสุดของช่วง
- DATE_SUB( CURDATE() , ช่วงเวลา 30 วัน) - จุดเริ่มต้นของช่วง
คำขอจะมีลักษณะดังนี้:
SELECT * FROM task WHERE task.deadline
BETWEEN DATE_SUB( CURDATE() , INTERVAL 30 DAY) AND CURDATE()
ผลลัพธ์ของแบบสอบถามนี้จะเป็นแบบนี้ (ฉันมีวันนี้ 4 มิถุนายน 2565):
รหัส | พนักงาน_id | ชื่อ | วันกำหนดส่ง |
---|---|---|---|
1 | 1 | แก้ไขข้อบกพร่องในส่วนหน้า | 2022-06-01 |
วิธีหาความแตกต่างระหว่างวันที่สองวัน
และอีกหนึ่งฟีเจอร์ที่มีประโยชน์ บางครั้งคุณอาจต้องคำนวณความแตกต่างระหว่างสองวันในหนึ่งวัน ในการทำเช่นนี้ SQL มีฟังก์ชันพิเศษ - DATEDIFF ()
การทำงานกับเธอนั้นง่ายมาก:
DATEDIFF (date 1, date 2)
วันที่สองจะถูกลบออกจากวันแรก หาก date2 มาหลัง date1 ผลลัพธ์จะเป็นค่าลบ
นอกจากนี้ เราสามารถเขียนคำค้นหาก่อนหน้าของเราใหม่ได้โดยใช้ฟังก์ชัน DATEDIFF() เราจำเป็นต้องเลือกงานทั้งหมดจากตารางงานที่เส้นตายแตกต่างจากวันที่ปัจจุบันไม่เกิน 30 วัน นี่คือลักษณะของคำขอนั้น:
SELECT * FROM task WHERE DATEDIFF(task.deadline, CURDATE() ) < 30
ผลลัพธ์ของแบบสอบถามนี้จะเป็นแบบนี้ (ฉันมีวันนี้ 4 มิถุนายน 2565):
รหัส | พนักงาน_id | ชื่อ | วันกำหนดส่ง |
---|---|---|---|
1 | 1 | แก้ไขข้อบกพร่องในส่วนหน้า | 2022-06-01 |
2 | 2 | แก้ไขข้อบกพร่องในส่วนหลัง | 2022-06-15 |
3 | 5 | ซื้อกาแฟ | 2022-07-01 |
คราวนี้ SQL พบมากถึงสามแถว ลองคิดดูว่าทำไมครั้งที่แล้วมีเส้นเดียว ครั้งนี้มีสามเส้น?