JavaRush /Курсхо /All lectures for TG purposes /Функсияҳои кор бо сана, мисолҳои амалӣ

Функсияҳои кор бо сана, мисолҳои амалӣ

All lectures for TG purposes
Сатҳи , Дарс
дастрас

Ҷустуҷӯи рӯйдодҳо дар 30 рӯзи охир

Яке аз вазифаҳои маъмул ин ҷустуҷӯи сатрҳое, ки ба диапазони муайяни санаҳо дахл доранд. Дар ин ҷо ҳеҷ чиз мушкил нест, агар санаҳои аввали ва охири диапазон муайян бошанд: SQL барои муқоисаи санаҳо бо муқоисаи рақамҳо хуб кор мекунад.

Ҳамчунин ба санаҳо операторҳои муқоисавӣ метавонанд татбиқ шаванд: <, >, <= ва ғайра. Илова бар ин, оператори махсуси BETWEEN ҳаст, ки бо санаҳо кор кардан метавонад. Биё барои мисол як дархости менависем, ки ҳама вазифаҳоро аз ҷадвали task интихоб мекунад, ки дар тобистони соли 2022 бояд анҷом дода шаванд. Дархост чунин хоҳад буд:

SELECT * FROM task WHERE task.deadline BETWEEN '2022-06-01' AND '2022-08-31'

Натиҷаи ин дархост чунин хоҳад буд:

id emploee_id name deadline
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 (сана, INTERVAL ифода ваҳидҳо) 

Фикр мекунам, ба ёд додан бо чанд мисол осонтар мешавад:

# Дархост Натиҷа
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

Бо ин роҳ аз санаи муайян метавон муайяни рӯзҳо, ҳафтаҳо, моҳҳо ва солҳоро низ кам кард.

Ва агар ба дархости худ баргардем – гирифтани маълумот барои 30 рӯзи охир, пас мо ба ду санаи ин диапазон ниёз дорем:

  • CURDATE() – охири диапазон
  • DATE_SUB( CURDATE() , INTERVAL 30 DAY) – аввали диапазон

Дархост чунин хоҳад буд:

SELECT * FROM task WHERE task.deadline  BETWEEN DATE_SUB( CURDATE() , INTERVAL 30 DAY) AND CURDATE() 

Натиҷаи ин дархост чунин хоҳад буд (ман дар 4 июни 2022 ҳастам):

id emploee_id name deadline
1 1 Ислоҳ кардани баг дар фронтенд 2022-06-01

Чӣ тавр фарқияти байни ду сана ёфтан

Ва боз як функсияи муфид. Гоҳ бо гоҳ лозим меояд фарқияти байни ду сана дар рӯзҳоро ҳисоб кардани. Барои ин дар SQL функсияи махсус ҳаст – DATEDIFF().

Бо он кор кардан хеле осон аст:


DATEDIFF (сана1, сана2) 

Аз санаи аввал танҳо санаи дуюмро манфӣ кардан лозим аст. Агар сана2 пас аз сана1 ояд, натиҷа манфӣ мешавад.

Ба назар гирем, ки мо метавонем дархости пешинаамонро бо истифодаи функсияи DATEDIFF() нависем. Мо бояд ҳама вазифаҳоро аз ҷадвали task интихоб кунем, ки дедлайнашон аз санаи ҳозира на зиёдтар аз 30 рӯз фарқ мекунанд. Ин дархост чунин хоҳад буд:

SELECT * FROM task WHERE DATEDIFF(task.deadline, CURDATE() ) < 30 AND DATEDIFF(task.deadline, CURDATE() ) > -30

Натиҷаи ин дархост чунин хоҳад буд (ман дар 4 июни 2022 ҳастам):

id emploee_id name deadline
1 1 Ислоҳ кардани баг дар фронтенд 2022-06-01
2 2 Ислоҳ кардани баг дар бэкенд 2022-06-15
3 5 Қаҳваро харидорӣ кардан 2022-07-01

Ин дафъа SQL се сатр ёфт. Ба дасти фикр кун, ки чаро дар дафъаи гузашта як сатр буд, вале ин дафъа се сатр шуда?

Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION