กำลังมองหากิจกรรมในช่วง 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 พบมากถึงสามแถว ลองคิดดูว่าทำไมครั้งที่แล้วมีเส้นเดียว ครั้งนี้มีสามเส้น?