Vraag Moet ik datatype datetime of timestamp gebruiken in MySQL?


Zou je aanraden om een ​​te gebruiken? datum Tijd of a tijdstempel veld en waarom (met MySQL)?

Ik werk aan de serverkant met PHP.


2299
2018-01-03 16:14


oorsprong


antwoorden:


Tijdstempels in MySQL worden over het algemeen gebruikt om wijzigingen in records bij te houden, en worden vaak bijgewerkt elke keer dat de record wordt gewijzigd. Als u een specifieke waarde wilt opslaan, moet u een datetime-veld gebruiken.

Als u meent dat u wilt kiezen tussen het gebruik van een UNIX-tijdstempel of een eigen MySQL datetime-veld, ga dan met het oorspronkelijke formaat. Je kunt op die manier berekeningen binnen MySQL doen ("SELECT DATE_ADD(my_datetime, INTERVAL 1 DAY)") en het is eenvoudig om het formaat van de waarde naar een UNIX-tijdstempel te wijzigen ("SELECT UNIX_TIMESTAMP(my_datetime)") wanneer u het record bevraagt ​​als u er met PHP op wilt werken.


1555
2018-01-03 16:26



In MySQL 5 en hoger TIMESTAMP waarden worden geconverteerd van de huidige tijdzone naar UTC voor opslag en geconverteerd van UTC naar de huidige tijdzone voor ophalen. (Dit gebeurt alleen voor het gegevenstype TIMESTAMP, en niet voor andere typen, zoals DATETIME.)

Standaard is de huidige tijdzone voor elke verbinding de tijd van de server. De tijdzone kan per verbinding worden ingesteld, zoals beschreven in MySQL Server Time Zone-ondersteuning.


814
2018-03-02 11:49



Ik gebruik DATETIME-velden altijd voor iets anders dan rijmetagegevens (datum gemaakt of gewijzigd).

Als vermeld in de MySQL-documentatie:

Het DATETIME-type wordt gebruikt wanneer u waarden nodig hebt die zowel datum- als tijdinformatie bevatten. MySQL haalt DATETIME-waarden op en geeft deze weer in de indeling 'JJJJ-MM-DD UU: MM: SS'. Het ondersteunde bereik is '1000-01-01 00:00:00' tot '9999-12-31 23:59:59'.

...

Het gegevenstype TIMESTAMP heeft een bereik van 'UTC UTC 1970-01-01 00:00:01' en '2038-01-09 03:14:07'. Het heeft verschillende eigenschappen, afhankelijk van de MySQL-versie en de SQL-modus waarin de server draait.

Het is zeer waarschijnlijk dat je de laagste limiet op TIMESTAMPs in algemeen gebruik raakt - bijv. geboortedatum opslaan.


430
2018-01-04 04:26



De onderstaande voorbeelden laten zien hoe het TIMESTAMP datumtype veranderde de waarden na het veranderen van de time-zone to 'america/new_york' waar DATETIMEis ongewijzigd.

mysql> show variables like '%time_zone%';
+------------------+---------------------+
| Variable_name    | Value               |
+------------------+---------------------+
| system_time_zone | India Standard Time |
| time_zone        | Asia/Calcutta       |
+------------------+---------------------+

mysql> create table datedemo(
    -> mydatetime datetime,
    -> mytimestamp timestamp
    -> );

mysql> insert into datedemo values ((now()),(now()));

mysql> select * from datedemo;
+---------------------+---------------------+
| mydatetime          | mytimestamp         |
+---------------------+---------------------+
| 2011-08-21 14:11:09 | 2011-08-21 14:11:09 |
+---------------------+---------------------+

mysql> set time_zone="america/new_york";

mysql> select * from datedemo;
+---------------------+---------------------+
| mydatetime          | mytimestamp         |
+---------------------+---------------------+
| 2011-08-21 14:11:09 | 2011-08-21 04:41:09 |
+---------------------+---------------------+

Ik heb mijn antwoord omgezet in een artikel zodat meer mensen dit nuttig kunnen vinden, MySQL: Datetime versus datatype tijdstippen.


284
2017-08-21 08:45



Het belangrijkste verschil is dat DATETIME constant is terwijl TIMESTAMP wordt beïnvloed door de time_zone setting.

Het maakt dus alleen uit wanneer u in de tijdzones clusters hebt gesynchroniseerd of in de toekomst kunt hebben.

In eenvoudiger woorden: Als ik een database in Australië heb en een dump van die database neem om een ​​database in Amerika te synchroniseren / vullen, wordt de TIMESTAMP bijgewerkt om de werkelijke tijd van het evenement in de nieuwe tijdzone weer te geven, terwijl DATETIME nog steeds de tijd weerspiegelt van het evenement in de tijdzone van de au.

Een goed voorbeeld van DATETIME dat wordt gebruikt waar TIMESTAMP zou moeten zijn gebruikt, is op Facebook, waar hun servers nooit helemaal zeker weten hoe laat het is in de tijdzones. Eens had ik een gesprek waarin de tijd zei dat ik antwoordde op berichten voordat het bericht daadwerkelijk werd verzonden. (Dit kon natuurlijk ook veroorzaakt zijn door een slechte vertaling van de tijdzone in de berichtensoftware als de tijden werden gepost in plaats van gesynchroniseerd.)


