Si të shkruani datën aktuale në mysql. Konvertimi i datës në mysql duke përdorur DATE_FORMAT()

Për të filluar, unë dua të prek temën se cili format është më i mirë për të ruajtur datat në bazën e të dhënave: VULL KOHORE ose DATA KOHA. Kjo pyetje është ngritur dhe po ngrihet shumë herë në forume, blogje etj. Por për të mos ju dërguar menjëherë në motorët e kërkimit, do të përpiqem të tregoj ndryshimin me fjalë të thjeshta dhe me një shembull. Lloji DATA KOHA- ruan vlerën e datës në formatin "VVVV-MM-DD HH:MM:SS" dhe nuk varet nga zona kohore. VULL KOHORE- ruan një vulë kohore, d.m.th. numri i sekondave që kanë kaluar që nga 1 janari 1970. MySQL i konverton këto vlera duke marrë parasysh zonën aktuale kohore si kur shkruan në bazën e të dhënave dhe kur nxjerr prej saj. Çfarë do të thotë kjo...
Për shembull, sapo keni shtuar një artikull në bazën e të dhënave, në kalendarin tuaj është 1 janari 2014 dhe në orën tuaj është 01:00. Nëse fusha e datës është e tipit DATETIME, atëherë të gjithë ata që vizitojnë faqen do të shohin pikërisht këtë datë dhe orë, pavarësisht nga vendbanimi i tyre. Gjithçka duket se është në rregull, por përdoruesi ( le ta quajmë "Bill G"), duke jetuar diku në Nju Jork, ende nuk ka ardhur dita e parë e janarit - për të është 31 dhjetor 2013 dhe ora tregon 19:00. Ai është paksa i hutuar, sepse... Ai nuk ka filluar të festojë ende Vitin e Ri, por tashmë po imagjinon një "artikull nga e ardhmja" ;) Kjo nuk do të ndodhë me llojin TIMESTAMP, sepse Gjatë daljes, zona e saj kohore do të merret parasysh.
“Gjithçka është e qartë!”, thoni ju dhe ndryshoni me shpejtësi të gjitha fushat e datave në llojin TIMESTAMP dhe Bill G do të marrë frymë lehtësuese, por jo për shumë kohë. Gjatë regjistrimit në faqen tuaj, Bill tregoi datën dhe kohën e lindjes së tij. Duke udhëtuar nëpër botë, ai gjithmonë shikon faqen tuaj të internetit dhe zbulon me tmerr se koha, dhe nganjëherë data e lindjes së tij, është gjithmonë e ndryshme, sepse... shfaqen duke marrë parasysh zonën kohore në të cilën ndodhet aktualisht. Po, në këtë rast, tipi TIMESTAMP luajti një shaka mizore.
Përfundojmë se për detyra të caktuara, ju duhet të zgjidhni llojin e duhur të fushës ose të kontrolloni regjistrimin/daljen në varësi të rezultatit të dëshiruar.

Le të kalojmë te problemet popullore dhe opsionet për zgjidhjen e tyre. Zgjidhni regjistrimet brenda intervalit të caktuar të datave, d.m.th. për një periudhë të caktuar kohe.

ZGJIDH * NGA `emri_tabelës` WHERE `fusha_date` MIDIS "05-07-2014" DHE "2014-07-15" RENDIT SIPAS `fushës së datës`;

Të gjitha regjistrimet do të zgjidhen ku datat në fushën "data_fusha" do të jenë në intervalin nga 5 korriku 2014 deri më 15 korrik 2014, duke përfshirë datat e specifikuara. Nuk duhet të harrojmë se si parazgjedhje datat në MySQL ruhen në formatin "YYYY-MM-DD HH:MM:SS" dhe, në përputhje me rrethanat, maska ​​e formatit është "%Y-%m-%d %H:%i: %s" (standarde ISO). Si ta zgjidhni problemin nëse data nuk vjen në këtë format? Le të hedhim poshtë opsionet PHP dhe të shohim se si mund të bëhet kjo në vetë kërkesën. Dhe për qëllime të tilla, do të na duhet funksioni STR_TO_DATE(). Sintaksë: STR_TO_DATE (rruga, formati), ku " rr" - vargu i datës dhe " format" është formati që korrespondon me të. Le të testojmë:

SELECT STR_TO_DATE("12/31/2013", "%d.%m.%Y"); /* "2013-12-31" */ SELECT STR_TO_DATE("31/12/13 13:50", "%d/%m/%y %H:%i"); /* "2013-12-31 13:50:00" */

Rezultati i ekzekutimit është një datë në formatin që përdoret si parazgjedhje në MySQL. Kjo do të thotë, ne duhet të specifikojmë jo formatin në të cilin duam të marrim datën e daljes, por formatin në të cilin japim datën për përpunim. Duke përdorur këtë metodë, hyrja jonë e mësipërme mund të duket edhe kështu:

SELECT * FROM `table_name` WHERE `date_field` BETWEEN STR_TO_DATE("07/05/2014", "%d.%m.%Y") AND STR_TO_DATE("15 korrik 2014", "%M %d,%Y ") ORDER SIPAS `fushë_datë`;

Meqenëse kemi prekur çështjen e formatimit të datës, le të shohim se si të marrim një datë kur bëjmë kampionim në formatin që na nevojitet, sepse Shumë njerëz janë shumë më të mësuar të shohin "12/31/2014" ose "31 dhjetor 2014" sesa "2014-12-31". Për qëllime të tilla, përdorni funksionin FORMATI I DATËS(). Sintaksë: DATE_FORMAT (data, formati), ku " datë" - vargu i datës dhe " format" - formati që do të konvertohet në " datë". Ndryshe nga funksioni STR_TO_DATE(), ne vetë tregojmë formatin e dëshiruar të daljes, por data duhet të specifikohet në formatin ISO, d.m.th. "YYYY-MM-DD HH:MM:SS". Ne kontrollojmë:

SELECT DATE_FORMAT("2014-12-31", "%d.%m.%Y"); // 12/31/2014 SELECT DATE_FORMAT("2014-12-31", "%d %M %Y"); // 31 dhjetor 2014

Nëse do të komunikonim me ju në kohë reale, atëherë në këtë pikë, ka shumë të ngjarë, pyetja do të ndiqte menjëherë: " Por si ta shfaqni muajin në një gjuhë tjetër: në fund të fundit ukrainisht, rusisht apo kinezisht?"Është shumë e thjeshtë - vendosni vendndodhjen e kërkuar. Dhe kjo mund të bëhet ose në skedarin e konfigurimit MySQL (my.cnf), ose thjesht me një kërkesë nga PHP, pas lidhjes me bazën e të dhënave dhe përpara pyetjeve kryesore:

SET lc_time_ems = ru_RU; SELECT DATE_FORMAT("2014-12-31", "%d %M %Y"); // rezultati: 31 dhjetor 2014 // nëse dëshironi, mund të shtoni edhe "g". ose "viti" SELECT DATE_FORMAT("2014-12-31", "%d %M %Y vit"); // rezultati: 31 dhjetor 2014

Bukuroshja! ;) Dhe disa shembuj të tjerë kërkesash që gjithashtu nevojiten shpesh, por që shkaktojnë konfuzion tek fillestarët.

// Zgjidh të dhënat për ditën aktuale SELECT * FROM `emri_tabelës` WHERE `data_fusha` >= CURDATE(); // Të gjitha regjistrimet për dje SELECT * FROM `emri_tabelës` WHERE `data_fusha` >= DATE_SUB(CURDATE(), INTERVAL 1 DITË) DHE `Fusha e datës` TANI() - INTERVAL 30 DITË; // Zgjidh gjithçka për një muaj të caktuar të vitit aktual (për shembull, muajin maj) SELECT * FROM `table_name` WHERE YEAR(`date_field`) = YEAR(TANI()) AND MONTH(`date_field`) = 5 ; // ose për muajin maj, por në 2009 SELECT * FROM `emri_tabelës` WHERE YEAR(`data_field`) = 2009 AND MONTH(`data_field`) = 5;

Nuk e shoh kuptimin të përshkruaj në detaje funksionet MySQL të përdorura në shembuj, sepse ... ato janë intuitive dhe për një person me të paktën pak njohuri të gjuhës angleze nuk do të jetë e vështirë të kuptojë se, për shembull, funksioni MUAJ() kthen muajin e datës, VITI ()- viti i saj, dhe DITA () (ose sinonim DAYOFMONTH()) - ditë. Fjalë kyçe INTERVALI- shërben për veprimet aritmetike në data dhe ndryshimet e tyre.

ZGJIDH "07-07-2014 23:59:59" + INTERVAL 1 SEKOND; // rezultat: 2014-07-08 00:00:00 ZGJIDH "2014-07-07 23:59:59" + INTERVAL 1 DITË; // rezultat: 2014-07-08 23:59:59 // e njëjta gjë. por duke përdorur funksionin DATE_ADD() SELECT DATE_ADD("2014-07-07 23:59:59", INTERVAL 1 DAY); // 2014-07-08 23:59:59 // Nëse ju duhet të zbrisni në vend që të shtoni SELECT DATE_SUB("2014-07-07 23:59:59", INTERVAL 1 DAY); // 2014-07-06 23:59:59 // ose thjesht ZGJIDH "2014-07-07 23:59:59" - INTERVAL 1 DITE; // 2014-07-06 23:59:59

