Shembuj të formatit të datës mysql në php. Funksionet e formatimit të datës dhe orës MYSQL

Pra, të gjitha llojet e të dhënave kalendarike përshkruhen në detaje në seksionin “10.3. Llojet e datës dhe kohës » Tutorialë të MySQL. Informacion i rëndësishëm në lidhje me mbështetjen e DBMS për zonat kohore përshkruhet në seksionin “9.7. Mbështetja e zonës kohore të serverit MySQL". Gjithçka që vijon bazohet në studimin e manualit. Në të njëjtën kohë, këtu tregohen vetëm nuancat e zgjedhjes në favor të një lloji ose një tjetër, kështu që ky material nuk e zëvendëson manualin në asnjë mënyrë, por e plotëson atë.

Së pari, një përshkrim i shkurtër i secilit lloj:

  • TIMESTAMP - lloji i të dhënave për ruajtjen e datës dhe kohës. Të dhënat ruhen si numri i sekondave që kanë kaluar që nga fillimi i "epokës Unix". Gama e vlerave: 1970-01-01 00:00:00 - 2038-12-31 00:00:00. Zë 4 bajt.
  • YEAR - lloji i të dhënave për ruajtjen e vitit. Gama e vlerave: 1901 - 2155. Zë 1 bajt.
  • DATE është një lloj të dhënash për ruajtjen e datave. Gama e vlerave: 1000-01-01 - 9999-12-31. Zë 3 bajt.
  • TIME është një lloj i të dhënave për ruajtjen e kohës. Gama e vlerave: −828:59:59 - 828:59:59. Zë 3 bajt.
  • DATETIME është një lloj të dhënash për ruajtjen e datës dhe orës. Gama e vlerave: 1000-01-01 00:00:00 - 9999-12-31 00:00:00. Zë 8 bajt.
Shënim për zonjën. Gjëja interesante është se shumica e programuesve besojnë se koncepti i "vulës kohore" është koha Unix. Në fakt, një stamp kohor është një shenjë që është një sekuencë karakteresh që tregojnë datën dhe/ose kohën kur ka ndodhur një ngjarje e caktuar. Dhe "Unix time" (koha Unix) ose koha POSIX është numri i sekondave që kanë kaluar që nga mesnata e 1 janarit 1970 UTC. Koncepti i vulës kohore është më i gjerë se koha Unix.

Pas analizimit të përshkrimit të llojeve të paraqitura më sipër, mund të nxirrni pothuajse të gjitha përfundimet në lidhje me avantazhet dhe disavantazhet e llojeve të caktuara. Gjithçka është mjaft e thjeshtë dhe e qartë.

Por, para se të flas për përdorimin e këtyre llojeve, dua të vërej se në praktikë, një lloj tjetër përdoret shpesh për të ruajtur datën dhe kohën: një vlerë e plotë (për ruajtjen e datës - INT (4 bytes), data dhe ora - BIGINT (8 byte)). I vetmi ndryshim midis përdorimit të llojeve të numrave të plotë dhe DATE dhe DATETIME është se të dhënat nuk formatohen gjatë daljes, dhe në llogaritjet me data dhe kohë, numrat e plotë duhet të konvertohen në llojin e duhur të kalendarit. Përveç kësaj, nuk ka asnjë kontroll për vlefshmërinë e vlerës së paraqitur përpara se të ruani. Aftësitë e renditjes ruhen. Prandaj, ka kuptim të përdoret INT dhe BIGINT në të njëjtat raste si DATE dhe DATETIME, në mënyrë që të maksimizohet transportueshmëria dhe pavarësia nga DBMS. Unë nuk shoh ndonjë avantazh tjetër nëse ka, ju sugjeroj t'i tregoni ato në komente.

Përdorimi i llojeve të të dhënave kalendarike në MySQL

