Datuma formāta mysql piemēri php. MYSQL datuma un laika formatēšanas funkcijas

Tātad visi kalendāra datu veidi ir detalizēti aprakstīti sadaļā “10.3. Datuma un laika veidi » MySQL apmācības. Svarīga informācija par DBVS atbalstu laika joslām ir aprakstīta sadaļā “9.7. MySQL servera laika joslas atbalsts". Viss turpmākais ir balstīts uz rokasgrāmatas izpēti. Tajā pašā laikā šeit ir norādītas tikai izvēles nianses par labu vienam vai otram veidam, tāpēc šis materiāls nekādā veidā neaizstāj rokasgrāmatu, bet gan to papildina.

Pirmkārt, īss katra veida apraksts:

  • TIMESTAMP - datu tips datuma un laika saglabāšanai. Dati tiek saglabāti kā sekunžu skaits, kas pagājušas kopš “Unix ēras” sākuma. Vērtību diapazons: 1970-01-01 00:00:00 - 2038-12-31 00:00:00. Aizņem 4 baitus.
  • YEAR — datu tips gada glabāšanai. Vērtību diapazons: 1901–2155. Aizņem 1 baitu.
  • DATE ir datu veids datu glabāšanai. Vērtību diapazons: 1000-01-01 - 9999-12-31. Aizņem 3 baitus.
  • LAIKS ir datu veids laika glabāšanai. Vērtību diapazons: –828:59:59–828:59:59. Aizņem 3 baitus.
  • DATETIME ir datu veids datuma un laika glabāšanai. Vērtību diapazons: 1000-01-01 00:00:00 - 9999-12-31 00:00:00. Aizņem 8 baitus.
Piezīme saimniecei. Interesanti ir tas, ka lielākā daļa programmētāju uzskata, ka “laikspiedola” jēdziens ir Unix laiks. Faktiski laikspiedols ir zīme, kas ir rakstzīmju virkne, kas norāda datumu un/vai laiku, kad noticis konkrēts notikums. Un “Unix laiks” (Unix laiks) vai POSIX laiks ir sekunžu skaits, kas pagājis kopš 1970. gada 1. janvāra pusnakts pēc UTC. Laika zīmoga jēdziens ir plašāks nekā Unix laiks.

Izanalizējot iepriekš sniegto tipu aprakstu, jūs varat izdarīt gandrīz visus secinājumus par noteiktu veidu priekšrocībām un trūkumiem. Viss ir diezgan vienkārši un acīmredzami.

Bet pirms runāt par šo tipu izmantošanu, vēlos atzīmēt, ka praksē datuma un laika saglabāšanai bieži tiek izmantots cits veids: vesela skaitļa vērtība (datuma saglabāšanai - INT (4 baiti), datums un laiks - BIGINT (8). baiti)). Vienīgā atšķirība starp veselu skaitļu veidu izmantošanu un DATE un DATETIME ir tāda, ka izvades laikā dati netiek formatēti, un aprēķinos ar datumiem un laikiem veseli skaitļi ir jāpārvērš atbilstošā kalendāra veidā. Turklāt pirms saglabāšanas netiek pārbaudīts uzrādītās vērtības derīgums. Šķirošanas iespējas tiek saglabātas. Tāpēc ir lietderīgi izmantot INT un BIGINT tajos pašos gadījumos kā DATE un DATETIME, lai palielinātu pārnesamību un neatkarību no DBVS. Es neredzu citas priekšrocības, ja tādas ir, iesaku tās norādīt komentāros.

Kalendāra datu tipu izmantošana programmā MySQL

Sāksim ar vienkāršāko – tipa GADS. Tā vienīgā priekšrocība ir mazais izmērs - tikai 1 baits. Taču šī iemesla dēļ spēkā esošo vērtību diapazons ir stingri ierobežots (tips var saglabāt tikai 255 dažādas vērtības). Man ir grūti iedomāties praktisku situāciju, kurā varētu vēlēties saglabāt gadus stingri diapazonā no 1901. līdz 2155. Turklāt SMALLINT tips (2 baiti) dod diapazonu, kas vairumā gadījumu ir pietiekams, lai uzglabātu gadu. Un saglabāt 1 baitu katrā datu bāzes tabulas rindā mūsu laikā nav jēgas.

Veidi DATUMS Un DATUMS LAIKS var apvienot vienā grupā. Tie saglabā datumu vai datumu un laiku ar diezgan plašu derīgu vērtību diapazonu neatkarīgi no serverī iestatītās laika joslas. To izmantošanai noteikti ir praktiska jēga. Bet, ja vēlaties saglabāt datumus vēsturiskiem notikumiem, kas pārsniedz parasto laikmetu, jums būs jāizvēlas citi datu veidi. Šie veidi ir ideāli piemēroti noteiktu notikumu datumu glabāšanai, kas potenciāli neietilpst TIMESTAMP tipa diapazonā (dzimšanas dienas, produktu izlaišanas datumi, prezidenta vēlēšanas, kosmosa raķešu palaišana utt.). Izmantojot šos veidus, jums jāņem vērā viena svarīga nianse, bet vairāk par to tālāk.

Tips LAIKS var izmantot, lai saglabātu laika periodu, kurā nav nepieciešama precizitāte, kas mazāka par 1 sekundi, un laika periodus, kas ir mazāki par 829 stundām. Te vairs nav ko piebilst.

Interesantākais veids paliek - LAIKZĪMOGS. Tas jāņem vērā salīdzinājumā ar DATE un DATETIME: TIMESTAMP ir paredzēts arī noteiktu notikumu datuma un/vai laika glabāšanai. Būtiska atšķirība starp tām ir vērtību diapazonos: acīmredzot, TIMESTAMP nav piemērots vēsturisku notikumu (pat tādu kā dzimšanas dienu) glabāšanai, bet lieliski piemērots aktuālo (reģistrācija, rakstu ievietošanas datumi, produktu pievienošana, pasūtījumu veikšana) un gaidāmie notikumi paredzamā nākotnē (jaunu versiju izlaidumi, kalendāri un plānotāji utt.).

Galvenā TIMESTAMP veida izmantošanas ērtība ir tāda, ka šāda veida kolonnām tabulās var iestatīt noklusējuma vērtību pašreizējā laika aizstāšanas veidā, kā arī iestatīt pašreizējo laiku, atjauninot ierakstu. Ja jums ir nepieciešamas šīs funkcijas, pastāv 99% iespēja, ka TIMESTAMP ir tieši tas, kas jums nepieciešams. (Skatiet rokasgrāmatu, lai uzzinātu, kā to izdarīt.)

Nebaidieties, ka jūsu programmatūra pārtrauks darboties, tuvojoties 2038. gadam. Pirmkārt, pirms šī laika jūsu programmatūra, visticamāk, vienkārši tiks pārtraukta (it īpaši tās versijas, kuras tiek rakstītas tagad). Otrkārt, tuvojoties šim datumam, MySQL izstrādātāji noteikti nāks klajā ar kaut ko, lai saglabātu jūsu programmatūras funkcionalitāti. Viss tiks atrisināts, tāpat kā Y2K problēma.

Tātad, mēs izmantojam veidu TIMESTAMP, lai saglabātu mūsu laika notikumu datumus un laikus, un DATETIME un DATE, lai saglabātu vēsturisku notikumu vai dziļas nākotnes notikumu datumus un laikus.

Vērtību diapazoni ir būtiska atšķirība starp veidiem TIMESTAMP, DATETIME un DATE, taču tie nav galvenā atšķirība. Galvenā ka TIMESTAMP saglabā vērtību UTC. Saglabājot vērtību, tā tiek pārtulkota no pašreizējās laika joslas uz UTC, un, lasot to, tā tiek tulkota no pašreizējās laika joslas no UTC. DATETIME un DATE vienmēr saglabā un parāda vienu un to pašu laiku neatkarīgi no laika joslām.

Laika joslas tiek iestatītas globāli MySQL DBVS vai pašreizējam savienojumam Pēdējo var izmantot, lai nodrošinātu dažādu lietotāju darbu dažādās laika zonās DBVS līmenī. Visas laika vērtības tiks fiziski saglabātas UTC un saņemtas no klienta un nodotas klientam - viņa laika joslas vērtībās. Bet tikai tad, ja tiek izmantots datu veids TIMESTAMP. DATE un DATETIME vienmēr saņem, saglabā un atgriež vienu un to pašu vērtību.

Funkcija NOW() un tās sinonīmi atgriež laika vērtību lietotāja pašreizējā laika joslā.

Ņemot vērā visus šos apstākļus, jums jābūt īpaši uzmanīgiem, mainot laika joslu savienojumā ar serveri un izmantojot veidus DATE un DATETIME. Ja nepieciešams saglabāt datumu (piemēram, dzimšanas datumu), tad problēmu nebūs. Dzimšanas datums ir vienāds jebkurā zonā. Tie. ja esat dzimis 1. janvārī plkst. 0:00 UTC/GMT+0, tad šis Nav nozīmē, ka Amerikā viņi svinēs tavu dzimšanas dienu 31. decembrī. Bet, ja jūs nolemjat uzglabāt laiks notikumi kolonnā DATETIME, tad vienkārši nebūs iespējams strādāt ar lietotāja laika joslām DBVS līmenī. Ļaujiet man paskaidrot ar piemēru:

Lietotājs X strādā UTC/GMT+2 zonā, Y - UTC/GMT+3 zonā. Lietotāju savienojumiem ar MySQL tiek iestatīta atbilstoša (katrai sava) laika josla. Lietotājs ievieto ziņojumu forumā, mēs esam ieinteresēti ziņojuma rakstīšanas datumā.

1. iespēja: DATETIME. Lietotājs X raksta ziņojumu plkst. 14:00 UTC/GMT+2. Vērtība ziņojuma laukā “datums” tiek aizstāta funkcijas NOW() izpildes rezultātā - 14:00. Lietotājs Y nolasa ziņojuma rakstīšanas laiku un redz to pašu 14:00. Bet viņa iestatījumi ir iestatīti uz UTC/GMT+3, un viņš domā, ka ziņa tika uzrakstīta ne tikai tagad, bet pirms stundas.

2. iespēja: TIMESTAMP. Lietotājs X raksta ziņojumu plkst. 14:00 UTC/GMT+2. Laukā “datums” ir norādīts funkcijas NOW() izpildes rezultāts - šajā gadījumā - 12:00 UTC/GMT+0. LietotājsY nolasa ziņojuma rakstīšanas laiku un saņem (UTC/GMT+3) (12:00 UTC/GMT+0) = 15:00 UTC/GMT+3. Viss izdodas tieši tā, kā mēs vēlamies. Un pats galvenais, tas ir ļoti ērti lietojams: lai atbalstītu pielāgotas laika joslas, jums nav jāraksta laika konvertēšanas kods.

Iespējas aizvietot pašreizējo laiku un strādāt ar laika joslām TIMESTAMP tipā ir tik jaudīgas, ka, ja nepieciešams saglabāt datumu bez laika noteiktā žurnālā, tomēr DATE vietā jāizmanto TIMESTAMP, nesaglabājot 1 baitu no starpības. starp viņiem. Šajā gadījumā vienkārši ignorējiet “00:00:00”.

Ja nevarat izmantot TIMESTAMP, jo tā vērtību diapazons ir salīdzinoši neliels (parasti 1-2 gadījumi pret 10-15 vietņu datu bāzē), jums būs jāizmanto DATETIME un rūpīgi jāpielāgo tā vērtības pareizajās vietās ( t.i., rakstot šajā laukā, konvertējiet datumu uz UTC, bet lasot – uz laiku lasīšanas lietotāja zonā). Ja saglabājat tikai datumu, visticamāk, nav nozīmes tam, kura laika josla jums ir: visi Jauno gadu svin 1. janvārī pēc vietējā laika, tāpēc jums šeit nekas nav jātulko.

Zemāk ir piemērs, kurā tiek izmantotas datuma funkcijas. Šis vaicājums atlasa visus ierakstus ar date_col vērtību pēdējo 30 dienu laikā:

Mysql> ATLASĪT kaut ko NO tbl_nosaukums WHERE TO_DAYS(NOW()) - TO_DAYS(date_col)<= 30;

Atgriež nedēļas dienas indeksu datumam (0 = pirmdiena, 1 = otrdiena, ... 6 = svētdiena):

Mysql> SELECT WEEKDAY("1998-02-03 22:23:00"); -> 1 mysql> SELECT WEEKDAY("1997-11-05"); -> 2

MĒNEŠA DIENA(datums)

Atgriež datuma argumenta mēneša dienas kārtas numuru diapazonā no 1 līdz 31:

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

Atgriež datuma argumenta gada dienas kārtas numuru diapazonā no 1 līdz 366:

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

Atgriež gada mēneša sērijas numuru datuma argumentam, sākot no 1 līdz 12:

Mysql> SELECT MONTH("1998-02-03"); -> 2

Atgriež nedēļas dienas nosaukumu datuma argumentam:

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

Atgriež datuma argumenta mēneša nosaukumu:

Mysql> SELECT MONTHNAME("1998-02-05"); -> "februāris"

Atgriež gada ceturkšņa skaitli datuma argumentam, sākot no 1 līdz 4:

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

WEEK(datums) , WEEK(datums,pirmais)

Ņemot vērā vienu argumentu, atgriež nedēļas kārtas numuru gadā datumam, sākot no 0 līdz 53 (jā, iespējams, 53. nedēļas sākums) reģionos, kur svētdiena tiek uzskatīta par nedēļas pirmo dienu. Forma WEEK() ar diviem argumentiem ļauj norādīt, vai nedēļa sākas svētdienā vai pirmdienā. Rezultāts būs diapazonā no 0-53 vai 1-52.

Lūk, kā darbojas otrais arguments:

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

Piezīme. Versijā 4.0 funkcija WEEK(#,0) tika mainīta, lai tā atbilstu ASV kalendāram.

Ņemiet vērā: ja nedēļa ir iepriekšējā gada pēdējā nedēļa, MySQL atgriezīs 0, ja vien nenorādīsiet 2 vai 3 kā izvēles argumentu:

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

Var pieņemt, ka MySQL ir jāatgriež 52, jo šis datums ir 1999. gada 52. nedēļa. Mēs nolēmām atgriezt 0, jo vēlamies, lai funkcija sniegtu "nedēļas numuru norādītajā gadā". Tas padara WEEK() funkciju uzticamāku, ja to izmanto kopā ar citām funkcijām, kas aprēķina datuma daļas.

Ja jums joprojām ir svarīga pareizā gada nedēļa, varat izmantot 2 vai 3 kā neobligātu argumentu vai izmantot YEARWEEK()

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

Atgriež gadu datumam diapazonā no 1000 līdz 9999:

Mysql> SELECT YEAR("98-02-03"); -> 1998. gads

YEARWEEK(datums) , YEARWEEK(datums,pirmais)

Datuma argumentam atgriež gadu un nedēļu. Šīs funkcijas otrais arguments darbojas līdzīgi kā otrais funkcijas WEEK() arguments. Ņemiet vērā, ka gads var atšķirties no datuma, kas norādīts gada pirmajā un pēdējā nedēļā:

Mysql> SELECT YEARWEEK("1987-01-01"); -> 198653

Ņemiet vērā, ka nedēļas numurs atšķiras no tā, ko WEEK() (0) atgriež, kad tiek izsaukts ar izvēles argumentu 0 vai 1 . Tas ir tāpēc, ka WEEK() atgriež nedēļas numuru norādītajā gadā.

Atgriež laika argumenta stundu diapazonā no 0 līdz 23:

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

Atgriež laika argumenta minūšu skaitu diapazonā no 0 līdz 59:

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

Atgriež laika argumenta sekunžu skaitu no 0 līdz 59:

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

Pievieno N mēnešus periodam P (GGMM vai GGGGMM formātā). Atgriež vērtību GGGGMM formātā. Ņemiet vērā, ka perioda arguments P nav datuma vērtība:

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

PERIOD_DIFF(P1,P2)

Atgriež mēnešu skaitu starp periodiem P1 un P2. P1 un P2 ir jābūt GGMM vai GGGMM formātā. Ņemiet vērā, ka perioda argumenti P1 un P2 nav datuma vērtības:

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

DATE_ADD(datums,INTERVAL derīguma veids) , DATE_SUB(datums,INTERVAL derīguma veids) , ADDDATE(datums,INTERVAL derīguma veids) , SUBDATE(datums,INTERVAL derīguma veids)

Šīs funkcijas veic aritmētiskās darbības ar datumiem. Abi ir jauni MySQL 3.22. Funkcijas ADDDATE() un SUBDATE() ir sinonīmi DATE_ADD() un DATE_SUB() . Programmā MySQL 3.23 funkciju DATE_ADD() un DATE_SUB() vietā varat izmantot operatorus + un -, ja labās puses izteiksme ir DATE vai DATETIME tipa kolonna (skatiet piemēru tālāk). Datuma arguments ir DATETIME vai DATE vērtība, kas norāda sākuma datumu.

Izteiksme izteiksme norāda intervāla apjomu, kas jāpievieno sākuma datumam vai jāatņem no tā. Izteiksme ir virkne, kas var sākties ar - negatīvām intervāla vērtībām. Tipa atslēgvārds norāda, kā dotā izteiksme jāinterpretē. Palīdzības funkcija EXTRACT (tips no datuma) atgriež noteiktā tipa (tipa) intervālu no datuma vērtības. Šajā tabulā parādīta saistība starp tipa un izteiksmes argumentiem:

Nozīme Tips Paredzamais formāts ekspr
OTRĀ SEKUNDES
MINŪTE MINŪTES
STUNDA STUNDAS
DIENA DIENAS
MĒNESIS MĒNEŠI
GADS GADI
MINUTE_SECOND "MINUTES:SECONDS"
HOUR_MINUTE "HOURS:MINUTES"
DAY_HOUR "DIENAS STUNDAS"
YEAR_MONTH "GADI-MĒNEŠI"
HOUR_SECOND "HOURS:MINUTES:SECONDS"
DAY_MINUTE "DAYS HOURS:MINUTES"
DAY_SECOND "DAYS HOURS:MINUTES:SECONDS"

Programmā MySQL izteiksmes izteiksmes formāts pieļauj jebkādus atdalītājus. Šajā tabulā norādītie norobežotāji ir sniegti kā piemēri. Ja datums ir DATE vērtība un paredzētais aprēķins ietver tikai daļas YEAR , MONTH un DAY (tas ir, nav TIME daļas), rezultāts tiek attēlots ar DATE vērtību. Citos gadījumos rezultāts ir DATETIME vērtība:

Mysql> SELECT "1997-12-31 23:59:59" + INTERVĀLS 1 SEKUNDE; -> 1998-01-01 00:00:00 mysql> ATLASĪT INTERVĀLU 1 DIENA + "1997-12-31"; -> 1998-01-01 mysql> ATLASĪT "1998-01-01" - INTERVĀLS 1 SEKUNDE; -> 1997-12-31 23:59:59 mysql> SELECT DATE_ADD("1997-12-31 23:59:59", INTERVĀLS 1 sekunde); -> 1998-01-01 00:00:00 mysql> SELECT DATE_ADD("1997-12-31 23:59:59", INTERVĀLS 1 DIENA); -> 1998-01-01 23:59:59 mysql> SELECT DATE_ADD("1997-12-31 23:59:59", INTERVAL "1:1" MINUTE_SECOND); -> 1998-01-01 00:01:00 mysql> SELECT DATE_SUB("1998-01-01 00:00:00", INTERVAL "1 1:1:1" DAY_SECOND); -> 1997-12-30 22:58:59 mysql> SELECT DATE_ADD("1998-01-01 00:00:00", INTERVAL "-1 10" DAY_HOUR); -> 1997-12-30 14:00:00 mysql> SELECT DATE_SUB("1998-01-02", INTERVALS 31 DAY); -> 1997-12-02

Ja norādītais intervāls ir pārāk īss (tas ir, neietver visas intervāla daļas, ko sagaida norādītā tipa atslēgvārds), tad MySQL pieņem, ka intervāla galējās kreisās daļas tiek izlaistas. Piemēram, ja tipa arguments ir DAY_SECOND , tad paredzamajā izteiksmes izteiksmē ir jābūt šādām daļām: dienas, stundas, minūtes un sekundes. Ja šajā gadījumā norādāt intervāla vērtību kā "1:10", MySQL pieņem, ka dienas un stundas ir izlaistas un ka vērtība ietver tikai minūtes un sekundes. Citiem vārdiem sakot, kombinācija "1:10" DAY_SECOND tiek interpretēta kā ekvivalenta "1:10" MINUTE_SECOND. MySQL interpretē TIME vērtības līdzīgā veidā - kā attēlojot pagājušo laiku, nevis diennakts laiku. Lūdzu, ņemiet vērā, ka, pievienojot vai atņemot darbības, kas ietver DATE vērtību un izteiksmi, kas satur laika daļu, šī DATE vērtība tiks automātiski pārveidota par DATETIME tipa vērtību:

Mysql> SELECT DATE_ADD("1999-01-01", INTERVĀLS 1 DIENA); -> 1999-01-02 mysql> SELECT DATE_ADD("1999-01-01", INTERVĀLS 1 STUNDA); -> 1999-01-01 01:00:00

Ja izmantojat nepareizas datuma vērtības, rezultāts būs NULL. Ja, summējot MONTH , YEAR_MONTH vai YEAR, dienas skaitlis iegūtajā datumā pārsniedz maksimālo dienu skaitu jaunajā mēnesī, tad iegūtā datuma dienas numurs tiek iestatīts uz jaunā mēneša pēdējo dienu:

Mysql> SELECT DATE_ADD("1998-01-30", INTERVĀLS 1 MONTH); -> 1998-02-28

Iepriekšējā piemērā var redzēt, ka vārds INTERVAL un tipa atslēgvārds nav reģistrjutīgi.

IZRAKSTS (rakstiet NO datuma)

Funkcija EXTRACT() izmanto tādus pašus intervālu tipus kā funkcijas DATE_ADD() vai DATE_SUB(), taču EXTRACT() izvelk daļu no datuma vērtības, nevis veic aritmētiku.

Mysql> SELECT EXTRACT(GADS NO "1999-07-02"); -> 1999 mysql> SELECT EXTRACT(YEAR_MONTH NO "1999-07-02 01:02:03"); -> 199907 mysql> SELECT EXTRACT(DAY_MINUTE FROM "1999-07-02 01:02:03"); -> 20102

funkcija atgriež dienas numuru datuma argumentā norādītajam datumam (dienu skaits, kas pagājušas kopš 0 gada):

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

Funkcija TO_DAYS() nav paredzēta lietošanai ar vērtībām pirms Gregora kalendāra (1582) ieviešanas, jo tā neņem vērā dienas, kas zaudētas, mainot kalendāru.

Atgriež DATE vērtību dotajam dienas numuram N:

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

Funkcija FROM_DAYS() nav paredzēta lietošanai ar vērtībām pirms Gregora kalendāra (1582) ieviešanas, jo tā neņem vērā dienas, kas zaudētas, mainot kalendāru.

DATE_FORMAT(datums,formāts)

Formatē datuma vērtību atbilstoši formāta virknei. Formāta rindā var izmantot šādus kvalifikatorus:

Noteicējs Apraksts
%M Mēneša nosaukums (janvāris...decembris)
%W Nedēļas dienas nosaukums (svētdiena...sestdiena)
%D Mēneša diena ar sufiksu angļu valodā (0st, 1st, 2nd, 3rd utt.)
%Y Gads, datums, 4 cipari
%y Gads, datums, 2 cipari
%X Gads nedēļai, kurā svētdiena tiek uzskatīta par nedēļas pirmo dienu, skaitlis, 4 cipari, lietots kopā ar "%V"
%x Gads nedēļai, kurā svētdiena tiek uzskatīta par nedēļas pirmo dienu, skaitlis, 4 cipari, lietots kopā ar "%v"
%a Nedēļas dienas saīsinātais nosaukums (sv...sest)
%d Mēneša diena, numurs (00..31)
%e Mēneša diena, skaitlis (0..31)
%m Mēnesis, diena (00..12)
%c Mēnesis, datums (0..12)
%b Mēneša saīsinātais nosaukums (jan...decembris)
%j Gada diena (001..366)
%H Stunda (00..23)
%k Stunda (0..23)
%h Stunda (01..12.)
%I Stunda (01..12.)
%l Stunda (1..12)
%i Minūtes, skaitlis (00..59)
%r Laiks, 12 stundu formāts (hh:mm:ss M)
%T Laiks, 24 stundu formāts (hh:mm:ss)
%S Sekundes (00..59)
%s Sekundes (00..59)
%p AM vai PM
%w Nedēļas diena (0=svētdiena..6=sestdiena)
%U Nedēļa (00..53), kur svētdiena tiek uzskatīta par nedēļas pirmo dienu
%u Nedēļa (00..53), kur pirmdiena tiek uzskatīta par nedēļas pirmo dienu
%V Nedēļa (01..53), kur svētdiena tiek uzskatīta par nedēļas pirmo dienu. Lietots ar "%X"
%v Nedēļa (01..53), kur pirmdiena tiek uzskatīta par nedēļas pirmo dienu. Lietots ar " %x "
%% Burtiski "%".

Visas pārējās rakstzīmes tiek vienkārši iekopētas iegūtajā izteiksmē bez interpretācijas:

Mysql> SELECT DATE_FORMAT("1997-10-04 22:23:00", "%W %M %Y"); -> "Sestdiena, 1997. gada oktobris" 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"

MySQL 3.23 rakstzīmei "%" ir jābūt pirms formāta specifikācijas rakstzīmēm. Iepriekšējās MySQL versijās rakstzīme "%" nav obligāta.

Iemesls, kāpēc mēneša un dienas intervāli sākas ar nulli, ir tas, ka MySQL kopš MySQL 3.23 atļauj daļējus datumus, piemēram, "2004-00-00".

TIME_FORMAT(laiks, formāts)

Šī funkcija tiek izmantota līdzīgi kā iepriekš aprakstītā funkcija DATE_FORMAT(), taču formāta virknē var būt tikai formāta specifikācijas, kas attiecas uz stundām, minūtēm un sekundēm. Norādot citus kvalifikatorus, tiks atgriezta vērtība NULL vai 0.

CURDATE() , CURRENT_DATE

Atgriež šodienas datumu kā vērtību formātā GGGG-MM-DD vai GGGGMMDD atkarībā no tā, vai funkcija tiek izmantota virknes vai ciparu kontekstā:

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

CURTIME() , CURRENT_TIME

Atgriež pašreizējo laiku kā vērtību formātā HH:MM:SS vai HHMMS atkarībā no tā, vai funkcija tiek izmantota virknes vai ciparu kontekstā:

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

TAGAD() , SYSDATE() , CURRENT_TIMESTAMP

Atgriež pašreizējo datumu un laiku kā vērtību formātā GGGG-MM-DD HH:MM:SS vai GGGGMMDDHHMMSS atkarībā no tā, vai funkcija tiek izmantota virknes vai ciparu kontekstā:

Mysql> SELECT NOW(); -> "1997-12-15 23:50:26" mysql> SELECT NOW() + 0; -> 19971215235026

Ņemiet vērā, ka NOW() katram pieprasījumam tiek novērtēts tikai vienu reizi, proti, tā izpildes sākumā. Tas nodrošina, ka vairākas atsauces uz NOW() vienā vaicājumā radīs vienu un to pašu vērtību.

UNIX_TIMESTAMP() , UNIX_TIMESTAMP(datums)

Izsaucot bez argumenta, šī funkcija atgriež UNIX_TIMESTAMP laikspiedolu (sekundes kopš 1970-01-01 00:00:00 GMT) kā neparakstītu veselu skaitli. Ja funkcija UNIX_TIMESTAMP() tiek izsaukta ar datuma argumentu, tā atgriež argumenta vērtību kā sekunžu skaitu kopš 1970-01-01 00:00:00 GMT. Datuma arguments var būt virkne DATE, DATETIME, TIMESTAMP vērtība vai skaitlis vietējā laika formātā GGMMDD vai GGGGMMDD:

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

Izmantojot funkciju UNIX_TIMESTAMP kolonnā TIMESTAMP, šī funkcija atgriezīs iekšējā laikspiedola vērtību tieši, bez netiešas virknes pārveidošanas par laikspiedolu ("string-to-unix-timestamp"). Ja norādītais datums ir ārpus derīgā diapazona, funkcija UNIX_TIMESTAMP() atgriezīs 0 , taču ņemiet vērā, ka tiek veikta tikai pamata pārbaude (1970.-2037. gads, 01.-12. mēnesis, 01.-31. diena). Ja nepieciešams veikt UNIX_TIMESTAMP() kolonnas atņemšanu, rezultātu var pārvērst veselos skaitļos ar zīmi. Skatiet 6.3.5. sadaļu “Tipu izliešanas funkcijas”.

NO_UNIXTIME(unix_timestamp)

Atgriež unix_timestamp argumenta attēlojumu kā vērtību formātā GGGG-MM-DD HH:MM:SS vai GGGGMMDDHHMMSS atkarībā no tā, vai funkcija tiek izmantota virknes vai ciparu kontekstā:

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

NO_UNIXTIME(unix_laikspiedols,formāts)

Atgriež argumenta unix_timestamp virknes attēlojumu, kas formatēts atbilstoši formāta virknei. Formāta virknē var būt tie paši kvalifikatori, kas norādīti funkcijas DATE_FORMAT() aprakstā:

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

SEC_TO_TIME(sekundes)

Atgriež argumentu sekundes, kas pārvērsts stundās, minūtēs un sekundēs kā vērtību formātā HH:MM:SS vai HHMMSS , atkarībā no tā, vai funkcija tiek izmantota virknes vai ciparu kontekstā:

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

TIME_TO_SEC(laiks)

Atgriež laika argumentu, kas pārveidots sekundēs:

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


šī raksta publicēšana ir atļauta tikai ar saiti uz raksta autora vietni

Kā zināms, mysql visi datumi tiek glabāti apgrieztā gada-mēneša-dienas secībā (2008-10-18), dažreiz pat bez atdalītāja (20081018).
Lai parādītu datumu, tas ir jāpārvērš parastā lasāmā formā.

Ir divas konversijas metodes, efektīvas un ne pārāk efektīvas.
Neefektīvs veids ir, ja datuma izvade no mysql tiek konvertēta, izmantojot php.
Es personīgi pats to darīju ļoti ilgu laiku. Pirms parādīšanas es apgriezu katru datumu, izmantojot php funkciju.
Ja transformāciju skaits nav liels, tad var apgriezt datumu ar PHP, tur nav nekā slikta, bet ja vajag izvilkt desmitiem vai simtiem tūkstošu ierakstu un konvertēt datumu katrā, tad protams konvertēt datumi, izmantojot mysql, būs daudz ātrāki.

Mysql ir lieliska DATE_FORMAT() funkcija, tā ir ļoti līdzīga php date() funkcijai.
Šeit ir lietošanas piemērs

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

Viss ir ļoti vienkārši un ātri, nav jāmaina datumi, izmantojot php.
Šeit ir šīs funkcijas definīciju saraksts

Noteicējs Apraksts
%M Mēneša nosaukums (janvāris...decembris)
%W Nedēļas dienas nosaukums (svētdiena...sestdiena)
%D Mēneša diena ar sufiksu angļu valodā (0st, 1st, 2nd, 3rd utt.)
%Y Gads, datums, 4 cipari
%y Gads, datums, 2 cipari
%X Gads nedēļai, kurā svētdiena tiek uzskatīta par nedēļas pirmo dienu, skaitlis, 4 cipari, lietots kopā ar "%V"
%x Gads nedēļai, kurā svētdiena tiek uzskatīta par nedēļas pirmo dienu, skaitlis, 4 cipari, lietots kopā ar "%v"
%a Nedēļas dienas saīsinātais nosaukums (sv...sest)
%d Mēneša diena, numurs (00..31)
%e Mēneša diena, skaitlis (0..31)
%m Mēnesis, diena (00..12)
%c Mēnesis, datums (0..12)
%b Mēneša saīsinātais nosaukums (jan...decembris)
%j Gada diena (001..366)
%H Stunda (00..23)
%k Stunda (0..23)
%h Stunda (01..12.)
%I Stunda (01..12.)
%l Stunda (1..12)
%i Minūtes, skaitlis (00..59)
%r Laiks, 12 stundu formāts (hh:mm:ss M)
%T Laiks, 24 stundu formāts (hh:mm:ss)
%S Sekundes (00..59)
%s Sekundes (00..59)
%p AM vai PM
%w Nedēļas diena (0=svētdiena..6=sestdiena)
%U Nedēļa (00..53), kur svētdiena tiek uzskatīta par nedēļas pirmo dienu
%u Nedēļa (00..53), kur pirmdiena tiek uzskatīta par nedēļas pirmo dienu
%V Nedēļa (01..53), kur svētdiena tiek uzskatīta par nedēļas pirmo dienu. Lietots ar "%X"
%v Nedēļa (01..53), kur pirmdiena tiek uzskatīta par nedēļas pirmo dienu. Lietots ar %x
%% Burtiski "%".

komentāri

27.11.2008 ----
Čau shaitan!!!
Pats jau piecus gadus strādāju pie php un mysql, un visu laiku mainīju datumu php...
Man pat neienāca prātā, ka būtu vieglāk izmantot iebūvēto mysql funkciju

28.11.2008 Zheka
Tāpat! Es vienmēr esmu izmantojis savu php funkciju

12/03/2008 Sergejs
Nu, vispār, vai kāds vispār izmanto šo pieeju?
Vai arī visi izmanto php, lai mainītu datumu?
Es personīgi nekad neesmu mainījis datumu mysql, joprojām visu daru php

28.06.2009 Iļja
Diemžēl nekas neizdevās :(

08.07.2009 Vitālijs
Forši, paldies par funkciju. Interesanti, kādi tur vēl ķeburi?

14.07.2009 DSaint
Paldies, tas ļoti palīdzēja. Atliek tikai parādīt mēneša nosaukumu krievu valodā)

28.07.2009 Vlad
mysql=>PHP
atlasiet unix_timestamp(sākuma_datums) kā sākuma_datums_php
php-kods
datums("d.m.Y",$row["sākuma_datums_php"])

PHP=>MySQL
atjaunināšanas tabulas kopa start_date=DATE_FORMAT(STR_TO_DATE("19/12/2009 18:35:22 PM","%d.%m.%Y %H:%i"),"%Y.%m.%d % Sveiki")

18.08.2009 Viesis
2:DSaint
Ir tik brīnišķīga funkcija:
ELT(MĒNESIS("2004-04-10"), "Jan.","februāris","marts","aprīlis."maijs","jūnijs","jūlijs","aug."," Sep.""Okt.","Nov.","Dec.")

Lieto to. :-)

29.10.2009 Vladimirs
Paldies, par ELT(MONTH("2004-04-10"), "Jan.","Febr.","Marts","Apr.""Maijs","Jūnijs","Jūlijs","Augsts ""Sep.","Okt.","Nov.","Dec.")
neesmu dzirdējis.

07.10.2010 Jevgeņijs
Kas darbojas ātrāk? Pārvēršana pieprasījumā vai PHP funkcijas rezultātā?

07.10.2010 aizsargs
Vismaz mazāk apstrādājamās atmiņas, mazāk funkciju izsaukumu, mazāk atmiņas piešķiršanas... Es visu laiku lietoju kaut ko tādu, bet ne mysql, bet gan postgresql.

10/08/2010 Admin
Jevgeņijs, aizstāvis pareizi teica, ka šai transformācijai datu bāzē vajadzētu darboties skaistāk, bet, protams, ja mēs runājam par milzīga datu apjoma ieguvi.
Ja velk 10-20 ierakstus, tad nav atšķirības, kā konvertēt datumu, salīdzinot ar citām slodzēm, tas ir sīkums.

27.01.2011 pcemma
uhh paldies afftor (: vairs nav jāizmanto mana mega foršā funkcija konvertēšanai (:

13.04.2011 Xes
KĀ TO IZMANTOT PHP
while ($sqlr=mysql_fetch_array($sql))
{
echo ($sqlr["comadd"]." ".$sqlr["komentārs"]."

");

$sqlr["comadd"] — vai tas ir jāuzrāda parastā formā?
}

14.04.2011 Vitālijs
Man datu bāzē ir datums formātā 19/11/2008, tabulas tips VARCHAR, kā es varu to pārrakstīt datu bāzē formātā 2008-11-19?
Rokas tikai ļoti ilgi...
Paldies.

15.04.2011 admin
Xes ir MySQL funkcija, jums tā ir jāizmanto sql vaicājumā, kas, spriežot pēc jūsu koda, atrodas kaut kur augstāk. To nevar izmantot šajā koda sadaļā.

15.04.2011 admin
Vitālij, vienkārši mainiet šūnas tipu uz DATE, mysql automātiski konvertēs visus datus šajā šūnā uz 2008-11-19 formātu.
Bet katram gadījumam pirms šūnas tipa maiņas uztaisi šīs tabulas izgāztuvi, jo pēkšņi datu bāze kaut ko izdarīs nepareizi un tabula salūzīs pavisam.

Ja jums ir svarīgi atstāt lauka veidu kā varchar, pēc DATE veida iestatīšanas iestatiet to atpakaļ uz varchar...

Šī ir vienkāršākā iespēja, bet ne pilnīgi pareiza, taču es pārbaudīju, vai tā darbojas.

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

24.05.2011 Konstantīns
un es vienmēr uztveru SELECT *,UNIX_TIMESTAMP(created) KĀ izveidots NO...
Bet ar motoru es to varu izdarīt jebkurā formātā. Pat tikai dienu, pat tikai laiku...
un salīdziniet, kas ir lielāks par 14.05.2011 vai 14.05.2010...
Un es to rakstu šādi:
...date=".gmdate("Y-m-d H:i:s",$created)...
un vispār es neredzu iemeslu mainīt ieradumus

24.05.2011 Sergejs
Konstantīns, es pats izvadīšanai izmantoju php date(), bet šeit mēs apsveram iespēju konvertēt datumu nevis caur php, bet caur mysql.

Es teiktu, ka šis ir tikai pārskats par mysql funkciju, un tai noteikti ir tiesības pastāvēt...

Katra veida vērtību diapazona un iespējamo datuma un laika formātu aprakstu skatiet sadaļā 6.2.2 Datuma un laika datu tipi.

Zemāk ir piemērs, kurā tiek izmantotas datuma funkcijas. Šis vaicājums atlasa visus ierakstus ar date_col vērtību pēdējo 30 dienu laikā:

Mysql> SELECT kaut ko FROM tbl_name WHERE TO_DAYS(NOW()) - TO_DAYS(date_col) DAYOFWEEK(datums) Atgriež nedēļas dienas indeksu datuma argumentam (1 = svētdiena, 2 = pirmdiena, ... 7 = sestdiena ). Šīs indeksa vērtības atbilst ODBC standartam: mysql> SELECT DAYOFWEEK("1998-02-03"); -> 3 WEEKDAY(date) Atgriež nedēļas dienas indeksu datuma argumentam (0 = pirmdiena, 1 = otrdiena, ... 6 = svētdiena): mysql> SELECT WEEKDAY("1997-10-04 22: 23:00"); -> 5 mysql> SELECT WEEKDAY("1997-11-05"); -> 2 DAYOFMONTH(datums) Atgriež mēneša dienas kārtas numuru datuma argumentam diapazonā no 1 līdz 31: mysql> SELECT DAYOFMONTH("1998-02-03"); -> 3 DAYOFYEAR(datums) Atgriež gada dienas kārtas numuru datuma argumentam diapazonā no 1 līdz 366: mysql> SELECT DAYOFYEAR("1998-02-03"); -> 34 MONTH(date) Atgriež gada mēneša sērijas numuru datuma argumentam diapazonā no 1 līdz 12: mysql> SELECT MONTH("1998-02-03"); -> 2 DAYNAME(date) Atgriež nedēļas dienas nosaukumu datuma argumentam: mysql> SELECT DAYNAME("1998-02-05"); -> "Ceturtdiena" MONTHNAME(date) Atgriež mēneša nosaukumu datuma argumentam: mysql> SELECT MONTHNAME("1998-02-05"); -> "Februāris" QUARTER(date) Atgriež gada ceturkšņa numuru datuma argumentam diapazonā no 1 līdz 4: mysql> SELECT QUARTER("98-04-01"); -> 2 WEEK(datums) WEEK(datums,pirmais) Dots viens arguments, atgriež nedēļas kārtas numuru gadā datumam, sākot no 0 līdz 53 (jā, iespējams, 53. nedēļas sākums) reģionos, kur svētdiena tiek uzskatīta par nedēļas pirmo dienu. Forma WEEK() ar diviem argumentiem ļauj norādīt, vai nedēļa sākas svētdienā vai pirmdienā. Nedēļa sākas no svētdienas, ja otrais arguments ir 0, un no pirmdienas, ja 1: mysql> SELECT WEEK("1998-02-20"); -> 7 mysql> SELECT WEEK("1998-02-20",0); -> 7 mysql> SELECT WEEK("1998-02-20",1); -> 8 mysql> SELECT WEEK("1998-12-31",1); -> 53 Piezīme. Versijā 4.0 funkcija WEEK(#,0) tika mainīta, lai tā atbilstu ASV kalendāram. YEAR(datums) Atgriež gadu datuma argumentam diapazonā no 1000 līdz 9999: mysql> SELECT YEAR("98-02-03"); -> 1998 YEARWEEK(datums) YEARWEEK(datums,pirmais) Atgriež gadu un nedēļu datumam . Šīs funkcijas otrais arguments darbojas līdzīgi kā otrais funkcijas WEEK() arguments. Lūdzu, ņemiet vērā, ka gads var atšķirties no datuma argumentā norādītā gada pirmajām un pēdējām nedēļām: mysql> SELECT YEARWEEK("1987-01-01"); -> 198653 HOUR(time) Atgriež stundu laika argumentam diapazonā no 0 līdz 23: mysql> SELECT HOUR("10:05:03"); -> 10 MINUTE(laiks) Atgriež minūšu skaitu laika argumentam diapazonā no 0 līdz 59: mysql> SELECT MINUTE("98-02-03 10:05:03"); -> 5 SECOND(time) Atgriež sekunžu skaitu laika argumentam diapazonā no 0 līdz 59: mysql> SELECT SECOND("10:05:03"); -> 3 PERIOD_ADD(P,N) Pievieno N mēnešus periodam P (GGMM vai GGGGMM formātā). Atgriež vērtību GGGGMM formātā. Ņemiet vērā, ka perioda arguments P nav datuma vērtība: mysql> SELECT PERIOD_ADD(9801,2); -> 199803 PERIOD_DIFF(P1,P2) Atgriež mēnešu skaitu starp periodiem P1 un P2. P1 un P2 ir jābūt GGMM vai GGGMM formātā. Ņemiet vērā, ka perioda argumenti P1 un P2 nav datuma vērtības: mysql> SELECT PERIOD_DIFF(9802,199703); -> 11 DATE_ADD(datums,INTERVĀLS izbeiguma veids) DATE_SUB(datums,INTERVĀLA izbeiguma veids) ADDDATE(datums,INTERVĀLS izbeiguma veids) APAKŠDATUMS(datums,INTERVĀLS izbeiguma veids) Šīs funkcijas veic aritmētiskās darbības ar datumiem. Abi ir jauni MySQL 3.22. Funkcijas ADDDATE() un SUBDATE() ir sinonīmi DATE_ADD() un DATE_SUB() . Programmā MySQL 3.23 funkciju DATE_ADD() un DATE_SUB() vietā varat izmantot operatorus + un -, ja labās puses izteiksme ir DATE vai DATETIME tipa kolonna (skatiet piemēru tālāk). Datuma arguments ir DATETIME vai DATE vērtība, kas norāda sākuma datumu. Izteiksme izteiksme norāda intervāla apjomu, kas jāpievieno sākuma datumam vai jāatņem no tā. Izteiksme ir virkne, kas var sākties ar - negatīvām intervāla vērtībām. Tipa atslēgvārds norāda, kā dotā izteiksme jāinterpretē. Palīdzības funkcija EXTRACT (tips no datuma) atgriež noteiktā tipa (tipa) intervālu no datuma vērtības. Šajā tabulā parādīta saistība starp tipa un izteiksmes argumentiem:

Nozīme Tips Paredzamais formāts ekspr
OTRĀSEKUNDES
MINŪTEMINŪTES
STUNDASTUNDAS
DIENADIENAS
MĒNESISMĒNEŠI
GADSGADI
MINUTE_SECOND"MINUTES:SECONDS"
HOUR_MINUTE"HOURS:MINUTES"
DAY_HOUR"DIENAS STUNDAS"
YEAR_MONTH"GADI-MĒNEŠI"
HOUR_SECOND"HOURS:MINUTES:SECONDS"
DAY_MINUTE"DAYS HOURS:MINUTES"
DAY_SECOND"DAYS HOURS:MINUTES:SECONDS"
Programmā MySQL izteiksmes izteiksmes formāts pieļauj jebkādus atdalītājus. Šajā tabulā norādītie norobežotāji ir sniegti kā piemēri. Ja datums ir DATE vērtība un paredzētais aprēķins ietver tikai daļas YEAR , MONTH un DAY (tas ir, nav TIME daļas), rezultāts tiek attēlots ar DATE vērtību. Citos gadījumos rezultāts ir DATETIME vērtība: mysql> SELECT "1997-12-31 23:59:59" + INTERVAL 1 SECOND; -> 1998-01-01 00:00:00 mysql> ATLASĪT INTERVĀLU 1 DIENA + "1997-12-31"; -> 1998-01-01 mysql> ATLASĪT "1998-01-01" - INTERVĀLS 1 SEKUNDE; -> 1997-12-31 23:59:59 mysql> SELECT DATE_ADD("1997-12-31 23:59:59", INTERVĀLS 1 sekunde); -> 1998-01-01 00:00:00 mysql> SELECT DATE_ADD("1997-12-31 23:59:59", INTERVĀLS 1 DIENA); -> 1998-01-01 23:59:59 mysql> SELECT DATE_ADD("1997-12-31 23:59:59", INTERVAL "1:1" MINUTE_SECOND); -> 1998-01-01 00:01:00 mysql> SELECT DATE_SUB("1998-01-01 00:00:00", INTERVAL "1 1:1:1" DAY_SECOND); -> 1997-12-30 22:58:59 mysql> SELECT DATE_ADD("1998-01-01 00:00:00", INTERVAL "-1 10" DAY_HOUR); -> 1997-12-30 14:00:00 mysql> SELECT DATE_SUB("1998-01-02", INTERVALS 31 DAY); -> 1997-12-02 Ja norādītais intervāls ir pārāk īss (tas ir, neietver visas intervāla daļas, ko sagaida norādītā tipa atslēgvārds), tad MySQL pieņem, ka intervāla galējās kreisās daļas ir izlaistas. Piemēram, ja tipa arguments ir DAY_SECOND , tad paredzamajā izteiksmes izteiksmē ir jābūt šādām daļām: dienas, stundas, minūtes un sekundes. Ja šajā gadījumā norādāt intervāla vērtību kā "1:10", MySQL pieņem, ka dienas un stundas ir izlaistas un ka vērtība ietver tikai minūtes un sekundes. Citiem vārdiem sakot, kombinācija "1:10" DAY_SECOND tiek interpretēta kā ekvivalenta "1:10" MINUTE_SECOND. MySQL interpretē TIME vērtības līdzīgā veidā - kā attēlojot pagājušo laiku, nevis diennakts laiku. Lūdzu, ņemiet vērā, ka, pievienojot vai atņemot darbības, kas saistītas ar DATE vērtību un izteiksmi, kas satur laika daļu, šī DATE vērtība tiks automātiski pārveidota par DATETIME tipa vērtību: mysql> SELECT DATE_ADD("1999-01-01", INTERVAL 1 DAY ); -> 1999-01-02 mysql> SELECT DATE_ADD("1999-01-01", INTERVĀLS 1 STUNDA); -> 1999-01-01 01:00:00 Ja tiek izmantotas nepareizas datuma vērtības, rezultāts būs NULL . Ja, summējot MONTH , YEAR_MONTH vai YEAR, dienas skaitlis iegūtajā datumā pārsniedz maksimālo dienu skaitu jaunajā mēnesī, tad iegūtā datuma dienas numurs tiek iestatīts uz jaunā mēneša pēdējo dienu: mysql> SELECT DATE_ADD("1998-01-30", INTERVĀLS 1 MONTH) ; -> 1998-02-28 No iepriekšējā piemēra var redzēt, ka vārds INTERVAL un atslēgvārda veids nav reģistrjutīgi. EXTRACT(tips NO datuma) EXTRACT() izmanto tādus pašus intervālu veidus kā DATE_ADD() vai DATE_SUB(), bet EXTRACT() izvelk daļu no datuma vērtības, nevis veic aritmētiku. mysql> SELECT EXTRACT(GADS NO "1999-07-02"); -> 1999 mysql> SELECT EXTRACT(YEAR_MONTH NO "1999-07-02 01:02:03"); -> 199907 mysql> SELECT EXTRACT(DAY_MINUTE FROM "1999-07-02 01:02:03"); -> 20102 TO_DAYS(date) funkcija atgriež dienas numuru datuma argumentā norādītajam datumam (dienu skaits, kas pagājis kopš gada 0): mysql> SELECT TO_DAYS(950501); -> 728779 mysql> SELECT TO_DAYS("1997-10-07"); -> 729669 TO_DAYS() nav paredzēts lietošanai ar pirms Gregora kalendāra vērtībām (1582), jo tajā nav ņemtas vērā dienas, kas zaudētas, mainot kalendāru. FROM_DAYS(N) Atgriež DATE vērtību dotajam dienas numuram N: mysql> SELECT FROM_DAYS(729669); -> "1997-10-07" Funkcija FROM_DAYS() nav paredzēta lietošanai ar vērtībām pirms Gregora kalendāra ieviešanas (1582), jo tā neņem vērā dienas, kas zaudētas, mainot kalendāru. DATE_FORMAT(datums,formāts) Formatē datuma vērtību atbilstoši formāta virknei. Formāta rindā var izmantot šādus kvalifikatorus:
Noteicējs Apraksts
%MMēneša nosaukums (janvāris...decembris)
%WNedēļas dienas nosaukums (svētdiena...sestdiena)
%DMēneša diena ar angļu valodas sufiksu (1., 2., 3. utt.)
%YGads, datums, 4 cipari
%yGads, datums, 2 cipari
%XGads nedēļai, kurā svētdiena tiek uzskatīta par nedēļas pirmo dienu, skaitlis, 4 cipari, lietots kopā ar "%V"
%xGads nedēļai, kurā svētdiena tiek uzskatīta par nedēļas pirmo dienu, skaitlis, 4 cipari, lietots kopā ar "%v"
%aNedēļas dienas saīsinātais nosaukums (sv...sest)
%dMēneša diena, numurs (00..31)
%eMēneša diena, skaitlis (0..31)
%mMēnesis, datums (01..12.)
%cMēnesis, datums (1.12.)
%bMēneša saīsinātais nosaukums (jan...decembris)
%jGada diena (001..366)
%HStunda (00..23)
%kStunda (0..23)
%hStunda (01..12.)
%IStunda (01..12.)
%lStunda (1..12)
%iMinūtes, skaitlis (00..59)
%rLaiks, 12 stundu formāts (hh:mm:ss M)
%TLaiks, 24 stundu formāts (hh:mm:ss)
%SSekundes (00..59)
%sSekundes (00..59)
%pAM vai PM
%wNedēļas diena (0=svētdiena..6=sestdiena)
%UNedēļa (00..53), kur svētdiena tiek uzskatīta par nedēļas pirmo dienu
%uNedēļa (00..53), kur pirmdiena tiek uzskatīta par nedēļas pirmo dienu
%VNedēļa (01..53), kur svētdiena tiek uzskatīta par nedēļas pirmo dienu. Lietots ar "%X"
%vNedēļa (01..53), kur pirmdiena tiek uzskatīta par nedēļas pirmo dienu. Lietots ar %x
%% Burtiski "%" .
Visas pārējās rakstzīmes tiek vienkārši iekopētas iegūtajā izteiksmē bez interpretācijas: mysql> SELECT DATE_FORMAT("1997-10-04 22:23:00", "%W %M %Y"); -> "Sestdiena, 1997. gada oktobris" 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" MySQL 3.23 rakstzīmei "%" ir jābūt pirms formāta specifikācijas rakstzīmēm. Iepriekšējās MySQL versijās rakstzīme "%" nav obligāta. TIME_FORMAT(laiks,formāts) Šī funkcija ir līdzīga iepriekš aprakstītajai funkcijai DATE_FORMAT(), taču formāta virknē var būt tikai formāta specifikācijas, kas attiecas uz stundām, minūtēm un sekundēm. Norādot citus kvalifikatorus, tiks atgriezta vērtība NULL vai 0. CURDATE() CURRENT_DATE Atgriež šodienas datumu kā vērtību GGGG-MM-DD vai GGGGMMDD formātā atkarībā no tā, vai funkcija tiek izmantota virknes vai ciparu kontekstā: mysql> SELECT CURDATE(); -> "1997-12-15" mysql> SELECT CURDATE() + 0; -> 19971215 CURTIME() CURRENT_TIME Atgriež pašreizējo laiku kā vērtību formātā HH:MM:SS vai HHMMS atkarībā no tā, vai funkcija tiek izmantota virknes vai ciparu kontekstā: mysql> SELECT CURTIME(); -> "23:50:26" mysql> SELECT CURTIME() + 0; -> 235026 NOW() SYSDATE() CURRENT_TIMESTAMP Atgriež pašreizējo datumu un laiku kā vērtību formātā GGGG-MM-DD HH:MM:SS vai GGGGMMDDHHMMSS atkarībā no tā, vai funkcija tiek izmantota virknes vai ciparu kontekstā: mysql > SELECT NOW (); -> "1997-12-15 23:50:26" mysql> SELECT NOW() + 0; -> 19971215235026 UNIX_TIMESTAMP() UNIX_TIMESTAMP(datums) Izsaucot bez argumenta, šī funkcija atgriež UNIX_TIMESTAMP laikspiedolu (sekundes kopš 1970-01-01 00:00:00 GMT) kā neparakstītu veselu skaitli. Ja funkcija UNIX_TIMESTAMP() tiek izsaukta ar datuma argumentu, tā atgriež argumenta vērtību kā sekunžu skaitu kopš 1970-01-01 00:00:00 GMT. Datuma arguments var būt virkne DATE, DATETIME, TIMESTAMP vērtība vai skaitlis vietējā laika formātā GGMMDD vai GGGGMMDD: mysql> SELECT UNIX_TIMESTAMP(); -> 882226357 mysql> SELECT UNIX_TIMESTAMP("1997-10-04 22:23:00"); -> 875996580 Izmantojot funkciju UNIX_TIMESTAMP kolonnā TIMESTAMP, šī funkcija atgriezīs iekšējā laikspiedola vērtību tieši, bez netiešās virknes pārvēršanas laikspiedolā ("string-to-unix-timestamp""). Ja norādītais datums ir ārpus derīgā diapazona, funkcija UNIX_TIMESTAMP() atgriezīs 0 , taču ņemiet vērā, ka tiek veikta tikai pamata pārbaude (1970.-2037. gads, 01.-12. mēnesis, 01.-31. diena). Ja nepieciešams veikt UNIX_TIMESTAMP() kolonnas atņemšanu, rezultātu var pārvērst veselos skaitļos ar zīmi. Skatiet sadaļu 6.3.5. Tipa pārveidošanas funkcijas. FROM_UNIXTIME(unix_timestamp) Atgriež unix_timestamp argumenta attēlojumu kā vērtību formātā GGGG-MM-DD HH:MM:SS vai GGGGMMDDHHMMSS atkarībā no tā, vai funkcija tiek izmantota virknes vai ciparu kontekstā: mysql> SELECT FROM_UNIXTIME(8759) ); -> "1997-10-04 22:23:00" mysql> SELECT FROM_UNIXTIME(875996580) + 0; -> 19971004222300 FROM_UNIXTIME(unix_timestamp,format) Atgriež argumenta unix_timestamp virknes attēlojumu, kas formatēts atbilstoši formāta virknei. Formāta virknē var būt ietverti tie paši kvalifikatori, kas norādīti funkcijas DATE_FORMAT() aprakstā: mysql> SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(), "%Y %D %M %h:%i:%s %x"); -> "1997. gada 23. decembris 03:43:30 1997" SEC_TO_TIME(sekundes) Atgriež sekunžu argumentu, kas pārveidots stundās, minūtēs un sekundēs, kā vērtību formātā HH:MM:SS vai HHMMSS, atkarībā no konteksta kura funkcija tiek izmantota - virknē vai skaitļos: mysql SELECT SEC_TO_TIME(2378); -> "00:39:38" mysql> SELECT SEC_TO_TIME(2378) + 0; -> 3938 TIME_TO_SEC(time) Atgriež laika argumentu, kas pārveidots sekundēs: mysql> SELECT TIME_TO_SEC("22:23:00"); -> 80580 mysql> SELECT TIME_TO_SEC("00:39:38"); -> 2378

Lietotāju komentāri

Ievietoja ceturtdien, 2002. gada 20. jūnijā, 7:08[Dzēst] [Rediģēt]

Atlasot laikspiedola datu tipu no tabulas
un vēlaties pielāgoties laika joslai (šis piemērs ir
no Klusā okeāna laika līdz EST):
SELECT date_format(DATE_ADD(,
INTERVĀLS 3 STUNDAS), "%M %e, %Y pie %H:%i EST") NO
;

Ievietoja Dens Allens otrdien, 2002. gada 25. jūnijā, plkst. 00:50[Dzēst] [Rediģēt]

Vai kāds cits to pamana
funkcija
YEARMONTH() ir acīmredzami pazudis!!! Sakiet, ka jums ir
divi datumi un jūs vēlaties veikt period_diff...jūs
nevar vienkārši concat() YEAR() un MONTH(), jo
mēnesis nav "0" polsterēts...tikai liekas ar
YEARWEEK() būtu jēga arī
YEARMONTH()... domas? Es zinu, ka jūs varat to izdarīt ar
DATE_FORMAT, bet kāpēc tad visi pārējie
funkcijas?

Ievietoja trešdien, 2002. gada 18. decembrī, 17:28[Dzēst] [Rediģēt]

Man jābrīnās, kāpēc nav tādas funkcijas
pamatā dara to, ko tas dara:

IZVĒLĒTIES STĀVU((UNIX_TIMESTAMP(TAGAD()) -
UNIX_TIMESTAMP(dzimšanas_datums))/60/60/24/364,25)
kā vecums

Tas liktu daudz koda izskatīties daudz
tīrītājs.

Tas ir pat īpaši svarīgi lietošanai
ieslēgts
uzglabāt o datus par cilvēkiem ASV,
jo ASV tiesību akti aizliedz vākt personas
informācija par ikvienu, kas jaunāks par 13 gadiem,
un šis triks nosaka viņu vecumu gados.

Būtu daudz jaukāk, ja būtu norādīts AGE (datums
[,datums2]
) funkcija.

Tuvākā lieta ir period_diff,
kuras
nepieņem standarta datuma virkni un atgriež
mēneši, kas ir ak-tā-
noderīga

Faktiski tas nedarbojas gadījumā, ja
laikmeta dzimšanas datumi, vēl sliktāk. unix_timestamp
atgriež 0 visiem pirmslaika datumiem.

Es uzskatu, ka tā ir kļūda un patiešām ir vajadzīga
uz
būt fiksētam.

Jāizmanto period_diff/12, es domāju.

Ievietoja Metjū Mullenvegs trešdien, 2002. gada 18. decembrī, 17:27[Dzēst] [Rediģēt]

Jūs aktualizējat dažus svarīgus jautājumus, bet
tikt galā ar vecumu tiešām nav ka
grūti. Priekš
Piemēram, jūs varētu darīt kaut ko līdzīgu šim:

Mysql> SELECT DATE_FORMAT(
FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(dob)), "%Y")+0
KĀ vecums NO cilvēkiem;

Kur "dob" acīmredzami ir viņu dzimšanas datums.
Tas darbosies arī ar datumiem pirms un pēc laikmeta.
Lūdzu, atvainojiet par dīvaino formatējumu
komentāru sistēma, šķiet, uzstāj uz rindas ievietošanu
ielaužas koda blokā. es
saskārās ar šo problēmu, strādājot ar dažiem
ģenealoģiskās lietas pāri plkst href="http://www.mullenweg.com" >Mullenweg.com
, ģimenes vietne. Ceru, ka tas palīdz!

Ievietoja Dens Allens trešdien, 2002. gada 18. decembrī, 17:31[Dzēst] [Rediģēt]



Šķiet, ka ir ļoti sāpīgi iegūt dienas
mēnesī, bet šeit ir viens veids

izvēlieties
DATE_FORMAT(CONCAT(YEAR("2002-05-05"), "-",
MĒNESIS("2002-05-05" + INTERVĀLS 1 MĒNESIS), "-01") -
INTERVĀLS 1 DIENA, "%e") kā dienu skaits

Es domāju, ka būtu jauki, ja mums būtu tikai a
DATE_FORMAT vienība šim

Ievietoja Īzaks Šepards trešdien, 2002. gada 18. decembrī, plkst. 17:31[Dzēst] [Rediģēt]

Ja meklējat vispārīgus SQL vaicājumus, tas tiks darīts
ļauj iegūt dienas, mēnešus un gadus
starp jebkuriem diviem norādītajiem datumiem, jūs varētu apsvērt
izmantojot šos. Jums vienkārši jāaizstāj datums1 un
date2 ar jūsu datuma laukiem un mytable ar jūsu
tabulas nosaukums.






Dienu skaits starp datumu1 un datumu2:

ATLASĪT TO_DAYS(datums2) -
TO_DAYS(datums1) NO "mana tabula" WHERE
1






Mēnešu skaits starp datumu1 un datumu2:

ATLASĪT PERIOD_DIFF
(DATE_FORMAT(datums2,"%Y%m"), DATE_FORMAT
(datums1,"%Y%m")) - (MID(datums2, 6, 5)< MID(date1,
6, 5)) NO "mana galda", KUR 1






Gadu skaits starp datumu1 un datumu2:

SELECT (YEAR(datums2) - YEAR
(datums1)) - (MID(datums2, 6, 5)< MID(date1, 6, 5))
NO `mytable`, KUR 1

Tagad daži komentāri par šiem.

1. Šie rezultāti atgriež veselu gadu skaitu,
mēneši un dienas. Viņiem ir "grīdas". Tādējādi 1.4
dienas tiktu rādītas kā 1 diena, bet 13,9 gadi
parādīt kā 13 gadus.

2. Ņemiet vērā, ka dažos izmantoju Būla izteiksmes
gadījumiem. Tā kā Būla izteiksmju vērtība ir 0
vai 1, es varu tos izmantot, lai no kopējās summas atņemtu 1
pamatojoties uz nosacījumu.

Piemēram, lai aprēķinātu gadu skaitu
starp datumiem vispirms vienkārši atņemiet gadus.
Problēma ir tā, ka tas ne vienmēr ir pareizi.
Apsveriet gadu skaitu no 1950. gada 1. jūlija
un 1952. gada 1. maijs. Tehniski ir tikai viens pilns
gads starp viņiem. 1952. gada 1. jūlijā un vēlāk
būs divi gadi. Tāpēc jums vajadzētu
atņemiet vienu gadu, ja datums vēl nav norādīts
sasniedza pilnu gadu. Tas tiek darīts, pārbaudot, ja
otrā mēneša diena ir pirms pirmā mēneša -
diena. Ja tā, tad tiek iegūta vērtība 1, kas ir
atņem no kopsummas.

3. Lai iegūtu mēneša dienu, es izmantoju MID. Tas ir labāk
nekā izmantojot RIGHT, jo tas darbosies abos datumos
un datuma laiki.

4. Kā minēts iepriekšējā ziņā, PERIOD_DIFF
vajag gada mēneša formātu, bet labākā īsti nav
veids, kā to izdarīt. Lai to iegūtu, es izmantoju DATE_FORMAT
(datums1,"%Y%m").

5. Atšķirībā no daudziem citiem risinājumiem šiem vaicājumiem vajadzētu
darbs ar datumiem pirms 01.01.1970.

6. Atsauksmes būtu ļoti pateicīgas. Tā kā es esmu
izmantojot šo savās lietojumprogrammās, es būtu priecīgs, ja
jūs darāt man zināmu, ja atklājat kļūdu loģikā.

Ievietoja Džeisons Rusts trešdien, 2002. gada 18. decembrī, 17:31[Dzēst] [Rediģēt]

Pāris reizes starp funkcijām. Tas ir
vēl viens veids, kā aprēķināt mēnešus starp diviem
datumi, kas dažkārt var noderēt
lineārs:


Mēneši no 2002-02-15 un
2002-01-15
(((YEAR("2002-02-15") - 1) * 12 +
MĒNESIS("2002-02-15")) - ((YEAR("2002-01-15") - 1) *
12 + MONTH("2002-01-15"))) - (MID("2002-01-15", 9,
2) < MID("2002-02-15", 9, 2))

Tālāk ir norādītas nedēļas starp funkcijām:

Nedēļas no 2002-08-28 un
2002-08-21
STĀVS((TO_DAYS("2002-08-28") -
TO_DAYS("2002-08-21")) / 7)

Ievietoja ceturtdien, 2002. gada 12. septembrī, 6:22[Dzēst] [Rediģēt]

Jūs nevarat darīt DATE_ADD("15:30:00", INTERVAL 55
MINUTE), tas atgriezīs NULL — atrasto risinājumu
ir:
DATE_FORMAT(DATE_ADD(CONCAT("2000-01-
01 ",`time_field`), INTERVAL "minūtes" MINUTE), "%
H:%i:%s")

Ievietoja Marcelo Celleri otrdien, 2002. gada 17. septembrī, 14:58[Dzēst] [Rediģēt]

Man ir divi datuma un laika lauki (date_out, date_in) ,
tie ir ieraksti par pieteikšanās un atteikšanās laikiem, un es
jāatrod veids, kā iegūt atšķirību starp
viņi abi, un es izmēģināju šo: f_out -
f_in, bet tas man deva veselu rezultātu, kas ir
man ir nevērtīgs, man vajag atšķirību
sekundes Vai jūs, lūdzu, varētu man palīdzēt, jo es to nedaru
jums ir ideja, kā pārvērst šo atbildi sekundēs

Ievietoja Ricky Orea otrdien, 2002. gada 12. novembrī, 15:51[Dzēst] [Rediģēt]

Mans lietotājs ievada datumu formātā
no "MM/DD/GGGGG", kā es varu to pārvērst par
formātā "GGGG/MM/DD", pirms es to saglabāju mysql
tabula?

Ievietoja Ram Narajans pirmdien, 2002. gada 18. novembrī, 20:46[Dzēst] [Rediģēt]

Sveiki visiem,
Pievienoju savam draugam Rikija Orea vaicājumam, Ja mans lietotājs
ievada datumu dd mmm gggg formātā (26. nov
2002), kā man vajadzētu ievietot mysql db.

Ievietoja Louis Bentt ceturtdien, 2002. gada 21. novembrī, plkst. 11:35[Dzēst] [Rediģēt]

%d mēneša diena, skaitliski (00..31)
%e Mēneša diena, skaitliski (0..31)

Lai nebūtu pedantisks, bet nekad nav dienas "0"
mēneša laikā...

Ievietoja Twidi trešdien, 2002. gada 18. decembrī, 17:27[Dzēst] [Rediģēt]

Kā uzzināt dienu skaitu mēnesī:

Vienkārši paņemiet mēneša pirmo dienu un pievienojiet vienu
mēnesis (lai iegūtu nākamā mēneša pirmo dienu) un
atņemiet vienu dienu (lai iegūtu pēdējo dienu
iepriekšējā mēnesī, tas ir dienu skaits), kā
sekot:

Izvēlieties
mēneša diena(date_sub(date_add(concat(date_format(MYDATE,
"%Y-%m"), "-01"), intervāls 1 mēnesis), intervāls 1
diena)) kā dienu_skaits no MYTABLE;

(tikai nomainiet MYDATE un MYTABLE)

Varbūt ir kāds cits ceļš...

Ievietoja svētdien, 2002. gada 1. decembrī, 10:46[ trešdien, 2003. gada 8. janvārī, plkst. 5:25[Dzēst] [Rediģēt]

Es mēģinu uzrakstīt MySQL skriptu, kas aizpildīs tabulu ar ierakstiem katrai vērtībai starp 2 dotajiem parametriem. Bez cilpas struktūras, kas pieejama
Saglabātās procedūras, tas izrādās problemātiski. Vai kādam ir risinājums?

Aptuvens piemērs: -
Tabulā "test" ir datuma lauks "test_date".




Tops