Këto nuk janë të gjitha funksionet për të punuar me datat dhe unë do t'ju këshilloja t'i kaloni ato për qëllime informative në faqen zyrtare të internetit në mënyrë që të dini për ekzistencën e tyre nëse lind një situatë jo standarde. Por dua të shpresoj që edhe një përmbledhje kaq e vogël e funksioneve të MySQL për të punuar me datat në këtë artikull do t'ju ndihmojë të lundroni situatën dhe të merrni vendimin e duhur. Nëse lindin ende vështirësi, atëherë bëni pyetje në këtë temë ose seksionin "Pyetja juaj". Së bashku do ta kuptojmë ;)

Për një përshkrim të gamës së vlerave për çdo lloj dhe formatet e mundshme të datës dhe orës, shihni seksionin 6.2.2 Llojet e të dhënave të datës dhe orës.

Më poshtë është një shembull që përdor funksionet e datës. Pyetja e mëposhtme zgjedh të gjitha të dhënat me vlerën date_col brenda 30 ditëve të fundit:

Mysql> ZGJIDH diçka FROM tbl_name WHERE TO_DAYS(TANI()) - TO_DAYS(date_col) DAYOFWEEK(datë) Kthen indeksin e ditës së javës për argumentin e datës (1 = e diel, 2 = e hënë, ... 7 = e shtunë ). Këto vlera të indeksit ndjekin standardin ODBC: mysql> SELECT DAYOFWEEK("1998-02-03"); -> 3 WEEKDAY(datë) Jep indeksin e ditës së javës për argumentin e datës (0 = e hënë, 1 = e martë, ... 6 = e diel): mysql> SELECT WEEKDAY("1997-10-04 22: 23:00"); -> 5 mysql> ZGJIDH DITËN E JAVE ("1997-11-05"); -> 2 DAYOFMONTH(datë) Jep numrin rendor të ditës së muajit për argumentin e datës në rangun nga 1 deri në 31: mysql> SELECT DAYOFMONTH("1998-02-03"); -> 3 DAYOFYEAR(datë) Jep numrin rendor të ditës së vitit për argumentin e datës në rangun nga 1 deri në 366: mysql> SELECT DAYOFYEAR("1998-02-03"); -> 34 MUAJ(datë) Jep numrin serial të muajit në vit për argumentin e datës në rangun nga 1 deri në 12: mysql> SELECT MONTH("1998-02-03"); -> 2 DAYNAME(datë) Kthen emrin e ditës së javës për argumentin e datës: mysql> SELECT DAYNAME("1998-02-05"); -> "Tursday" MONTHNAME(data) Kthen emrin e muajit për argumentin e datës: mysql> SELECT MONTHNAME("1998-02-05"); -> "Shkurt" QUARTER(datë) Jep numrin e tremujorit të vitit për argumentin e datës në rangun nga 1 deri në 4: mysql> SELECT QUARTER("98-04-01"); -> 2 JAVA (datë) JAVA (data, e para) Duke pasur parasysh një argument, kthen numrin rendor të javës në vit për datën, duke filluar nga 0 në 53 (po, ndoshta fillimi i javës së 53-të) për rajonet ku të dielën konsiderohet dita e parë e javës. Formulari WEEK() me dy argumente ju lejon të specifikoni nëse java fillon të dielën ose të hënën. Java fillon nga e diela nëse argumenti i dytë është 0, dhe nga e hëna nëse 1: mysql> SELECT WEEK("1998-02-20"); -> 7 mysql> SELECT WEEK("1998-02-20",0); -> 7 mysql> ZGJIDH JAVËN ("1998-02-20",1); -> 8 mysql> ZGJIDH JAVËN ("1998-12-31",1); -> 53 Shënim: Në versionin 4.0, funksioni WEEK(#,0) u ndryshua për t'u përshtatur me kalendarin amerikan. YEAR(datë) Kthen vitin për argumentin e datës në intervalin 1000 deri në 9999: mysql> SELECT YEAR("98-02-03"); -> 1998 YEARWEEK(data) YEARWEEK(data,first) Kthen vitin dhe javën për datën. Argumenti i dytë i këtij funksioni funksionon ngjashëm me argumentin e dytë të funksionit WEEK(). Ju lutemi vini re se viti mund të ndryshojë nga ai i specifikuar në argumentin e datës për javët e para dhe të fundit të vitit: mysql> SELECT YEARWEEK("1987-01-01"); -> 198653 HOUR(time) Kthen orën për argumentin e kohës në intervalin 0 deri në 23: mysql> SELECT HOUR("10:05:03"); -> 10 MINUTE(kohë) Rikthen numrin e minutave për argumentin e kohës në rangun nga 0 në 59: mysql> SELECT MINUTE("98-02-03 10:05:03"); -> 5 SECOND(koha) Rikthen numrin e sekondave për argumentin e kohës në rangun nga 0 në 59: mysql> SELECT SECOND("10:05:03"); -> 3 PERIOD_ADD(P,N) Shton N muaj në periudhën P (në formatin YYMM ose VYYYMM). Kthen një vlerë në formatin YYYYMM. Vini re se argumenti i periudhës P nuk është një vlerë datë: mysql> SELECT PERIOD_ADD(9801,2); -> 199803 PERIOD_DIFF(P1,P2) Jep numrin e muajve ndërmjet periudhave P1 dhe P2. P1 dhe P2 duhet të jenë në formatin YYMM ose YYYYMM. Vini re se argumentet e pikës P1 dhe P2 nuk janë vlera të datës: mysql> SELECT PERIOD_DIFF(9802,199703); -> 11 DATE_ADD(data, lloji INTERVAL expr) DATE_SUB(data, lloji INTERVAL expr) ADDDATE(data, lloji INTERVAL expr) SUBDATE(data, lloji INTERVAL expr) Këto funksione kryejnë veprime aritmetike në data. Të dyja janë të reja në MySQL 3.22. Funksionet ADDDATE() dhe SUBDATE() janë sinonime për DATE_ADD() dhe DATE_SUB(). Në MySQL 3.23, ju mund të përdorni operatorët + dhe - në vend të funksioneve DATE_ADD() dhe DATE_SUB() nëse shprehja e djathtë është një kolonë e tipit DATE ose DATETIME (shih shembullin më poshtë). Argumenti data është një vlerë DATETIME ose DATE që specifikon datën e fillimit. Shprehja expr specifikon sasinë e intervalit për të shtuar ose zbritur nga data e fillimit. Shprehja expr është një varg që mund të fillojë me - për vlerat e intervalit negativ. Fjala kyçe tip tregon se si duhet interpretuar një shprehje e dhënë. Funksioni ndihmës EXTRACT(lloji FROM data) kthen një interval të llojit (llojit) të specifikuar nga një vlerë datë. Tabela e mëposhtme tregon lidhjen midis argumenteve tip dhe expr:

Kuptimi Lloji Formati i pritur ekspr
E DYTËSEKONDA
MINUTEMINUTAT
ORËORË
DITADITË
MUAJMUAJ
VITIVITE
MINUTE_SECOND"MINUTES:SEKONDË"
HOUR_MINUTE"HOURS:MINUTES"
DAY_HOUR"DITË ORË"
YEAR_MONTH"VITE-MUAJ"
HOUR_SECOND"ORË: MINUTA: SEKONDA"
DAY_MINUTE"DITË ORË:MINUTES"
DAY_SECOND"DITË ORË:MINUTA:SEKONDAT"
Në MySQL, formati i shprehjes expr lejon çdo kufi. Kufizuesit e paraqitur në këtë tabelë janë dhënë si shembuj. Nëse data është një vlerë DATE dhe llogaritja e synuar përfshin vetëm pjesët YEAR , MUAJ , dhe DAY (d.m.th., asnjë pjesë TIME), atëherë rezultati përfaqësohet nga një vlerë DATE. Në raste të tjera, rezultati është një vlerë DATETIME: mysql> SELECT "1997-12-31 23:59:59" + INTERVAL 1 SECOND; -> 01-01-1998 00:00:00 mysql> ZGJIDH INTERVALIN 1 DITË + "1997-12-31"; -> 01-01-1998 mysql> ZGJIDH "1998-01-01" - INTERVALI 1 SEKOND; -> 31-12-1997 23:59:59 mysql> ZGJIDH DATE_ADD("31-12-1997 23:59:59", INTERVAL 1 SEKOND); -> 01-01-1998 00:00:00 mysql> ZGJIDH DATE_ADD("31-12-1997 23:59:59", INTERVAL 1 DITË); -> 01-01-1998 23:59:59 mysql> ZGJIDH DATE_ADD("1997-12-31 23:59:59", INTERVAL "1:1" MINUTE_SECOND); -> 1998-01-01 00:01:00 mysql> ZGJIDH DATE_SUB("1998-01-01 00:00:00", INTERVAL "1 1:1:1" DITA_SECOND); -> 1997-12-30 22:58:59 mysql> ZGJIDH DATE_ADD("1998-01-01 00:00:00", INTERVAL "-1 10" DAY_HOUR); -> 30-12-1997 14:00:00 mysql> ZGJIDH DATE_SUB("1998-01-02", INTERVAL 31 DITË); -> 02-12-1997 Nëse intervali i specifikuar është shumë i shkurtër (d.m.th., nuk përfshin të gjitha pjesët e intervalit të pritur nga fjala kyçe e tipit të specifikuar), atëherë MySQL supozon se pjesët më të majta të intervalit janë hequr. Për shembull, nëse argumenti i tipit është DAY_SECOND, atëherë shprehja e pritur expr duhet të ketë pjesët e mëposhtme: ditë, orë, minuta dhe sekonda. Nëse e specifikoni vlerën e intervalit si "1:10" në këtë rast, MySQL supozon se ditët dhe orët janë hequr dhe se vlera përfshin vetëm minutat dhe sekondat. Me fjalë të tjera, kombinimi "1:10" DAY_SECOND interpretohet si i barabartë me "1:10" MINUTE_SECOND . MySQL interpreton vlerat TIME në një mënyrë të ngjashme - duke përfaqësuar kohën e kaluar dhe jo kohën e ditës. Ju lutemi vini re se kur shtoni ose zbritni operacione që përfshijnë një vlerë DATE dhe një shprehje që përmban një pjesë kohore, kjo vlerë DATE do të konvertohet automatikisht në një vlerë të tipit DATETIME: mysql> SELECT DATE_ADD("1999-01-01", INTERVAL 1 DAY ); -> 02-01-1999 mysql> SELECT DATE_ADD("1999-01-01", INTERVAL 1 ORË); -> 01-01-1999 01:00:00 Nëse përdoren vlera të pasakta të datës, rezultati do të jetë NULL. Nëse, kur përmbledhni MONTH , YEAR_MONTH ose YEAR, numri i ditës në datën që rezulton tejkalon numrin maksimal të ditëve në muajin e ri, atëherë numri i ditës së datës që rezulton caktohet në ditën e fundit të muajit të ri: mysql> SELECT DATE_ADD("1998-01-30", INTERVAL 1 MUAJ) ; -> 28-02-1998 Nga shembulli i mëparshëm mund të shihni se fjala INTERVAL dhe lloji i fjalës kyçe nuk janë të ndjeshme ndaj shkronjave të vogla. EXTRACT(lloji FROM data) EXTRACT() përdor të njëjtat lloje intervali si DATE_ADD() ose DATE_SUB(), por EXTRACT() nxjerr një pjesë të vlerës së datës në vend që të kryejë aritmetikë. mysql> ZGJIDH EKSTRAKTIN (VITI NGA "1999-07-02"); -> 1999 mysql> ZGJIDH EKSTRACT (VITI_MUAJ NGA "1999-07-02 01:02:03"); -> 199907 mysql> ZGJIDH EKSTRACT(DITA_MINUTE NGA "02-07-1999 01:02:03"); -> Funksioni 20102 TO_DAYS(datë) kthen numrin e ditës për datën e specifikuar në argumentin e datës, (numri i ditëve që kanë kaluar që nga viti 0): mysql> SELECT TO_DAYS(950501); -> 728779 mysql> SELECT TO_DAYS("1997-10-07"); -> 729669 TO_DAYS() nuk është menduar për përdorim me vlerat e kalendarit para-Gregorian (1582) sepse nuk llogarit ditët e humbura kur kalendari është ndryshuar. FROM_DAYS(N) Kthen vlerën DATE për numrin e ditës së dhënë N: mysql> SELECT FROM_DAYS(729669); -> "1997-10-07" Funksioni FROM_DAYS() nuk është menduar për përdorim me vlerat para prezantimit të kalendarit Gregorian (1582) sepse nuk llogarit ditët e humbura kur kalendari është ndryshuar. DATE_FORMAT(data, formati) Formaton vlerën e datës sipas vargut të formatit. Kualifikuesit e mëposhtëm mund të përdoren në linjën e formatit:
Përcaktues Përshkrim
%MEmri i muajit (janar...dhjetor)
%WEmri i ditës së javës (e diel...e shtunë)
%DDita e muajit me prapashtesë angleze (1, 2, 3, etj.)
%YViti, data, 4 shifra
%yViti, data, 2 shifra
%XViti për një javë ku e diela konsiderohet dita e parë e javës, numri, 4 shifra, përdoret me "%V"
%xViti për një javë ku e diela konsiderohet dita e parë e javës, numri, 4 shifra, përdoret me "%v"
%aEmri i shkurtuar i ditës së javës (Dielli...Sat)
%dDita e muajit, numri (00..31)
%eDita e muajit, numri (0..31)
%mMuaji, data (01.12)
%cMuaji, data (1.12)
%bEmri i shkurtuar i muajit (Jan...Dh)
%jDita e vitit (001..366)
%HOra (00..23)
%kOra (0..23)
%hOra (01..12)
%IOra (01..12)
%lOra (1..12)
%iProcesverbali, numri (00..59)
%rKoha, formati 12-orësh (hh:mm:ss M)
%TOra, formati 24-orësh (hh:mm:ss)
%SSekonda (00..59)
%sSekonda (00..59)
%fqParadite apo pasdite
%wDita e javës (0=E diel..6=E shtunë)
%UJava (00..53), ku e diela konsiderohet dita e parë e javës
%uJava (00..53), ku e hëna konsiderohet dita e parë e javës
%VJava (01..53), ku e diela konsiderohet dita e parë e javës. Përdoret me "%X"
%vJava (01..53), ku e hëna konsiderohet dita e parë e javës. Përdoret me "%x"
%% Fjalë për fjalë `%” .
Të gjithë karakteret e tjera thjesht kopjohen në shprehjen që rezulton pa interpretim: mysql> SELECT DATE_FORMAT("1997-10-04 22:23:00", "%W %M %Y"); -> "Saturday Tetor 1997" mysql> SELECT DATE_FORMAT("1997-10-04 22:23:00", "%H:%i:%s"); -> "22:23:00" mysql> SELECT DATE_FORMAT("1997-10-04 22:23:00", "%D %y %a %d %m %b %j"); -> "4th 97 Sat 04 10 Oct 277" mysql> SELECT DATE_FORMAT("1997-10-04 22:23:00", "%H %k %I %r %T %S %w"); -> "22 22 10 10:23:00 PM 22:23:00 00 6" mysql> SELECT DATE_FORMAT("1999-01-01", "%X %V"); -> "1998 52" Në MySQL 3.23, karakteri `%” duhet t'i paraprijë karaktereve të specifikuesit të formatit. Në versionet e mëparshme të MySQL, karakteri `%” është opsional. TIME_FORMAT(koha, formati) Ky funksion është i ngjashëm me funksionin DATE_FORMAT() të përshkruar më sipër, por vargu i formatit mund të përmbajë vetëm specifikues formati që lidhen me orët, minutat dhe sekondat. Kur specifikoni kualifikues të tjerë, vlera NULL ose 0 do të kthehet. CURDATE() CURRENT_DATE E kthen datën e sotme si vlerë në formatin VVVV-MM-DD ose YYYYMMDD, në varësi të faktit nëse funksioni përdoret në një varg ose kontekst numerik: mysql> SELECT CURDATE(); -> "1997-12-15" mysql> SELECT CURDATE() + 0; -> 19971215 CURTIME() CURRENT_TIME E kthen kohën aktuale si vlerë në formatin HH:MM:SS ose HHMMS, në varësi të faktit nëse funksioni përdoret në një varg ose kontekst numerik: mysql> SELECT CURTIME(); -> "23:50:26" mysql> SELECT CURTIME() + 0; -> 235026 NOW() SYSDATE() CURRENT_TIMESTAMP Rikthen datën dhe kohën aktuale si vlerë në formatin YYYY-MM-DD HH:MM:SS ose YYYYMMDDHHMMSS, në varësi nëse funksioni përdoret në një varg ose kontekst numerik: mysql > ZGJEDH TANI(); -> "15-12-1997 23:50:26" mysql> ZGJEDH TANI() + 0; -> 19971215235026 UNIX_TIMESTAMP() UNIX_TIMESTAMP(datë) Kur thirret pa argument, ky funksion kthen vulën kohore UNIX_TIMESTAMP (sekonda që nga 01-01-1970 00:00:00 GMT) si një numër të plotë të panënshkruar. Nëse funksioni UNIX_TIMESTAMP() thirret me një argument datë, ai kthen vlerën e argumentit si numër sekondash që nga 1970-01-01 00:00:00 GMT. Argumenti i datës mund të jetë një varg DATE, një varg DATETIME, një vlerë TIMESTAMP ose një numër në formatin e kohës lokale YYMMDD ose YYYYMMDD: mysql> SELECT UNIX_TIMESTAMP(); -> 882226357 mysql> ZGJIDH UNIX_TIMESTAMP("1997-10-04 22:23:00"); -> 875996580 Kur përdorni funksionin UNIX_TIMESTAMP në një kolonë TIMESTAMP, ky funksion do të kthejë drejtpërdrejt vlerën e vulës kohore të brendshme, pa konvertimin e nënkuptuar nga vargu në vulë kohore (``string-në-unix-stamp-time""). Nëse data e dhënë është jashtë intervalit të vlefshëm, atëherë funksioni UNIX_TIMESTAMP() do të kthejë 0, por kini parasysh se kryhet vetëm një kontroll bazë (viti 1970-2037, muaji 01-12, dita 01-31). Nëse ju duhet të kryeni zbritjen e kolonës UNIX_TIMESTAMP(), rezultati mund të konvertohet në numra të plotë të nënshkruar. Shih seksionin 6.3.5 Funksionet e konvertimit të tipit. FROM_UNIXTIME(unix_timestamp) Jep një paraqitje të argumentit unix_timestamp si vlerë në formatin YYYY-MM-DD HH:MM:SS ose YYYYMMDDHHMMSS, në varësi të faktit nëse funksioni përdoret në një varg ose kontekst numerik: mysql> SELECT FROM_5996(8870996) ); -> "1997-10-04 22:23:00" mysql> SELECT FROM_UNIXTIME(875996580) + 0; -> 19971004222300 FROM_UNIXTIME(unix_timestamp,format) Jep një paraqitje të vargut të argumentit unix_timestamp, të formatuar sipas vargut të formatit. Vargu i formatit mund të përmbajë të njëjtët kualifikues që janë renditur në përshkrimin për funksionin DATE_FORMAT(): mysql> SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(), "%Y %D %M %h:%i:%s %x"); -> "1997 23 dhjetor 03:43:30 1997" SEC_TO_TIME(sekonda) Rikthen argumentin e sekondave, të konvertuar në orë, minuta dhe sekonda, si vlerë në formatin HH:MM:SS ose HHMMSS, në varësi të kontekstit në funksioni i të cilit përdoret - në varg ose numerik: mysql> SELECT SEC_TO_TIME(2378); -> "00:39:38" mysql> SELECT SEC_TO_TIME(2378) + 0; -> 3938 TIME_TO_SEC(time) Kthen argumentin e kohës të konvertuar në sekonda: mysql> SELECT TIME_TO_SEC("22:23:00"); -> 80580 mysql> ZGJIDH TIME_TO_SEC("00:39:38"); -> 2378

Komentet e përdoruesve

Postuar nga të enjten, 20 qershor 2002, @ 07:08[Fshi] [Redakto]

Kur zgjidhni një lloj të dhënash të vulës kohore nga një tabelë
dhe dëshironi të përshtateni me një zonë kohore (ky shembull është
nga koha e Paqësorit në EST):
SELECT data_format(DATE_ADD(,
INTERVALI 3 ORË), "%M %e, %Y në %H:%i EST") FROM
;

Postuar nga Dan Allen të martën, 25 qershor 2002, @12:50[Fshi] [Redakto]

A e vëren dikush tjetër këtë
funksionin
YEARMONTH() mungon hapur!!! Thuaj se keni
dy takime dhe doni të bëni një period_diff...ju
thjesht nuk mund të lidhni() YEAR() dhe MONTH() sepse
muaji nuk është "0" i mbushur...thjesht duket me
YEARWEEK() do të kishte kuptim të kishim gjithashtu
VITI ()...mendime? E di që mund ta bësh me
DATE_FORMAT, por atëherë pse gjithë të tjerët
funksione?

Postuar nga të mërkurën, 18 dhjetor 2002, @ 17:28[Fshi] [Redakto]

Më duhet të pyes veten pse nuk ka një funksion të tillë
bën në thelb atë që bën kjo:

ZGJIDH KATIN((UNIX_TIMESTAMP(TANI()) -
UNIX_TIMESTAMP (data_lindja))/60/60/24/364,25)
si mosha

Do të bënte që shumë kode të dukeshin shumë
pastrues.

Kjo është madje e një rëndësie të veçantë për përdorim

ruajtjen o mbledhjen e të dhënave për njerëzit në SHBA,
pasi ligji amerikan ndalon mbledhjen e personale
informacione për këdo nën 13 vjeç,
dhe ky truk tregon moshën e tyre në vite.

Do të ishte shumë më mirë me një AGE (datë
[,data 2]
) funksion.

Gjëja më e afërt atje është period_diff,
e cila
nuk pranon një varg data standarde dhe kthehet
muaj, të cilët janë oh kaq-
të dobishme

Në fakt, kjo nuk funksionon në rastin e para-
datat e epokës, më keq akoma. unix_timestamp
kthen 0 për të gjitha datat e para-epokës.

Unë pretendoj se është një gabim dhe me të vërtetë ka nevojë
te
të rregullohet.

Duhet të përdor period_diff/12 mendoj.

Postuar nga Matthew Mullenweg të mërkurën, 18 dhjetor 2002, @ 17:27[Fshi] [Redakto]

Ju sjellni disa çështje të rëndësishme, por
të merresh me moshat në të vërtetë nuk është kështu se
vështirë. Për
shembull ju mund të bëni diçka të tillë:

Mysql> ZGJIDH DATE_FORMAT(
FROM_DAYS(TO_DAYS(TANI())-TO_DAYS(dob)), "%Y")+0
SI mosha NGA njerëzit;

Ku "dob" është padyshim data e lindjes së tyre.
Do të funksionojë gjithashtu me datat para dhe pas epokës.
Ju lutemi falni formatimin e shokuar si
sistemi i komenteve duket se insiston në futjen e rreshtit
depërton në bllokun e kodit. I
hasi në këtë problem ndërsa punonte në disa
gjëra gjenealogjike gjatë në href="http://www.mullenweg.com" >Mullenweg.com
, një faqe familjare. Shpresoj se kjo ndihmon!

Postuar nga Dan Allen të mërkurën, 18 dhjetor 2002, @ 17:31[Fshi] [Redakto]



Duket të jetë një dhimbje e vërtetë për të marrë ditët në
muaj, por këtu është një mënyrë

zgjidhni
DATE_FORMAT(CONCAT(YEAR("2002-05-05"), "-",
MUAJ ("2002-05-05" + INTERVAL 1 MUAJ), "-01") -
INTERVALI 1 DITË, "%e") si numDays

Mendoj se do të ishte mirë nëse do të kishim vetëm një
DATE_FORMAT subjekt për këtë

Postuar nga Isaac Shepard të mërkurën, 18 dhjetor 2002, @ 17:31[Fshi] [Redakto]

Nëse jeni duke kërkuar për pyetje të përgjithshme SQL që do
ju lejon të merrni ditët, muajt dhe vitet
midis dy datave të dhëna, mund të merrni parasysh
duke përdorur këto. Thjesht duhet të zëvendësoni datën1 dhe
date2 me fushat tuaja të datës dhe mytable me tuajin
emri i tabelës.






Numri i ditëve ndërmjet datës 1 dhe datës 2:

ZGJIDH TO_DAYS (data 2) -
TO_DAYS(data 1) NGA `mytable` WHERE
1






Numri i muajve midis datës 1 dhe datës 2:

ZGJIDH PERIOD_DIFF
(DATE_FORMAT(data 2,"%Y%m"), DATE_FORMAT
(data 1,"%Y%m")) - (MID(data 2, 6, 5)< MID(date1,
6, 5)) NGA `mytable` KU 1






Numri i viteve midis datës 1 dhe datës 2:

SELECT (VITI(data 2) - VITI
(data 1)) - (MID(data 2, 6, 5)< MID(date1, 6, 5))
NGA `mytable` KU 1

Tani për disa komente për këto.

1. Këto rezultate kthejnë numrin e plotë të viteve,
muaj dhe ditë. Ata janë "dysheme". Kështu, 1.4
ditët do të shfaqen si 1 ditë dhe 13,9 vjet do të shfaqen
shfaqet si 13 vjeç.

2. Vini re se unë përdor shprehje boolean në disa
rastet. Sepse shprehjet boolean vlerësohen në 0
ose 1, mund t'i përdor për të zbritur 1 nga totali
bazuar në një kusht.

Për shembull, për të llogaritur numrin e viteve
ndërmjet datave, së pari thjesht zbritni vitet.
Problemi është se ta bësh këtë nuk është gjithmonë e saktë.
Merrni parasysh numrin e viteve midis 1 korrikut 1950
dhe 1 maj 1952. Teknikisht ka vetëm një të plotë
vit mes tyre. Më 1 korrik 1952 e më vonë,
do të ketë dy vjet. Prandaj, ju duhet
zbres një vit në rast se data nuk është ende
arriti një vit të plotë. Kjo bëhet duke kontrolluar nëse
dita e muajit të dytë është para muajit të parë -
ditë. Nëse po, kjo rezulton në një vlerë prej 1, që është
zbritet nga totali.

3. Për të marrë ditën e muajit, unë përdor MID. Kjo eshte me mire
sesa përdorimi i RIGHT, pasi do të funksionojë për të dyja datat
dhe oraret e datave.

4. Siç u përmend në një postim të mëparshëm, PERIOD_DIFF
ka nevojë për formatin e muajit të vitit, por në të vërtetë nuk ka më të mirën
mënyrë për ta bërë këtë. Për ta marrë këtë, unë përdor DATE_FORMAT
(data 1,"%Y%m").

5. Ndryshe nga shumë zgjidhje të tjera, këto pyetje duhet
punë me data para 01/01/1970.

6. Reagimet do të vlerësoheshin shumë. Meqenëse jam
duke e përdorur këtë në aplikacionet e mia, do të isha i lumtur nëse
më njoftoni nëse zbuloni një gabim në logjikë.

Postuar nga Jason Rust të mërkurën, 18 dhjetor 2002, @ 17:31[Fshi] [Redakto]

Disa herë të tjera midis funksioneve. Kjo është
një mënyrë tjetër për të llogaritur muajt ndërmjet dy
data të cilat mund t'ju vijnë në ndihmë nganjëherë ashtu siç është
lineare:


Muajt ​​ndërmjet 2002-02-15 dhe
2002-01-15
((VITI ("2002-02-15") - 1) * 12 +
MUAJ("2002-02-15")) - ((VITI("2002-01-15") - 1) *
12 + MUAJ ("2002-01-15"))) - (MID("2002-01-15", 9,
2) < MID("2002-02-15", 9, 2))

Më poshtë është një javë ndërmjet funksionit:

Javët ndërmjet 2002-08-28 dhe
2002-08-21
FLOOR((TO_DAYS("28-08-2002") -
TO_DAYS ("2002-08-21")) / 7)

Postuar nga të enjten, 12 shtator 2002, @ 6:22[Fshi] [Redakto]

Nuk mund të bësh DATE_ADD("15:30:00", INTERVAL 55
MINUTE), do të kthejë NULL, zgjidhjen që gjeta
është:
DATE_FORMAT(DATE_ADD(CONCAT("2000-01-
01 ",`fusha_kohore`),INTERVAL "minuta" MINUTE), "%
H:%i:%s")

Postuar nga Marcelo Celleri të martën, 17 shtator 2002, @ 14:58[Fshi] [Redakto]

Unë kam dy fusha të orës së datës, (data_out, data_in),
ato janë regjistrime të kohëve të hyrjes dhe daljes dhe unë
duhet të gjesh mënyrën për të bërë dallimin mes tyre
të dy, dhe unë provova këtë: f_out -
f_in por më dha një rezultat të plotë që është
e pavlefshme për mua, kam nevojë për ndryshimin në
sekonda A mund të më ndihmoni ju lutem, sepse nuk e bëj
keni një ide se si ta konvertoni këtë përgjigje në sekonda

Postuar nga Ricky Orea të martën, 12 nëntor 2002, @3:51 pasdite[Fshi] [Redakto]

Përdoruesi im fut një datë në format
e "MM/DD/VVVVV", si mund ta konvertoj atë në
formatoni "YYYY/MM/DD" përpara se ta ruaj në një mysql
tavoline?

Postuar nga Ram Narayan të hënën, 18 nëntor 2002, @ 20:46[Fshi] [Redakto]

Pershendetje te gjitheve,
Duke shtuar pyetjen e mikut tim Ricky Orea, Nëse përdoruesi im
fut datën në formatin dd mmm vvv (26 nëntor
2002), si duhet të fut në mysql db.

Postuar nga louis bennett të enjten, 21 nëntor 2002, @11:35 paradite[Fshi] [Redakto]

%d dita e muajit, numerike (00..31)
%e Dita e muajit, numerike (0..31)

Për të mos qenë pedant, por nuk ka një ditë "0"
ne nje muaj...

Postuar nga Twidi të mërkurën, 18 dhjetor 2002, @ 17:27[Fshi] [Redakto]

Si të merrni numrin e ditëve në një muaj:

Merrni vetëm ditën e parë të muajit, shtoni një
muaji (për të marrë ditën e parë të muajit të ardhshëm) dhe
zbrit një ditë (për të marrë ditën e fundit të
muajin e kaluar, ky është numri i ditëve), si
ndiqni:

Zgjidhni
dita e muajit(data_nën(data_shtimi(koncat(formati_data(MYDATE,
"%Y-%m"), "-01"), intervali 1 muaj), intervali 1
ditë)) si numër_ditësh nga MYTABLE;

(thjesht zëvendësoni MYDATE dhe MYTABLE)

Ndoshta ka një mënyrë tjetër ...

Postuar nga të dielën, 1 dhjetor 2002, @10:46[ të mërkurën 8 janar 2003, @5:25[Fshi] [Redakto]

Po përpiqem të shkruaj një skript MySQL që do të mbushë një tabelë me të dhëna për secilën vlerë midis 2 parametrave të dhënë. Pa strukturën e lakut të disponueshme në
Procedurat e ruajtura, kjo po rezulton problematike. A ka dikush një zgjidhje?

Shembull i përafërt: -
Tabela "test" ka një fushë datë "test_data".

MySql nuk është vetëm një sistem tërheqës për organizimin e ruajtjes së të dhënave, por edhe një MJEGËL SHKELQYER për përpunimin e informacionit.

Sot do të shikojmë punën me funksionet mysql: Date, DateTime. Do të flas gjithashtu për metodat mysql të përdorura për të kthyer një varg në një datë. Në përgjithësi, ka qasje të ndryshme për zgjidhjen e problemeve që lidhen me datat në DBMS mysql.

Problem.

Le të imagjinojmë se po shkruani një sistem për dërgimin e njoftimeve SMS në bazën tuaj të klientëve.
Tabela 1. tbl_clients* - tabela me të dhënat e klientit (emri i plotë dhe data e lindjes), të dhëna për sasinë, llojin e produktit dhe statusin e përpunimit të aplikacionit.

Tabela 2. tbl_sms – tabela e statuseve të SMS-ve dhe lidhja e ID-së së klientit me datën e marrjes së statusit.

Më afër luftimit. Ne armatosemi me funksione të integruara.

Tabela tbl_sms përmban disa rekorde për një Id_client, me statuse dhe kohë të ndryshme pranimi. Për shembull:

Le të supozojmë se shefi kërkon një listë të statuseve më të fundit për të gjithë klientët. Ju mund ta zgjidhni shpejt problemin duke përdorur funksionet e integruara. Pyetja sql për këtë rast duket si kjo:

SELECT * NGA tbl_sms ts JOIN (SELECT Id_clients, max(Date_status) as max_dat FROM tbl_sms GROUP BY BY Id_clients) ts_max ON ts. id_clients = ts_max. id_clients dhe ts. Data_status= ts_max.max_dat ;

Rezultati i pyetjes është një përzgjedhje e të dhënave me datën maksimale për secilin klient_Id:

Kërkesa është komplekse, nuk e kuptova herën e parë, por do të përpiqem të shpjegoj. Në një pyetje, ne bashkojmë dy tabela. Tbl_sms i parë përmban të gjitha të dhënat pa marrë parasysh kushtet, si të thuash në "formë të papërpunuar". Tabela e dytë është rezultat i pyetjes

SELECT Id_clients, max(Date_status) as max_dat FROM tbl_sms GROUP BY Id_clients ;

në të njëjtin tbl_sms duke përdorur funksionin MAX() dhe grupimin sipas fushës Id_clients.

Në tabelën e dytë, ne grupojmë regjistrimet sipas id_clients duke përdorur konstruktin "GROUP BY Id_clients". Kjo do të thotë, tani kemi një rekord (megjithëse ka disa regjistrime në tabelë për një vlerë id_clients) - kjo është një vlerë e fushës id_clients. Në SELECT përdorim funksionin MAX(), rezultati i të cilit është zgjedhja e vlerës maksimale të regjistruar në fushën e tabelës. Për referencë, në DBMS mysql ekziston një funksion i kundërt MIN(). Si rezultat, në një pyetje duke përdorur funksionin MAX(), marrim vlerën maksimale të fushës Date_status për secilën vlerë të fushës id_clients.
Dhe së fundi, përzgjedhja e regjistrimeve që plotësojnë kushtet e mëposhtme: “ON ts. id_clients = ts_max. id_clients dhe ts. Data_status= ts_max.max_dat”, marrim rezultatin e dëshiruar.

Shefi është i kënaqur. Por më pas vjen një kontabilist dhe vendos një detyrë të re: "Duhet të zgjedhim të gjitha statuset që kemi marrë vetëm për 10/05/2014."

Ne shkruajmë kërkesën e mëposhtme:

SELECT * FROM tbl_sms WHERE Date_status>'2014-10-05 00:00:00' Dhe Statusi_Date<’2014-10-05 23:59:59’ ;

Meqenëse lloji i të dhënave të fushës Date_status është DATETIME, prandaj vendosim kushtet e mëposhtme: vlerën Nga ora 00:00 deri në 23:59 10/05/2014 - kjo periudhë përfshin saktësisht një ditë ose 24 orë. Duhet t'i kushtoni vëmendje formës së regjistrimit të datës. Në llojin e të dhënave Date në mysql, ne përfaqësojmë datën në formatin e mëposhtëm Viti(4)-Muaji(2)-Dita(2). Nëse fusha "statusi" do të ishte në formatin DATE, kërkesa do të dukej kështu:

SELECT * FROM tbl_sms WHERE Date_status="2014-10-05";

Ne e kuptuam detyrën e kontabilistit. Raportet janë dorëzuar. Tani le të shohim punën me datat në mysql nga një kënd tjetër - nëse data përfaqësohet si një varg. Ndonjëherë ndodh…

Data në llojin VARCHAR ose CHAR... Çfarë të bëni? Përdorimi i funksionit të konvertimit të vargut.

Unë vetë kam hasur në një problem të ngjashëm më shumë se një herë. Fakti është se nëse keni një datë në formën e një vargu, atëherë të gjitha pyetjet e përshkruara më sipër bëhen të padobishme. Për shembull, ju duhet të zgjidhni të gjithë klientët, vlerat e fushës Date_Zap të të cilëve qëndrojnë në një periudhë të caktuar data. Mos i rendis të gjitha datat... Sigurisht që jo. Gjithmonë ka një rrugëdalje dhe funksionet e integruara do të na ndihmojnë përsëri. Për një detyrë të tillë në mysql, ekziston një funksion STR_TO_DATE().
Siç sugjeron emri, funksioni konverton një varg në një datë. Argumentet për funksionin STR_TO_DATE janë një datë në një lloj të dhënash CHAR ose VARCHAR dhe formati i datës YOU KALONI.

Për shembull, ju do të pyesni tabelën tbl_clients:

SELECT Date_Zap, STR_TO_DATE(Date_Zap,'%d.%m.%Y') FROM tbl_clients WHERE id_clietns='345';

Rezultati i përdorimit të funksionit STR_TO_DATE():

Siç mund ta shihni, nga formati i zakonshëm i datës marrim një datë të formatit mysql. Disa komente në lidhje me kërkesën:

  • Nëse nuk jeni plotësisht të sigurt për rezultatin e funksionit, bëni gjithmonë si këtu për të parë vlerat e fushës para dhe pas transformimit. Kjo do t'ju kursejë nervat.
  • Nëse do të përdorni rezultatin, për shembull, në një program dhe do ta përdorni atë me emrin e fushës, atëherë ju këshilloj të zëvendësoni emrin e gjatë "STR_TO_DATE(Date_Zap,'%d.%m.%Y')", për shembull, me emrin Data_Mysql, për këtë modifikojmë pyetjen
SELECT Date_Zap, STR_TO_DATE(Date_Zap,'%d.%m.%Y') si Data_Mysql FROM tbl_clients WHERE id_clietns='345';

Rezultati i përdorimit të funksionit të konvertimit të një vargu në një format të datës mysql (STR_TO_DATE()):

Shfaq datën me fjalë.

Shpesh është e nevojshme të sigurohet që kur krijoni raporte nga një bazë të dhënash (mysql), data e dokumenteve duhet të jetë në formatin "Dita Muaji me fjalë Viti". Për shembull: ka "10/21/2014", por ju duhet "21 tetor 2014". Kur hasa një problem të tillë, shkrova një përpunim të tërë në Delphi për të gjeneruar datën. Doli që mysql DBMS tashmë ka një funksion të integruar për konvertimin e një date nga një paraqitje numerike në një datë me fjalë. Dhe, siç thashë në fillim, mysql nuk është vetëm një mjet për menaxhimin e ruajtjes së të dhënave, por edhe një mjet përpunimi informacioni.
Pra, është e lehtë të marrësh një datë në formatin e përshkruar më sipër në një kërkesë të thjeshtë:

SELECT DATE_FORMAT('2014-10-21','%d %M %Y') si Data_Mysql; //Vini re drejtshkrimin %M

Gjithçka do të ishte mirë, data shfaqet me fjalë, por emri i muajit është në anglisht. Kjo mund të ndodhë nëse serveri ka një ndryshore globale lc_time_names=en_EN. Vlera për datën ruse do të jetë e barabartë me: lc_time_names=ru_RU.
Ka disa opsione për zgjidhjen e këtij problemi.
Opsioni i parë është të vendosni vlerën e paracaktuar në konfigurimin e serverit mysql. Për ta bërë këtë, hapni my.ini në drejtorinë ku është instaluar serveri mysql dhe në seksionin "", futni rreshtin "lc_time_names = "ru_RU"".
Opsioni i dytë do t'ju përshtatet nëse nuk ka qasje të drejtpërdrejtë në konfigurimin mysql. Vlera e variablit mund të ndryshohet kur ekzekutohet një pyetje sql. Thjesht bëni sa më poshtë përpara kërkesës: "SET lc_time_names = 'ru_RU';". Me këtë komandë ju vendosni vlerën e ndryshores lc_time_names në këtë sesion me serverin mysql. Kjo do të thotë, nëse humbni lidhjen me serverin mysql, kur të rilidheni, ai do të vendoset në vlerën e paracaktuar "en_EN".
Prandaj, ju këshilloj të përdorni komandën menjëherë përpara se të ekzekutoni pyetjen sql. Në këtë rast, pyetja përfundimtare do të duket si kjo:

SET lc_time_names = "ru_RU"; SELECT DATE_FORMAT('2014-10-21','%d %M %Y') si 'Data_Mysql';

Rezultati i pyetjes sql duke përdorur funksionin DATE_FORMAT():

Siç mund ta shihni, gjithçka është bërë e saktë, emri i muajit është bërë rus.
Kështu, duke përdorur funksionet mysql, është e lehtë dhe e shpejtë për të përpunuar informacionin. Unë ju këshilloj të mos bëni punë që mund t'ia delegoni mjeteve mysql. Në këtë mënyrë ju duhet të shkruani më pak kod, dhe në 90% të rasteve një sistem i tillë do të funksionojë më stabil. Testuar nga përvoja ime. Shpresoj se ky artikull do të jetë i dobishëm për ju, të dashur lexues! Përshëndetje, Shinobi juaj.

Më poshtë është një shembull që përdor funksionet e datës. Pyetja e mëposhtme zgjedh të gjitha të dhënat me vlerën date_col brenda 30 ditëve të fundit:

Mysql> ZGJIDH diçka NGA tbl_name WHERE TO_DAYS(TANI()) - TO_DAYS(data_col)<= 30;

Rikthen indeksin e ditës së javës për datën (0 = e hënë, 1 = e martë, ... 6 = e diel):

Mysql> ZGJIDH DITËN E JAVE ("03-02-1998 22:23:00"); -> 1 mysql> ZGJIDH DITËN E JAVE ("1997-11-05"); -> 2

DAYOFMONTH (datë)

Rikthen numrin rendor të ditës së muajit për argumentin e datës, në intervalin nga 1 në 31:

Mysql> ZGJIDH DAYOFMONTH("1998-02-03"); -> 3

Rikthen numrin rendor të ditës së vitit për argumentin e datës, në intervalin nga 1 në 366:

Mysql> SELECT DAYOFYEAR("1998-02-03"); -> 34

Rikthen numrin serial të muajit në vit për argumentin e datës, duke filluar nga 1 në 12:

Mysql> ZGJIDH MUAJIN("1998-02-03"); -> 2

Kthen emrin e ditës së javës për argumentin e datës:

Mysql> SELECT DAYNAME("1998-02-05"); -> "E enjte"

Kthen emrin e muajit për argumentin e datës:

Mysql> SELECT MONTHNAME("1998-02-05"); -> "shkurt"

Rikthen numrin e tremujorit të vitit për argumentin e datës, duke filluar nga 1 në 4:

Mysql> SELECT QUARTER("98-04-01"); -> 2

JAVA (data) , JAVA (data, e para)

Duke pasur parasysh një argument, kthen numrin rendor të javës në vit për datën, duke filluar nga 0 në 53 (po, ndoshta fillimi i javës së 53-të) për rajonet ku e diela konsiderohet dita e parë e javës. Formulari WEEK() me dy argumente ju lejon të specifikoni nëse java fillon të dielën ose të hënën. Rezultati do të jetë në intervalin 0-53 ose 1-52.

Ja se si funksionon argumenti i dytë:

Mysql> ZGJIDH JAVËN ("1998-02-20"); -> 7 mysql> SELECT WEEK("1998-02-20",0); -> 7 mysql> ZGJIDH JAVËN ("1998-02-20",1); -> 8 mysql> ZGJIDH JAVËN ("1998-12-31",1); -> 53

Shënim: Në versionin 4.0, funksioni WEEK(#,0) u ndryshua për t'u përshtatur me kalendarin amerikan.

Vini re se nëse java është java e fundit e vitit të kaluar, MySQL do të kthejë 0 nëse nuk specifikoni 2 ose 3 si një argument opsional:

Mysql> ZGJIDH VITIN ("2000-01-01"), JAVA ("2000-01-01",0); -> 2000, 0 mysql> SELECT WEEK("2000-01-01",2); -> 52

Mund të supozojmë se MySQL duhet të kthejë 52 sepse kjo datë është java e 52-të e vitit 1999. Ne vendosëm të kthejmë 0 sepse duam që funksioni të japë "numrin e javës në vitin e specifikuar". Kjo e bën funksionin WEEK() më të besueshëm kur përdoret në lidhje me funksione të tjera që llogaritin pjesë të datave.

Nëse ende ju intereson javën e duhur të vitit, atëherë mund të përdorni 2 ose 3 si argument opsional, ose përdorni YEARWEEK()

Mysql> ZGJIDH VITIN JAVE("2000-01-01"); -> 199952 mysql> ZGJIDH MID(YEARWEEK("2000-01-01"),5,2); -> 52

Kthen vitin për datën në intervalin 1000 deri në 9999:

Mysql> ZGJIDH VITIN ("98-02-03"); -> 1998

YEARWEEK (data) , YEARWEEK (data, e para)

Kthen vitin dhe javën për argumentin e datës. Argumenti i dytë i këtij funksioni funksionon ngjashëm me argumentin e dytë të funksionit WEEK(). Vini re se viti mund të ndryshojë nga data e specifikuar për javët e para dhe të fundit të vitit:

Mysql> ZGJIDH VITIN JAVE ("1987-01-01"); -> 198653

Vini re se numri i javës është i ndryshëm nga ai që kthen WEEK() (0) kur thirret me argumentin opsional 0 ose 1. Kjo ndodh sepse WEEK() kthen numrin e javës në vitin e specifikuar.

Rikthen orën për argumentin e kohës, duke filluar nga 0 në 23:

Mysql> SELECT HOUR("10:05:03"); -> 10

Rikthen numrin e minutave për argumentin e kohës, duke filluar nga 0 në 59:

Mysql> SELECT MINUTE("98-02-03 10:05:03"); -> 5

Rikthen numrin e sekondave për argumentin e kohës, duke filluar nga 0 në 59:

Mysql> ZGJIDH TË DYTËN("10:05:03"); -> 3

Shton N muaj në periudhën P (në formatin YYMM ose YYYYMM). Kthen një vlerë në formatin YYYYMM. Vini re se argumenti i periudhës P nuk është një vlerë datë:

Mysql> SELECT PERIOD_ADD(9801,2); -> 199803

PERIOD_DIFF (P1, P2)

Rikthen numrin e muajve ndërmjet periudhave P1 dhe P2. P1 dhe P2 duhet të jenë në formatin YYMM ose YYYYMM. Vini re se argumentet e periudhës P1 dhe P2 nuk janë vlera datë:

Mysql> SELECT PERIOD_DIFF(9802,199703); -> 11

DATE_ADD (data, lloji i eksprimit INTERVAL) , DATE_SUB (data, lloji i eksprimit INTERVAL) , ADDDATE (data, lloji i eksprimit INTERVAL) , SUBDATE (data, lloji i eksprimit INTERVAL)

Këto funksione kryejnë veprime aritmetike në data. Të dyja janë të reja në MySQL 3.22. Funksionet ADDDATE() dhe SUBDATE() janë sinonime për DATE_ADD() dhe DATE_SUB(). Në MySQL 3.23, ju mund të përdorni operatorët + dhe - në vend të funksioneve DATE_ADD() dhe DATE_SUB() nëse shprehja e djathtë është një kolonë e tipit DATE ose DATETIME (shih shembullin më poshtë). Argumenti data është një vlerë DATETIME ose DATE që specifikon datën e fillimit.

Shprehja expr specifikon sasinë e intervalit për të shtuar ose zbritur nga data e fillimit. Shprehja expr është një varg që mund të fillojë me - për vlerat e intervalit negativ. Fjala kyçe tip tregon se si duhet interpretuar një shprehje e dhënë. Funksioni ndihmës EXTRACT(lloji FROM data) kthen një interval të llojit (llojit) të specifikuar nga një vlerë datë. Tabela e mëposhtme tregon marrëdhënien midis argumenteve tip dhe expr:

Kuptimi Lloji Formati i pritur ekspr
E DYTË SEKONDA
MINUTE MINUTAT
ORË ORË
DITA DITË
MUAJ MUAJ
VITI VITE
MINUTE_SECOND "MINUTES:SEKONDË"
HOUR_MINUTE "HOURS:MINUTES"
DAY_HOUR "DITË ORË"
YEAR_MONTH "VITE-MUAJ"
HOUR_SECOND "ORË: MINUTA: SEKONDA"
DAY_MINUTE "DITË ORË:MINUTES"
DAY_SECOND "DITË ORË:MINUTA:SEKONDAT"

Në MySQL, formati i shprehjes expr lejon çdo kufi. Kufizuesit e paraqitur në këtë tabelë janë dhënë si shembuj. Nëse data është një vlerë DATE dhe llogaritja e synuar përfshin vetëm pjesët YEAR , MUAJ , dhe DAY (d.m.th., asnjë pjesë TIME), atëherë rezultati përfaqësohet nga një vlerë DATE. Në raste të tjera, rezultati është një vlerë DATETIME:

Mysql> ZGJIDH "1997-12-31 23:59:59" + INTERVAL 1 SEKOND; -> 01-01-1998 00:00:00 mysql> ZGJIDH INTERVALIN 1 DITË + "1997-12-31"; -> 01-01-1998 mysql> ZGJIDH "1998-01-01" - INTERVALI 1 SEKOND; -> 31-12-1997 23:59:59 mysql> ZGJIDH DATE_ADD("31-12-1997 23:59:59", INTERVAL 1 SEKOND); -> 01-01-1998 00:00:00 mysql> ZGJIDH DATE_ADD("31-12-1997 23:59:59", INTERVAL 1 DITË); -> 01-01-1998 23:59:59 mysql> ZGJIDH DATE_ADD("1997-12-31 23:59:59", INTERVAL "1:1" MINUTE_SECOND); -> 1998-01-01 00:01:00 mysql> ZGJIDH DATE_SUB("1998-01-01 00:00:00", INTERVAL "1 1:1:1" DITA_SECOND); -> 1997-12-30 22:58:59 mysql> ZGJIDH DATE_ADD("1998-01-01 00:00:00", INTERVAL "-1 10" DAY_HOUR); -> 30-12-1997 14:00:00 mysql> ZGJIDH DATE_SUB("1998-01-02", INTERVAL 31 DITË); -> 1997-12-02

Nëse intervali i specifikuar është shumë i shkurtër (d.m.th., nuk përfshin të gjitha pjesët e intervalit të pritur nga fjala kyçe e tipit të specifikuar), atëherë MySQL supozon se pjesët më të majta të intervalit janë hequr. Për shembull, nëse argumenti i tipit është DAY_SECOND, atëherë shprehja e pritur expr duhet të ketë pjesët e mëposhtme: ditë, orë, minuta dhe sekonda. Nëse e specifikoni vlerën e intervalit si "1:10" në këtë rast, MySQL supozon se ditët dhe orët janë hequr dhe se vlera përfshin vetëm minutat dhe sekondat. Me fjalë të tjera, kombinimi "1:10" DAY_SECOND interpretohet si i barabartë me "1:10" MINUTE_SECOND . MySQL interpreton vlerat TIME në një mënyrë të ngjashme - duke përfaqësuar kohën e kaluar dhe jo kohën e ditës. Ju lutemi vini re se kur shtoni ose zbritni operacione që përfshijnë një vlerë DATE dhe një shprehje që përmban një pjesë kohore, kjo vlerë DATE do të konvertohet automatikisht në një vlerë të tipit DATETIME:

Mysql> SELECT DATE_ADD("1999-01-01", INTERVAL 1 DITE); -> 02-01-1999 mysql> SELECT DATE_ADD("1999-01-01", INTERVAL 1 ORË); -> 01-01-1999 01:00:00

Nëse përdorni vlera të pasakta të datës, rezultati do të jetë NULL. Nëse, kur përmbledhim MONTH , YEAR_MONTH ose YEAR, numri i ditës në datën që rezulton tejkalon numrin maksimal të ditëve në muajin e ri, atëherë numri i ditës së datës që rezulton caktohet në ditën e fundit të muajit të ri:

Mysql> SELECT DATE_ADD("1998-01-30", INTERVAL 1 MUAJ); -> 28-02-1998

Nga shembulli i mëparshëm, mund të shihni se fjala INTERVAL dhe fjala kyçe tip nuk janë të ndjeshme ndaj shkronjave të vogla.

EKSTRAKT (lloji nga data)

Funksioni EXTRACT() përdor të njëjtat lloje intervali si funksionet DATE_ADD() ose DATE_SUB(), por EXTRACT() nxjerr një pjesë të një vlere datë në vend që të kryejë aritmetikë.

Mysql> ZGJIDH EKSTRAKTIN (VITI NGA "1999-07-02"); -> 1999 mysql> ZGJIDH EKSTRACT (VITI_MUAJ NGA "1999-07-02 01:02:03"); -> 199907 mysql> ZGJIDH EKSTRACT(DITA_MINUTE NGA "02-07-1999 01:02:03"); -> 20102

funksioni kthen numrin e ditës për datën e specifikuar në argumentin e datës, (numri i ditëve që kanë kaluar që nga viti 0):

Mysql> SELECT TO_DAYS(950501); -> 728779 mysql> SELECT TO_DAYS("1997-10-07"); -> 729669

Funksioni TO_DAYS() nuk është menduar për përdorim me vlerat para prezantimit të kalendarit Gregorian (1582) sepse nuk merr parasysh ditët e humbura kur kalendari është ndryshuar.

Kthen vlerën DATE për numrin e ditës së dhënë N:

Mysql> SELECT FROM_DAYS(729669); -> "1997-10-07"

Funksioni FROM_DAYS() nuk është menduar për përdorim me vlerat para prezantimit të kalendarit gregorian (1582) sepse nuk llogarit ditët e humbura kur kalendari është ndryshuar.

DATE_FORMAT (data, formati)

Formaton vlerën e datës sipas vargut të formatit. Kualifikuesit e mëposhtëm mund të përdoren në linjën e formatit:

Përcaktues Përshkrim
%M Emri i muajit (janar...dhjetor)
%W Emri i ditës së javës (e diel...e shtunë)
%D Dita e muajit me prapashtesë angleze (0, 1, 2, 3, etj.)
%Y Viti, data, 4 shifra
%y Viti, data, 2 shifra
%X Viti për një javë ku e diela konsiderohet dita e parë e javës, numri, 4 shifra, përdoret me "%V"
%x Viti për një javë ku e diela konsiderohet dita e parë e javës, numri, 4 shifra, përdoret me "%v"
%a Emri i shkurtuar i ditës së javës (Dielli...Sat)
%d Dita e muajit, numri (00..31)
%e Dita e muajit, numri (0..31)
%m Muaj, ditë (00..12)
%c Muaji, data (0..12)
%b Emri i shkurtuar i muajit (Jan...Dh)
%j Dita e vitit (001..366)
%H Ora (00..23)
%k Ora (0..23)
%h Ora (01..12)
%I Ora (01..12)
%l Ora (1..12)
%i Procesverbali, numri (00..59)
%r Koha, formati 12-orësh (hh:mm:ss M)
%T Ora, formati 24-orësh (hh:mm:ss)
%S Sekonda (00..59)
%s Sekonda (00..59)
%fq Paradite apo pasdite
%w Dita e javës (0=E diel..6=E shtunë)
%U Java (00..53), ku e diela konsiderohet dita e parë e javës
%u Java (00..53), ku e hëna konsiderohet dita e parë e javës
%V Java (01..53), ku e diela konsiderohet dita e parë e javës. Përdoret me "%X"
%v Java (01..53), ku e hëna konsiderohet dita e parë e javës. Përdoret me " %x"
%% Fjalë për fjalë "%".

Të gjithë personazhet e tjerë thjesht kopjohen në shprehjen që rezulton pa interpretim:

Mysql> SELECT DATE_FORMAT("1997-10-04 22:23:00", "%W %M %Y"); -> "Saturday Tetor 1997" mysql> SELECT DATE_FORMAT("1997-10-04 22:23:00", "%H:%i:%s"); -> "22:23:00" mysql> SELECT DATE_FORMAT("1997-10-04 22:23:00", "%D %y %a %d %m %b %j"); -> "4th 97 Sat 04 10 Oct 277" mysql> SELECT DATE_FORMAT("1997-10-04 22:23:00", "%H %k %I %r %T %S %w"); -> "22 22 10 10:23:00 PM 22:23:00 00 6" mysql> SELECT DATE_FORMAT("1999-01-01", "%X %V"); -> "1998 52"

Në MySQL 3.23, karakteri "%" duhet t'i paraprijë karaktereve të specifikuesit të formatit. Në versionet e mëparshme të MySQL, karakteri "%" është opsional.

Arsyeja që intervalet mujore dhe ditore fillojnë me zero është se MySQL lejon data të pjesshme si "2004-00-00" që nga MySQL 3.23.

TIME_FORMAT (koha, formati)

Ky funksion përdoret në mënyrë të ngjashme me funksionin DATE_FORMAT() të përshkruar më sipër, por vargu i formatit mund të përmbajë vetëm specifikues formati që lidhen me orët, minutat dhe sekondat. Kur specifikoni kualifikues të tjerë, vlera NULL ose 0 do të kthehet.

CURDATE() , CURRENT_DATE

E kthen datën e sotme si vlerë në formatin VYYY-MM-DD ose YYYYMMDD, në varësi të faktit nëse funksioni përdoret në një varg ose kontekst numerik:

Mysql> SELECT CURDATE(); -> "1997-12-15" mysql> SELECT CURDATE() + 0; -> 19971215

CURTIME() , CURRENT_TIME

E kthen kohën aktuale si vlerë në formatin HH:MM:SS ose HHMMS, në varësi të faktit nëse funksioni përdoret në një varg ose kontekst numerik:

Mysql> SELECT CURTIME(); -> "23:50:26" mysql> SELECT CURTIME() + 0; -> 235026

TANI() , SYSDATE() , CURRENT_TIMESTAMP

Kthen datën dhe orën aktuale si vlerë në formatin VYYY-MM-DD HH:MM:SS ose YYYYMMDDHHMMSS, në varësi të faktit nëse funksioni përdoret në një varg ose kontekst numerik:

Mysql> ZGJIDH TANI(); -> "15-12-1997 23:50:26" mysql> ZGJEDH TANI() + 0; -> 19971215235026

Vini re se TANI () vlerësohet vetëm një herë për secilën kërkesë, domethënë në fillim të ekzekutimit të saj. Kjo siguron që referenca të shumta në NOW() brenda të njëjtit pyetje do të prodhojnë të njëjtën vlerë.

UNIX_TIMESTAMP() , UNIX_TIMESTAMP(datë)

Kur thirret pa argument, ky funksion kthen vulën kohore UNIX_TIMESTAMP (sekonda që nga 1970-01-01 00:00:00 GMT) si një numër të plotë të panënshkruar. Nëse funksioni UNIX_TIMESTAMP() thirret me një argument datë, ai kthen vlerën e argumentit si numër sekondash që nga 1970-01-01 00:00:00 GMT. Argumenti i datës mund të jetë një varg DATE, një varg DATETIME, një vlerë TIMESTAMP ose një numër në formatin e orës lokale YYMMDD ose YYYYMMDD:

Mysql> SELECT UNIX_TIMESTAMP(); -> 882226357 mysql> ZGJIDH UNIX_TIMESTAMP("1997-10-04 22:23:00"); -> 875996580

Kur përdorni funksionin UNIX_TIMESTAMP në një kolonë TIMESTAMP, ky funksion do të kthejë drejtpërdrejt vlerën e vulës kohore të brendshme, pa konvertimin e nënkuptuar të vargut në një vulë kohore (``string-to-unix-timestamp''). Nëse data e dhënë është jashtë intervalit të vlefshëm, atëherë funksioni UNIX_TIMESTAMP() do të kthejë 0, por kini parasysh se kryhet vetëm një kontroll bazë (viti 1970-2037, muaji 01-12, dita 01-31). Nëse ju duhet të kryeni zbritjen e kolonës UNIX_TIMESTAMP(), rezultati mund të konvertohet në numra të plotë të nënshkruar. Shih seksionin 6.3.5, “Lloji i funksioneve të derdhjes”.

FROM_UNIXTIME (unix_stamp)

Kthen një paraqitje të argumentit unix_timestamp si një vlerë në formatin YYYY-MM-DD HH:MM:SS ose YYYYMMDDHHMMSS, në varësi të faktit nëse funksioni përdoret në një varg ose kontekst numerik:

Mysql> SELECT FROM_UNIXTIME(875996580); -> "1997-10-04 22:23:00" mysql> SELECT FROM_UNIXTIME(875996580) + 0; -> 19971004222300

FROM_UNIXTIME (vula kohore unix, formati)

Kthen një paraqitje të vargut të argumentit unix_timestamp, të formatuar sipas vargut të formatit. Vargu i formatit mund të përmbajë të njëjtët kualifikues që janë renditur në përshkrimin për funksionin DATE_FORMAT():

Mysql> SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(), "%Y %D %M %h:%i:%s %x"); -> "1997 23 dhjetor 03:43:30 1997"

SEC_TO_TIME (sekonda)

Rikthen argumentin e sekondave, të konvertuar në orë, minuta dhe sekonda, si një vlerë në formatin HH:MM:SS ose HHMMSS, në varësi të faktit nëse funksioni përdoret në një varg ose kontekst numerik:

Mysql> SELECT SEC_TO_TIME(2378); -> "00:39:38" mysql> SELECT SEC_TO_TIME(2378) + 0; -> 3938

TIME_TO_SEC (kohë)

Kthen argumentin e kohës të konvertuar në sekonda:

Mysql> SELECT TIME_TO_SEC("22:23:00"); -> 80580 mysql> ZGJIDH TIME_TO_SEC("00:39:38"); -> 2378




Top