Le të fillojmë me llojin më të thjeshtë VITI. Avantazhi i tij i vetëm është madhësia e vogël - vetëm 1 bajt. Por për shkak të kësaj, ekziston një kufizim i rreptë në gamën e vlerave të vlefshme (lloji mund të ruajë vetëm 255 vlera të ndryshme). E kam të vështirë të imagjinoj një situatë praktike ku dikush mund të dëshirojë të ruajë vitet rreptësisht në intervalin nga 1901 deri në 2155. Për më tepër, lloji SMALLINT (2 bajt) jep një gamë që është e mjaftueshme në shumicën e situatave për të ruajtur një vit. Dhe ruajtja e 1 bajt për rresht në një tabelë të bazës së të dhënave nuk ka kuptim në kohën tonë.

Llojet DATA Dhe DATA KOHA mund të kombinohen në një grup. Ata ruajnë një datë ose datë dhe orë me një gamë mjaft të gjerë vlerash të vlefshme, pavarësisht nga zona kohore e vendosur në server. Përdorimi i tyre padyshim ka kuptim praktik. Por nëse doni të ruani data për ngjarje historike që shkojnë përtej epokës së zakonshme, do t'ju duhet të zgjidhni lloje të tjera të dhënash. Këto lloje janë ideale për ruajtjen e datave për ngjarje të caktuara që mund të bien jashtë gamës së llojit TIMESTAMP (ditëlindje, datat e lëshimit të produktit, zgjedhjet presidenciale, lëshimet e raketave hapësinore, etj.). Kur përdorni këto lloje, duhet të merrni parasysh një nuancë të rëndësishme, por më shumë për këtë më poshtë.

Lloji KOHA mund të përdoret për të ruajtur një periudhë kohore kur nuk nevojitet saktësi më pak se 1 sekondë dhe periudha kohore më pak se 829 orë. Nuk ka asgjë më shumë për të shtuar këtu.

Lloji më interesant mbetet - VULL KOHORE. Duhet të merret parasysh në krahasim me DATE dhe DATETIME: TIMESTAMP është projektuar gjithashtu për të ruajtur datën dhe/ose kohën e ndodhjes së ngjarjeve të caktuara. Një ndryshim i rëndësishëm midis tyre është në diapazonin e vlerave: padyshim, TIMESTAMP nuk është i përshtatshëm për ruajtjen e ngjarjeve historike (madje si ditëlindjet), por është i shkëlqyeshëm për ruajtjen e atyre aktuale (prerjet, datat e postimit të artikujve, shtimi i produkteve, vendosja e porosive) dhe ato të ardhshme në ngjarjet e ardhshme të parashikueshme (publikimet e versioneve të reja, kalendarët dhe programuesit, etj.).

Lehtësia kryesore e përdorimit të llojit TIMESTAMP është se për kolonat e këtij lloji në tabela mund të vendosni një vlerë të paracaktuar në formën e një zëvendësimi të kohës aktuale, si dhe të vendosni kohën aktuale kur përditësoni një rekord. Nëse keni nevojë për këto veçori, atëherë ka 99% mundësi që TIMESTAMP të jetë pikërisht ajo që ju nevojitet. (Shihni manualin se si ta bëni këtë.)

Mos kini frikë se programi juaj do të ndalojë së punuari ndërsa i afrohemi vitit 2038. Së pari, para kësaj kohe, softueri juaj me shumë mundësi thjesht do të ndalet së përdoruri (veçanërisht versionet që po shkruhen tani). Së dyti, me afrimin e kësaj date, zhvilluesit e MySQL patjetër do të gjejnë diçka për të ruajtur funksionalitetin e softuerit tuaj. Gjithçka do të zgjidhet si dhe problemi Y2K.

Pra, ne përdorim llojin TIMESTAMP për të ruajtur datat dhe orët e ngjarjeve të kohës sonë, dhe DATETIME dhe DATE për të ruajtur datat dhe oraret e ngjarjeve historike ose ngjarjeve të së ardhmes së thellë.

Gama e vlerave janë një ndryshim i rëndësishëm midis llojeve TIMESTAMP, DATETIME dhe DATE, por ato nuk janë ndryshimi kryesor. Kryesor që TIMESTAMP ruan vlerën në UTC. Kur ruani një vlerë, ajo përkthehet nga zona aktuale kohore në UTC, dhe kur e lexoni atë, përkthehet nga zona aktuale kohore nga UTC. DATETIME dhe DATE ruajnë dhe shfaqin gjithmonë të njëjtën orë, pavarësisht nga zonat kohore.

Zonat kohore vendosen globalisht në MySQL DBMS ose për lidhjen aktuale Kjo e fundit mund të përdoret për të siguruar punën e përdoruesve të ndryshëm në zona të ndryshme kohore në nivelin DBMS. Të gjitha vlerat kohore do të ruhen fizikisht në UTC dhe do të merren nga klienti dhe do t'i jepen klientit - në vlerat e zonës së tij kohore. Por vetëm kur përdorni llojin e të dhënave TIMESTAMP. DATE dhe DATETIME marrin, ruajnë dhe kthejnë gjithmonë të njëjtën vlerë.

Funksioni NOW() dhe sinonimet e tij kthejnë vlerën e kohës në zonën aktuale kohore të përdoruesit.

Duke pasur parasysh të gjitha këto rrethana, duhet të jeni jashtëzakonisht të kujdesshëm kur ndryshoni zonën kohore brenda një lidhjeje me serverin dhe përdorni llojet DATE dhe DATETIME. Nëse keni nevojë të ruani një datë (për shembull, datën e lindjes), atëherë nuk do të ketë probleme. Data e lindjes është e njëjtë në çdo zonë. Ato. nëse keni lindur më 1 janar në orën 0:00 UTC/GMT+0, atëherë kjo Jo do të thotë që në Amerikë do të festojnë ditëlindjen tuaj më 31 dhjetor. Por nëse vendosni të ruani koha ngjarjet në kolonën DATETIME, atëherë thjesht nuk do të jetë e mundur të punohet me zonat kohore të përdoruesit në nivelin DBMS. Më lejoni të shpjegoj me një shembull:

Përdoruesi X punon në zonën UTC/GMT+2, Y - në zonën UTC/GMT+3. Për lidhjet e përdoruesve me MySQL, vendoset një zonë kohore përkatëse (secila ka të vetin). Përdoruesi poston një mesazh në forum, ne jemi të interesuar në datën kur është shkruar mesazhi.

Opsioni 1: DATETIME. Përdoruesi X shkruan një mesazh në orën 14:00 UTC/GMT+2. Vlera në fushën "data" e mesazhit zëvendësohet si rezultat i ekzekutimit të funksionit TANI () - 14:00. Përdoruesi Y lexon kohën kur është shkruar mesazhi dhe sheh të njëjtën orë 14:00. Por cilësimet e tij janë vendosur në UTC/GMT+3, dhe ai mendon se mesazhi është shkruar jo vetëm tani, por një orë më parë.

Opsioni 2: STAMP KOHORE. Përdoruesi X shkruan një mesazh në orën 14:00 UTC/GMT+2. Fusha "data" përmban rezultatin e ekzekutimit të funksionit TANI() - në këtë rast - 12:00 UTC/GMT+0. UserY lexon kohën kur është shkruar mesazhi dhe merr (UTC/GMT+3)(12:00 UTC/GMT+0) = 15:00 UTC/GMT+3. Gjithçka rezulton pikërisht ashtu siç duam. Dhe më e rëndësishmja, është jashtëzakonisht i përshtatshëm për t'u përdorur: për të mbështetur zonat kohore të personalizuara, nuk keni nevojë të shkruani ndonjë kod konvertimi orar.

Mundësitë e zëvendësimit të orës aktuale dhe punës me zonat kohore në llojin TIMESTAMP janë aq të fuqishme sa nëse duhet të ruash një datë pa kohë në një regjistër të caktuar, duhet të përdorësh sërish TIMESTAMP në vend të DATE, pa kursyer 1 bajt të diferencës. mes tyre. Në këtë rast, thjesht injoroni "00:00:00".

Nëse nuk mund të përdorni TIMESTAMP për shkak të diapazonit relativisht të vogël të vlerave të tij (zakonisht 1-2 raste kundrejt 10-15 në bazën e të dhënave të faqes), do t'ju duhet të përdorni DATETIME dhe të rregulloni me kujdes vlerat e tij në vendet e duhura ( d.m.th. kur shkruani në këtë fushë, konvertoni datën në UTC dhe kur lexoni, në kohën në zonën e përdoruesit që lexon). Nëse ruani vetëm datën, atëherë ka shumë të ngjarë që nuk ka rëndësi se çfarë zone kohore keni: të gjithë festojnë Vitin e Ri më 1 janar, sipas kohës lokale, kështu që nuk keni nevojë të përktheni asgjë këtu.

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ë rangun 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 një argument opsional, ose të 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ë rangun 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"
DITË_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 e tipit nuk janë të ndjeshme.