169
2018-01-14 14:26



Ik neem deze beslissing op een semantische basis.

Ik gebruik een tijdstempel wanneer ik een (min of meer) vast punt in de tijd moet opnemen. Bijvoorbeeld wanneer een record werd ingevoegd in de database of wanneer een gebruikersactie plaatsvond.

Ik gebruik een datetime-veld wanneer de datum / tijd willekeurig kan worden ingesteld en gewijzigd. Als een gebruiker bijvoorbeeld later kan opslaan, kan hij zijn afspraken wijzigen.


109
2018-01-03 17:11



TIMESTAMP is 4 bytes versus 8 bytes voor DATETIME.

http://dev.mysql.com/doc/refman/5.0/en/storage-requirements.html

Maar zoals scronide zei dat het een ondergrens van het jaar 1970 heeft. Het is echter geweldig voor alles wat er in de toekomst zou kunnen gebeuren;)


86
2018-01-04 09:00



  1. TIMESTAMP is vier bytes versus acht bytes voor DATETIME.

  2. Tijdstempels zijn ook lichter in de database en sneller geïndexeerd.

  3. Het DATETIME-type wordt gebruikt wanneer u waarden nodig hebt die zowel datum- als tijdinformatie bevatten. MySQL haalt DATETIME-waarden op en geeft deze weer in de indeling 'JJJJ-MM-DD UU: MM: SS'. Het ondersteunde bereik is '1000-01-01 00:00:00' tot '9999-12-31 23:59:59'.

Het gegevenstype TIMESTAMP heeft een bereik van 'UTC UTC 1970-01-01 00:00:01' en '2038-01-09 03:14:07'. Het heeft verschillende eigenschappen, afhankelijk van de MySQL-versie en de SQL-modus waarin de server draait.

  1. DATETIME is constant terwijl TIMESTAMP wordt uitgevoerd door de time_zone-instelling.

80
2017-12-21 11:12



Ik raad aan om te gebruiken geen van beide een DATETIME- of een TIMESTAMP-veld. Als je een specifieke dag als geheel wilt weergeven (zoals een verjaardag), gebruik dan een DATE-type, maar als je specifieker bent, ben je waarschijnlijk geïnteresseerd in het opnemen van een echt moment in plaats van een eenheid van tijd (dag, week, maand, jaar). Gebruik in plaats van DATETIME of TIMESTAMP een BIGINT en sla eenvoudig het aantal milliseconden op sinds de epoch (System.currentTimeMillis () als u Java gebruikt). Dit heeft verschillende voordelen:

  1. U voorkomt vendor lock-in. Vrijwel elke database ondersteunt gehele getallen op relatief vergelijkbare wijze. Stel dat u naar een andere database wilt gaan. Wilt u zich zorgen maken over de verschillen tussen de DATETIME-waarden van MySQL en hoe Oracle deze definieert? Zelfs onder verschillende versies van MySQL heeft TIMESTAMPS een ander nauwkeurigheidsniveau. Het was pas onlangs dat MySQL milliseconden in de tijdstempels ondersteunde.
  2. Geen tijdzone-problemen. Er zijn hier enkele inzichtelijke opmerkingen over wat er gebeurt met tijdzones met de verschillende gegevenstypen. Maar is deze algemene kennis, en zullen uw collega's er de tijd voor nemen om het te leren? Aan de andere kant is het behoorlijk moeilijk om het veranderen van een BigINT in een java.util.Date te verknoeien. Het gebruik van een BIGINT zorgt ervoor dat veel problemen met tijdzones buiten de boot vallen.
  3. Geen zorgen over bereiken of nauwkeurigheid. U hoeft zich geen zorgen te maken over wat er wordt afgekapt door toekomstige datumbereiken (TIMESTAMP gaat pas naar 2038).
  4. Tool integratie van derden. Als u een geheel getal gebruikt, is het triviaal voor hulpprogramma's van derden (zoals EclipseLink) om te koppelen met de database. Niet elke externe tool zal hetzelfde begrip van een "datetime" hebben als MySQL. Wilt u in Hibernate proberen uit te zoeken of u een java.sql.TimeStamp- of java.util.Date-object moet gebruiken als u deze aangepaste gegevenstypen gebruikt? Door gebruik te maken van uw basistypen, is het gebruik van de tools van derden triviaal.

Dit probleem hangt nauw samen met hoe u een geldwaarde (d.w.z. $ 1,99) in een database moet opslaan. Moet u een decimaal gebruiken, of het geldtype van de database, of het ergste van alles een dubbele? Alle 3 van deze opties zijn verschrikkelijk, om veel van dezelfde redenen die hierboven worden genoemd. De oplossing is om de waarde van geld op te slaan in centen met behulp van BIGINT en vervolgens centen om te zetten in dollars wanneer u de waarde voor de gebruiker weergeeft. De taak van de database is om gegevens op te slaan, en NIET om die gegevens te interpreteren. Al deze fraaie gegevenstypen die u in databases (vooral Oracle) ziet, voegen er weinig toe en helpen u bij het vergrendelen van de leverancier.


74
2018-06-11 23:02