Oxirgi 30 kun ichidagi voqealarni qidirish
Yana bir tez-tez uchraydigan vazifa - bu ma'lum sana oralig'iga tegishli satrlarni qidirish. Aslida bunda qiyin narsa yo'q, agar oraliqning boshlanish va tugash sanalari belgilangan bo'lsa: SQL sanalarni raqamlar kabi yaxshi taqqoslay oladi.
Sanalar bilan taqqoslash operatorlarini qo'llash mumkin: <, >, <= va hokazo. Bundan tashqari, sanalar bilan ishlashni biladigan BETWEEN operatori mavjud. Misol uchun, 2022 yil yozida bajarilishi kerak bo'lgan barcha vazifalarni task jadvalidan tanlab olish uchun so'rov yozamiz. So'rov quyidagicha bo'ladi:
SELECT * FROM task WHERE task.deadline BETWEEN '2022-06-01' AND '2022-08-31'
Ushbu so'rovning natijasi quyidagicha bo'ladi:
| id | emploee_id | name | deadline |
|---|---|---|---|
| 1 | 1 | Frontenddagi xatoni tuzatish | 2022-06-01 |
| 2 | 2 | Backenddagi xatoni tuzatish | 2022-06-15 |
| 3 | 5 | Coffee sotib olish | 2022-07-01 |
| 4 | 5 | Coffee sotib olish | 2022-08-01 |
Lekin agar biz so'nggi 30 kun ichidagi vazifalarni olishni istasak, so'rovda nima yozish kerak bo'ladi. So'nggi 30 kun so'rov bajarilishi vaqtiga to'g'ridan to'g'ri bog'langan. Ya'ni, agar so'rov 25-iyulda bajarilsa, unda 25-iyundan 24-iyulgacha bo'lgan sanalarni tanlash kerak. Sana oralig'ini joriy vaqtda qanday bog'lash mumkin?
Buning uchun sana qo'shish funksiyasidan foydalanish kerak:
DATE_ADD (sana, INTERVAL ifad birliklar)
Ko'rinib turibdiki, bir nechta misollar bilan tushuntirish osonroq bo'ladi:
| # | So'rov | Natija |
|---|---|---|
| 1 | DATE_ADD('2022-06-04', INTERVAL 5 DAY) | 2022-06-09 |
| 2 | DATE_ADD('2022-06-04', INTERVAL 4 WEEK) | 2022-07-02 |
| 3 | DATE_ADD('2022-06-04', INTERVAL 2 MONTH) | 2022-08-04 |
| 4 | ||
| 5 | DATE_SUB('2022-06-04', INTERVAL 5 DAY) | 2022-05-30 |
| 6 | DATE_SUB('2022-06-04', INTERVAL 4 WEEK) | 2022-05-07 |
| 7 | DATE_SUB('2022-06-04', INTERVAL 2 MONTH) | 2022-04-04 |
Aytgancha, ma'lum sanadan ma'lum kun, hafta, oy va yillarni chiqarib olish mumkin.
Va agar bizning so'rovimizga qaytsak - so'nggi 30 kun uchun ma'lumotlarni olish uchun, bizga ushbu oralig'ning ikki sanasi kerak:
- CURDATE() – oralig'ning oxiri
- DATE_SUB( CURDATE() , INTERVAL 30 DAY) – oralig'ning boshlanishi
So'rov quyidagicha bo'ladi:
SELECT * FROM task WHERE task.deadline BETWEEN DATE_SUB( CURDATE() , INTERVAL 30 DAY) AND CURDATE()
Ushbu so'rovning natijasi quyidagicha bo'ladi (bugungi sana 4-iyun 2022 yil):
| id | emploee_id | name | deadline |
|---|---|---|---|
| 1 | 1 | Frontenddagi xatoni tuzatish | 2022-06-01 |
Ikki sana orasidagi farqni qanday topish mumkin
Va yana bir foydali funksiya. Ba'zan ikki sana orasidagi farqni kunlarda hisoblash kerak bo'lishi mumkin. Buning uchun SQLda maxsus funksiya mavjud – DATEDIFF().
U bilan ishlash juda oson:
DATEDIFF (sana1, sana2)
Birinchi sanadan faqat ikkinchisi chiqariladi. Agar sana2 sana1dan keyin keladigan bo'lsa, natija manfiy bo'ladi.
Aytgancha, biz DATEDIFF() funksiyasidan foydalangan holda oldingi so'rovimizni qayta yozishimiz mumkin. Bizga task jadvalidan barcha vazifalarni tanlab olish kerak, ularning tugallanish muddati joriy sanadan 30 kundan oshmasligini ko'rsatadi. Mana bu so'rov qanday ko'rinishga ega bo'ladi:
SELECT * FROM task WHERE DATEDIFF(task.deadline, CURDATE() ) < 30 AND DATEDIFF(task.deadline, CURDATE() ) > -30
Ushbu so'rovning natijasi quyidagicha bo'ladi (bugungi sana 4-iyun 2022 yil):
| id | emploee_id | name | deadline |
|---|---|---|---|
| 1 | 1 | Frontenddagi xatoni tuzatish | 2022-06-01 |
| 2 | 2 | Backenddagi xatoni tuzatish | 2022-06-15 |
| 3 | 5 | Coffee sotib olish | 2022-07-01 |
Bu safar SQL uchta satrni topdi. O'ylab ko'ring, nega o'tgan safar bitta satr bo'lgan, bu safar esa uchta?
GO TO FULL VERSION