EKSTRAKT (lloji nga data)

Funksioni EXTRACT() përdor të njëjtat lloje intervalesh si funksionet 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"); -> 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_DITË (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); -> "07-10-1997"

Funksioni FROM_DAYS() nuk është i destinuar 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 Koha, 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 kohë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 çdo 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 (vulë_kohore unix, format)

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


publikimi i këtij artikulli lejohet vetëm me një lidhje në faqen e internetit të autorit të artikullit

Siç e dini, të gjitha datat ruhen në mysql në rend të kundërt vit-muaj-ditë (2008-10-18), ndonjëherë edhe pa ndarës (20081018).
Për të shfaqur datën, duhet ta shndërroni atë në një formë normale të lexueshme.

Ekzistojnë dy metoda të konvertimit, efektive dhe jo shumë efektive.
Një mënyrë joefektive është kur data e prodhimit nga mysql konvertohet duke përdorur php.
Unë personalisht e kam bërë këtë për një kohë shumë të gjatë. Përpara shfaqjes, e ktheva çdo datë duke përdorur një funksion php.
Nëse numri i transformimeve nuk është i madh, atëherë mund ta ktheni datën duke përdorur PHP, nuk ka asgjë të keqe me këtë, por nëse ju duhet të nxirrni dhjetëra ose qindra mijëra rekorde dhe të konvertoni datën në secilin, atëherë sigurisht konvertimi datat duke përdorur mysql do të jenë shumë më të shpejta.

Mysql ka një funksion të shkëlqyer DATE_FORMAT(), është shumë i ngjashëm me funksionin php date().
Këtu është një shembull i përdorimit

SELECT DATE_FORMAT("2008-11-19","%d.%m.%Y");
rezultat

