JavaRush /Kurslar /All lectures for UZ purposes /Sana bilan ishlash funksiyalari, amaliy misollar

Sana bilan ishlash funksiyalari, amaliy misollar

All lectures for UZ purposes
Daraja, Dars
Mavjud

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?

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION