Formate de timp în mysql timestamp vs data date, blog personal valeria leontieva

În MySQL 5, există mai multe tipuri de date pentru a stoca data și ora. Acestea sunt TIMESTAMP, DATE, DATETIME, TIME și YEAR. Toate acestea au caracteristici proprii, iar alegerea în favoarea unui anumit tip de calendar ar trebui făcută separat în fiecare situație specifică. Aș dori să vă împărtășesc rezultatul mini-cercetării de astăzi a acestor tipuri, inclusiv în ceea ce privește lucrul cu fusurile orare. Astfel, toate tipurile de date calendaristice sunt descrise în detaliu în secțiunea "10.3. Date și Time Types "din manualul MySQL. Iar informațiile importante cu privire la suportul schemelor de fus orar sunt descrise în secțiunea "9.7. Suport MySQL Server Time Zone ». Toate cele de mai jos se bazează pe studiul manualului. În același timp, aici sunt indicate numai nuanțele de alegere în favoarea unuia sau a altui tip, prin urmare acest material nu înlocuiește manualul, ci îl completează.

Mai întâi o scurtă descriere a fiecărui tip:

  • TIMESTAMP - tipul de date pentru stocarea datei și a orei. Datele sunt stocate sub forma numărului de secunde care au trecut de la începutul "erei Unix". Domeniu valori: 1970-01-01 00:00:00 - 2038-12-31 00:00:00. Acesta ocupă 4 octeți.
  • YEAR este tipul de date pentru stocarea anului. Gama de valori este de 1901 - 2155. Acesta ocupă un octet.
  • DATE este tipul de date pentru stocarea datei. Gama de valori este 1000-01-01 - 9999-12-31. Acesta ocupă 3 octeți.
  • TIME - tipul de date pentru stocarea timpului. Intervalul de valori este -828: 59: 59 - 828: 59: 59. Acesta ocupă 3 octeți.
  • DATETIME este tipul de date pentru stocarea datei și a orei. Gama de valori: 1000-01-01 00:00:00 - 9999-12-31 00:00:00. Acesta ocupă 8 octeți.

Analizând descrierea tipurilor prezentate mai sus, puteți face aproape toate concluziile privind meritele și dezavantajele acestor sau ale altor tipuri. Totul este destul de simplu și evident.

Utilizarea tipurilor de calendar date în MySQL

Să începem cu cel mai simplu tip - ANUL. Singurul său avantaj este o dimensiune mică - doar 1 octet. Dar, din acest motiv, există o limitare strictă a intervalului de valori permise (un tip poate stoca numai 255 valori diferite). Este greu de imaginat o situație în practică, în cazul în care s-ar putea dori să păstreze strict în intervalul de ani de la 1901 la 2155. În plus, smallint tip (2 octeți) oferă o gamă suficientă în cele mai multe situații pentru anul de stocare. Și pentru a salva un octet pe o linie în tabelul DB în zilele noastre nu are sens.

Datele DATE și DATETIME pot fi combinate într-un singur grup. Ele stochează o dată sau o dată și o oră cu o gamă largă de valori valide, independent de fusul orar setat pe server. Utilizarea acestora are cu siguranță o semnificație practică. Dar dacă doriți să stocați datele evenimentelor istorice care se întorc în timp pentru epoca noastră, va trebui să alegeți alte tipuri de date. Pentru a stoca datele anumitor evenimente care ar putea depăși intervalul tipului TIMESTAMP (zile de naștere, date despre lansarea produsului, alegerile prezidențiale, lansarea de rachete spațiale etc.), aceste tipuri sunt excelente. Când folosiți aceste tipuri, trebuie luată în considerare o nuanță importantă, dar mai multe despre aceasta mai jos.

Tipul TIME poate fi utilizat pentru a stoca o perioadă de timp când precizia este mai mică de 1 secundă, iar intervalele de timp sunt mai scurte de 829 ore. Adăugați aici nu mai există nimic.

A rămas cel mai interesant tip - TIMESTAMP. Considerați-o în comparație cu DATE și DATETIME: TIMESTAMP este, de asemenea, proiectat pentru a stoca data și / sau ora de origine a anumitor evenimente. O diferență importantă între ele în valori variază: este evident că TIMESTAMP nu este potrivit pentru stocarea evenimentelor istorice (chiar, cum ar fi zilele de naștere), dar este perfect pentru stocarea curent (exploatare forestieră, data a posta articole, adăugarea de produse, comandarea) și viitoare în previzibil evenimente viitoare (ieșiri de versiuni noi, calendare și planificatoare, etc.).

Principala utilizare a tipului TIMESTAMP este aceea că pentru coloanele de acest tip în tabele puteți seta valoarea implicită ca înlocuire a timpului curent, precum și pentru a seta ora curentă la actualizarea înregistrării. Dacă aveți nevoie de aceste caracteristici, atunci cu 99% probabilitate TIMESTAMP este exact ceea ce aveți nevoie. (Cum să faceți acest lucru, uitați-vă în manual.)

Nu vă fie teamă că, odată cu apropierea de anul 2038, software-ul dvs. nu va mai funcționa. În primul rând, până în acest moment, software-ul va cel mai probabil doar opri utilizarea (în special versiunile care sunt scrise acum). În al doilea rând, cu abordarea acestei date, dezvoltatorii de MySQL vor veni cu siguranță ceva pentru a păstra eficiența software-ului tău. Totul va fi rezolvat, precum și problema Y2K.

Deci, tipul TIMESTAMP este folosit pentru a stoca datele și orele evenimentelor din zilele noastre și DATETIME și DATE pentru a stoca datele și orele evenimentelor istorice sau evenimentelor din viitorul adânc.

Valorile de valori reprezintă o diferență importantă între TIMESTAMP, DATETIME și DATE, dar nu principala cauză. Principalul lucru este că TIMESTAMP stochează valoarea în UTC. Dacă salvați valoarea, acesta este transferat din fusul orar curent în UTC și când este citit - în fusul orar curent din UTC. DATETIME și DATE se stochează și se emite același timp, indiferent de fusul orar.

Fusurile orare sunt instalate în baza de date MySQL la nivel global sau pentru conexiunea curentă. Acestea din urmă pot fi utilizate pentru a susține activitatea diferiților utilizatori în diferite fusuri orare la nivelul DBMS. Toate valorile de timp vor fi stocate fizic în UTC, dar luate de la client și date clientului - în valorile fusului orar. Dar numai când utilizați tipul de date TIMESTAMP. DATE și DATETIME acceptă, stochează și returnează aceeași valoare.

Funcția NOW () și sinonimele sale returnează valoarea de timp în fusul orar curent al utilizatorului.

Utilizatorul X lucrează în zona UTC / GMT + 2, Y - în zona UTC / GMT + 3. Pentru conectarea utilizatorilor cu MySQL, este instalat un fus orar corespunzător (fiecare cu propriul său). Utilizatorul posta un mesaj pe forum, suntem interesati de data de scriere a mesajului.

Opțiunea 1: DATETIME. Utilizatorul X scrie un mesaj la ora 14:00 UTC / GMT + 2. Valoarea din câmpul "data" a mesajului este înlocuită ca rezultat al funcției NOW () - 14:00. Utilizatorul Y citește timpul de scriere a mesajului și vede același 14:00. Dar el are UTC / GMT + 3 în setări și crede că mesajul a fost scris nu doar asta, ci cu o oră în urmă.

Opțiunea 2: TIMESTAMP. Utilizatorul X scrie un mesaj la ora 14:00 UTC / GMT + 2. Câmpul "data" conține rezultatul funcției NOW () - în acest caz - 12:00 UTC / GMT + 0. UserY citește ora redactării mesajului și primește (UTC / GMT + 3) (12:00 UTC / GMT + 0) = 15:00 UTC / GMT + 3. Totul se dovedește exact așa cum vrem. Și principalul lucru este să folosiți acest lucru extrem de convenabil: pentru a susține zonele de timp ale utilizatorilor, nu este nevoie să scrieți niciun cod de reducere a timpului.

Posibilitatea de a înlocui ora curentă și să lucreze cu fusul orar în tipul TIMESTAMP este atât de puternic încât, dacă sunteți într-un fel de jurnal este necesar pentru a stoca data fără timp, este încă necesar să se utilizeze TIMESTAMP, în loc pe data de DATE, nu de economisire 1 diferență octet. În același timp, pur și simplu nu acordați atenție "00:00:00".

Articole similare