Gjithçka është shumë e thjeshtë dhe e shpejtë, nuk ka nevojë të ndryshoni datat duke përdorur php.
Këtu është një listë e përkufizimeve për këtë funksion

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 Koha, 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ë `%”.

Komentet

27.11.2008 ----
Hej shejtan!!!
Unë vetë kam pesë vjet që punoj në php dhe mysql, dhe gjatë gjithë kohës ndryshoja datën në php...
As që më shkoi mendja se do të ishte më e lehtë të përdorja funksionin e integruar mysql

28.11.2008 Zheka
Po kështu! Unë gjithmonë e kam përdorur funksionin tim php

12/03/2008 Sergej
Epo, në përgjithësi, a e përdor dikush këtë qasje?
Apo të gjithë përdorin php për të ndryshuar datën?
Unë personalisht nuk kam ndryshuar kurrë një datë në mysql, unë ende bëj gjithçka në php

28/06/2009 Ilya
Fatkeqësisht, asgjë nuk funksionoi :(

07/08/2009 Vitaly
E bukur, faleminderit për veçorinë. Pyes veten nëse ka ndonjë squiggles të tjera?

14.07.2009 DSaint
Faleminderit, ka ndihmuar shumë. Gjithçka që mbetet është të shfaqni emrin e muajit në Rusisht)

28/07/2009 Vlad
mysql=>PHP
zgjidhni unix_timestamp(start_date) si start_date_php
php-kodi
data ("d.m.Y", $row["start_date_php"])

PHP=>MySQL
grupi i përditësimit të tabelës start_date=DATE_FORMAT(STR_TO_DATE("12/19/2009 6:35:22 PM","%d.%m.%Y %H:%i"),"%Y.%m.%d % H:% i")

18.08.2009 I ftuar
2: DSi
Ekziston një funksion kaq i mrekullueshëm:
ELT (MUAJ ("2004-04-10"), "Jan."," Shkurt," "Mars", "Prill", "Maj", "Qershor", "Korrik", "Gusht."," Shtator.""Tet.","Nëntor","Dhjetor")

Perdore. :-)

29.10.2009 Vladimir
Faleminderit, për ELT (MUAJ ("2004-04-10"), "Jan.", "Shkurt", "Mars", "Prill", "Maj", "Qershor", "Korrik", "Gusht" ""Shtator.","Tet.","Nëntor","Dhjetor.")
nuk kam degjuar.

10/07/2010 Evgeniy
Çfarë funksionon më shpejt? Konvertimi në kërkesë, apo si rezultat i funksionit PHP?

10/07/2010 mbrojtës
Në minimum, ka më pak memorie për t'u përpunuar, më pak thirrje funksionesh, më pak alokime memorie... Unë përdor diçka të tillë gjatë gjithë kohës, por jo në mysql, por në postgresql.

10/08/2010 Admin
Evgeniy, mbrojtësi tha saktë se ky transformim duhet të funksionojë më bukur përmes bazës së të dhënave, por sigurisht, nëse po flasim për nxjerrjen e një sasie të madhe të dhënash.
Nëse tërheq 10-20 rekorde, atëherë nuk ka dallim se si të konvertohet data në krahasim me ngarkesat e tjera, kjo është një gjë e vogël.

27.01.2011 pcemma
uhh falë afftor (: nuk ka më nevojë të përdor funksionin tim mega cool për konvertim (:

13.04.2011 Xes
SI TA PËRDORNI NË PHP
ndërsa ($sqlr=mysql_fetch_array($sql))
{
echo ($sqlr["comadd"]." ".$sqlr["koment"]."

");

$sqlr["comadd"] - A duhet ta prezantoni në formë normale?
}

14.04.2011 Vitaly
Unë kam një datë në bazën e të dhënave në formatin 19/11/2008, lloji i tabelës VARCHAR, si mund ta rishkruaj në bazën e të dhënave në formatin 2008-11-19?
Duart për një kohë shumë të gjatë ...
Faleminderit.

15.04.2011 admin
Xes është një funksion MySQL, duhet ta përdorni në një pyetje sql, e cila, duke gjykuar nga kodi juaj, ndodhet diku më lart. Nuk mund të përdoret në këtë seksion të kodit.

15.04.2011 admin
Vitaly, thjesht ndryshoni llojin e qelizës në DATE, mysql do t'i konvertojë automatikisht të gjitha të dhënat në këtë qelizë në formatin 2008-11-19.
Por për çdo rast, përpara se të ndryshoni llojin e qelizës, bëni një hale të kësaj tabele, sepse papritmas baza e të dhënave do të bëjë diçka të gabuar dhe tabela do të prishet fare.

Nëse është e rëndësishme për ju që të lini llojin e fushës si varchar, atëherë pasi të vendosni llojin DATE, vendoseni përsëri në varchar...

Ky është opsioni më i thjeshtë, por jo plotësisht i saktë, por kontrollova se funksionon.

14.05.2011 DDD
data("d-m-Y",strtotime("$myrow"));

24.05.2011 Konstantin
dhe unë marr gjithmonë SELECT *,UNIX_TIMESTAMP(krijuar) AS krijuar nga...
Por me një motor mund ta bëj në çdo format. Edhe vetëm një ditë, edhe vetëm një kohë...
dhe krahasoni cila është më e madhe se 14.05.2011 ose 14.05.2010...
Dhe unë e shkruaj kështu:
...date=".gmdate("Y-m-d H:i:s",$krijuar)...
dhe në përgjithësi, nuk shoh arsye për të ndryshuar zakonet

24.05.2011 Sergej
Konstantin, unë vetë përdor php date() për dalje, por këtu po shqyrtojmë mundësinë e konvertimit të datës jo përmes php, por përmes mysql.

Unë do të thoja që kjo është vetëm një pasqyrë e funksionit mysql dhe sigurisht që ka të drejtë të ekzistojë...

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 argumentin e datës. 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 marrëdhënien 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"
DITË_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)
%TKoha, 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-
e 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 ky ë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 e 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ërat 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. Ju vetëm 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:

ZGJIDH (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
shfaqur si 13 vjet.

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 format vjetor, 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 unë 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ë fus 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 regjistrime 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".




Top