Ar turėčiau naudoti „MySQL“ datetime arba timestamp duomenų tipą?

Ar rekomenduotumėte naudoti datetime arba timestamp ir kodėl (naudodami MySQL)?

Dirbu su php serverio pusėje.

2422
03 янв. nustatė karlipoppins 03 Jan 2009-01-03 19:14 '09, 19:14 PM 2009-01-03 19:14
@ 35 atsakymai
  • 1
  • 2

„MySQL“ laiko žymos dažniausiai naudojamos įrašų pakeitimams stebėti ir dažnai atnaujinami kiekvieną kartą keičiant įrašą. Jei norite išsaugoti tam tikrą vertę, turite naudoti datetime lauką.

Jei norėjote pasirinkti tarp UNIX laiko žymos arba „MySQL“ datos ir laiko lauko, eikite į savo formatą. Tokiu būdu galite atlikti skaičiavimus „MySQL“ ("SELECT DATE_ADD(my_datetime, INTERVAL 1 DAY)") ir tiesiog pakeisti vertės formatą į UNIX laiko žymę ("SELECT UNIX_TIMESTAMP(my_datetime)") kai prašote įrašo, jei norite dirbti su juo naudojant PHP.

1642
03 янв. atsakymas pateikiamas blivet Jan 03 2009-01-03 19:26 '09, 19:26, 2009-01-03 19:26

„MySQL“ 5 ir naujesnėse versijose TIMESTAMP reikšmės konvertuojamos iš dabartinės laiko juostos į UTC saugojimui ir konvertuojamos iš UTC į dabartinę laiko išskyrimo zoną. (Tai įvyksta tik TIMESTAMP duomenų tipui, o ne kitiems tipams, pvz., DATETIME.)

border=0

Pagal numatytuosius nustatymus dabartinė laiko juosta kiekvienam ryšiui yra serverio laikas. Laiko juostą galima nustatyti kiekvienam ryšiui, kaip aprašyta MySQL serverio laiko juostos palaikyme .

844
02 марта '09 в 14:49 2009-03-02 14:49 atsakymas pateikiamas Niras kovo 02 d. 09, 14:49 2009-03-02 14:49

Visada naudoju DATETIME laukus, išskyrus metaduomenis, skirtus eilutėms (data sukuriama arba keičiama).

Kaip minėta MySQL dokumentuose:

DATETIME tipas naudojamas, kai jums reikia vertybių, kuriose yra informacijos apie datą ir laiką. „MySQL“ išrašo ir rodo DATETIME reikšmes formatu „YYYY-MM-DD HH: MM: SS“. Palaikomas diapazonas yra "1000-01-01 00:00:00" iki "9999-12-31 23:59:59".

...

Duomenų tipas TIMESTAMP turi „1970-01-01 00:00:01“ UTC intervalą iki „2038-01-09 03:14:07“ UTC. Jis turi skirtingas savybes, priklausomai nuo MySQL versijos ir SQL režimo, kuriame serveris veikia.

Jūs greičiausiai pateksite į apatinę ribą, taikomą bendrai naudojamiems TIMESTAMPs, pvz. gimimo data.

457
04 янв. atsakymas pateikiamas scronide 04 jan. 2009-01-04 07:26 '09 at 7:26 AM 2009-01-04 07:26

Toliau pateikiami pavyzdžiai, kaip datos tipas TIMESTAMP pakeitė reikšmes po time-zone to 'america/new_york' , kur DATETIME nepasikeitė.

 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 | +---------------------+---------------------+ 

Atsakiau į savo straipsnį, kad daugiau žmonių galėtų rasti šį naudingą „ MySQL“: „Datetime Versus Timestamp Data Types“ .

295
21 авг. atsakymas duotas mr_eclair 21 rug . 2011-08-21 11:45 '11, 11:45, 2011-08-21 11:45

Pagrindinis skirtumas yra tas, kad DATETIME yra pastovus, o TIMESTAMP priklauso nuo time_zone parametro.

Taigi tai svarbu tik tada, kai turite - arba gali būti ateityje; sinchronizuoti grupes laiko zonose.

Paprastesniais žodžiais: Jei turiu duomenų bazę Australijoje ir iškraunsiu šią duomenų bazę, kad būtų galima sinchronizuoti / užpildyti duomenų bazę Amerikoje, TIMESTAMP bus atnaujintas, kad būtų rodomas tikrasis įvykio laikas naujoje laiko juostoje, o DATETIME bus vis dar atspindi laiko zonoje įvykio laiką .

Puikus DATETIME pavyzdys, kai TIMESTAMP turėjo būti naudojamas, yra „Facebook“, kur jų serveriai niekada negali būti tikri dėl to, kas vyko laiko juostose. Kai aš turėjau pokalbį, kurio metu sakiau, kad prieš pranešimo siuntimą atsakiau į pranešimus. (Žinoma, tai taip pat galėjo sukelti netinkamas laiko juostos vertimas pranešimų programinėje įrangoje, jei laikas buvo išsiųstas, ne sinchronizuotas.)

179
14 янв. atsakymą pateikė ekerner sausio 14 d. 2010-01-14 17:26 '10, 17:26, 2010-01-14 17:26

Šį sprendimą priimau semantiniu pagrindu.

Aš naudoju laiko žymą, kai reikia įrašyti (daugiau ar mažiau) fiksuotą laiką. Pavyzdžiui, kai į duomenų bazę buvo įrašytas įrašas arba įvyko tam tikras naudotojo veiksmas.

Naudoju datetime lauką, kai datą / laiką galima nustatyti ir keisti savavališkai. Pavyzdžiui, kai vartotojas gali išsaugoti vėlesnius paskyrimo pakeitimus.

114
03 янв. atsakymas pateikiamas unbeknown Jan 03 2009-01-03 20:11 '09 ne 20:11 2009-01-03 20:11

TIMESTAMP - 4 baitai su 8 baitais DATETIME.

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

Bet, kaip sakė Scronidas, jis turi 1970 m. Tai puikiai tinka viskas, kas gali atsitikti ateityje;)

90
04 янв. atsakymas pateikiamas Alex 04 jan. 2009-01-04 12:00 '09 12:00 val. 2009-01-04 12:00

Rekomenduojame naudoti nei lauką DATETIME, nei lauką TIMESTAMP. Jei norite atstovauti tam tikrą dieną (pvz., Gimtadienį), naudokite DATE tipą, bet jei esate konkretesnis, galbūt norėsite įrašyti faktinį laiką, o ne matavimo vienetą. laikas (diena, savaitė, mėnuo, metai). Vietoj DATETIME arba TIMESTAMP, naudokite BIGINT ir tiesiog išsaugokite milisekundžių skaičių nuo eros pradžios (System.currentTimeMillis (), jei naudojate „Java“). Tai turi keletą privalumų:

  1. Venkite tiekėjo blokavimo. Beveik kiekviena duomenų bazė palaiko sveikus skaičius palyginti panašiai. Tarkime, kad norite eiti į kitą duomenų bazę. Ar norite nerimauti dėl skirtumų tarp „MySQL DATETIME“ vertybių ir kaip Oracle juos apibrėžia? Net tarp skirtingų „MySQL“ versijų TIMESTAMPS turi skirtingą tikslumo lygį. Tik neseniai MySQL palaikė milisekundes laiko žyma.
  2. Nėra laiko juostos problemų. Yra keletas įžvalgų komentarų apie tai, kas atsitinka su laiko juostomis su įvairių tipų duomenimis. Bet ar tai yra bendros žinios ir ar visi jūsų kolegos praleidžia laiko studijuoti? Kita vertus, gana sunku supainioti, paverčiant BigINT į java.util.Date. BIGINT naudojimas sukelia daug laiko su laiko juostomis patekti į foną.
  3. Nesijaudinkite dėl intervalų ar tikslumo. Jums nereikės nerimauti dėl to, kas bus nutraukta ateities datų intervalais (TIMESTAMP bus prieinama tik 2038 m.).
  4. Trečiųjų šalių įrankių integravimas. Viso skaičiaus naudojimas supaprastina trečiųjų šalių įrankių (pvz., „EclipseLink“) ir duomenų bazės sąveiką. Ne kiekvienas trečiosios šalies įrankis turės tą patį „datetime“ supratimą kaip „MySQL“. Norite pabandyti ir išsiaiškinti Hibernate, ar turėtumėte naudoti java.sql.TimeStamp objektą arba java.util.Date, jei naudojate šiuos pasirinktinius duomenų tipus? Naudojant pagrindinius duomenų tipus, trivialus naudojimasis trečiosios šalies įrankiais.

Ši problema yra glaudžiai susijusi su tuo, kaip turėtumėte saugoti pinigų vertę (pvz., 1,99 $) į duomenų bazę. Ar turėčiau naudoti dešimtainę ar pinigų tipo duomenų bazę arba, blogiausia, dvigubą? Visos trys parinktys yra baisios daugeliu minėtų priežasčių. Sprendimas yra išsaugoti pinigų vertę centais naudojant BIGINT ir tada konvertuoti centus į dolerius, kai rodoma vertė vartotojui. Duomenų bazės užduotis - saugoti duomenis ir NE interpretuoti šiuos duomenis. Visi šie keistai duomenų tipai, kuriuos matote duomenų bazėse (ypač „Oracle“), prideda mažai, ir jūs pradedate sekti kelią, kaip patekti į tiekėjus.

87
12 июня '14 в 2:02 2014-06-12 02:02 atsakymą pateikė vartotojo64141 birželio 12 d., 14 val. 2:02 2014-06-12 02:02
  • TIMESTAMP yra keturi baitai, palyginti su aštuoniais baitais DATETIME.

  • Laikraščiai taip pat yra lengvesni duomenų bazėje ir greičiau indeksuojami.

  • DATETIME tipas naudojamas, kai jums reikia vertybių, kuriose yra informacijos apie datą ir laiką. „MySQL“ išrašo ir rodo DATETIME reikšmes formatu „YYYY-MM-DD HH: MM: SS“. Palaikomas diapazonas yra nuo 1000-01-01 00:00:00 iki 9999-12-31 23:59:59 '.

Duomenų tipas TIMESTAMP turi nuo 1970-01-01 00:00:01 UTC iki 2038-01-09 03:14:07 „UTC“. Jis turi skirtingas savybes, priklausomai nuo MySQL versijos ir SQL režimo, kuriame serveris veikia.

  1. DATETIME yra pastovus, o TIMESTAMP nustatomas nustatant time_zone.
86
21 дек. Atsakymas suteikiamas Vivek S 21 d. 2013-12-21 14:12 '13, 14:12, 2013-12-21 14:12

Priklauso nuo programos, tikrai.

Apsvarstykite galimybę nustatyti laiko žymę naudotojui Niujorko serveryje, kuris bus priskirtas Sangha. Dabar, kai vartotojas prisijungia prie „Sangha“, jis pasiekia tą pačią paskirties laiko žymę iš Tokijo veidrodžio serverio. Jis pamatys paskyrimą Tokijo laiku, kurį kompensuos originalus Niujorko laikas.

Taigi, vertės, kurios atspindi vartotojo laiką, pvz., Paskyrimą ar tvarkaraštį, datetime yra geresnis. Tai leidžia vartotojui kontroliuoti tikslią datą ir laiką, nepriklausomai nuo serverio nustatymų. Nustatytas laikas yra nustatytas laikas, nepriklausomai nuo serverio laiko juostos, vartotojo laiko juostos arba vasaros laiko skaičiavimo metodo pakeitimo (taip, tai tiesa).

Kita vertus, sisteminio laiko, pvz., Mokėjimo operacijų, lentelės pakeitimų ar žurnalistų, reikšmėms visada naudokite laiko antspaudus. Sistema nebus paveikta perkeliant serverį į kitą laiko juostą arba lyginant skirtingų laiko juostų serverius.

Laikraščiai taip pat yra lengvesni duomenų bazėje ir greičiau indeksuojami.

40
27 окт. atsakymas ianaré spalio 27 d 2010-10-27 00:07 '10, 00:07 2010-10-27 00:07

2016 +: patariu nustatyti MySQL laiko juostą UTC ir naudoti DATETIME:

Bet kokia naujausia sąsajos aplinka (kampinis 1/2, atsakingas, Vue, ...) gali lengvai ir automatiškai konvertuoti UTC datą ir laiką iki vietos laiko.

Neprivaloma:

(Jei tikriausiai nekeičiate savo serverių laiko juostos)


AngularJs pavyzdys

 // back-end: format for angular within the sql query SELECT DATE_FORMAT(my_datetime, "%Y-%m-%dT%TZ")... // font-end Output the localised time {{item.my_datetime | date :'medium' }} 

Visas lokalizuotas laiko formatas pateikiamas čia: https://docs.angularjs.org/api/ng/filter/date

36
18 февр. Atsakymą pateikė Sebastien Horin , vasario 18 d. 2016-02-18 01:36 '16 at 1:36 2016-02-18 01:36
Laukas

timestamp yra ypatingas datetime lauko atvejis. Galite sukurti timestamp stulpelius, kad galėtumėte turėti specialių savybių; Jis gali būti sukonfigūruotas atnaujinti save kuriant ir (arba) atnaujinant.

Kalbant apie dideles duomenų bazes, timestamp yra keletas specialių atvejų.

Kas yra teisinga, priklauso tik nuo to, ką norite daryti.

32
03 янв. Jeff Warnica atsakymas, pateiktas sausio 03 d 2009-01-03 19:21 '09, 19:21, 2009-01-03 19:21

TIMESTAMP visada yra UTC (ty praėjusios sekundės nuo 1970-01-01, UTC), o MySQL serveris automatiškai konvertuoja jį į datos / laiko serverio laiko juostai. Ilgainiui TIMESTAMP yra būdas eiti, nes žinote, kad jūsų laiko duomenys visada bus UTC. Pvz., Neįrašysite datų, jei persijungsite į kitą serverį arba pakeisite laiko juostos nustatymus savo serveryje.

27
26 авг. Atsakymą pateikė Sobesas rugpjūčio 26 d. 2010-08-26 02:21 '10, 02:21 am 2010-08-26 02:21

DATETIME, TIMESTAMP ir DATE palyginimas

2019

11 авг. atsakymas duotas jdc91 11 rug . 2017-08-11 12:53 '17 at 12:53 2017-08-11 12:53

Verta pažymėti, kad kurdami lentelės stulpelius, MySQL galite naudoti kažką žemiau esančiose eilutėse:

 on update CURRENT_TIMESTAMP 

Tai atnaujins laiką kiekvienu atveju, kurį pakeisite eilutę, ir kartais labai naudinga išsaugant naujausią redagavimo informaciją. Tai veikia tik su laiko žyma, bet ne su datetime.

21
07 янв. Atsakymas, kurį pateikė leejmurphy 07 Jan 2012-01-07 02:04 '12 at 2:04 2012-01-07 02:04

Dirbdamas su „MySQL“ ir „PHP“, visada naudoju „Unix“ laiko žymę. Pagrindinė šios priežasties priežastis yra numatytasis datos metodas PHP, naudojant laiko žymę kaip parametrą, todėl nereikia analizuoti.

Norėdami gauti dabartinį „Unix“ laiko žymą PHP, tiesiog time();
ir MySQL atlikite SELECT UNIX_TIMESTAMP(); .

20
03 янв. Mark Davidson atsakymas, pateiktas sausio 03 d 2009-01-03 19:18 '09, 19:18, 2009-01-03 19:18

Remdamiesi savo patirtimi, jei jums reikia datos lauko, kuriame įterpimas įvyksta tik vieną kartą, ir nenorite atnaujinti ar atlikti jokių kitų veiksmų šioje konkrečioje srityje, eikite į datą .

Pvz., user lentelę galite rasti lauke REGISTRACIJOS DATA . Šioje user lentelėje, jei norite sužinoti paskutinio konkretaus vartotojo prisijungimo laiką, nurodykite laiko žymos lauką, kad jis būtų atnaujintas.

Jei sukuriate lentelę iš phpMyAdmin, numatytasis nustatymas atnaujins laiko žymos lauką, kai eilutė bus atnaujinta. Jei jūsų laiko žyma neatnaujinama su eilutės atnaujinimu, galite naudoti šį užklausą automatiškai atnaujinti laiko žymos lauką.

 ALTER TABLE your_table MODIFY COLUMN ts_activity TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP; 
14
06 февр. Atsakymą pateikė Kannan Prasad 06 vasaris. 2012-02-06 06:34 '12 at 6:34 am 2012-02-06 06:34

Laiko žymos duomenų tipas saugo datą ir laiką, tačiau UTC formatu, o ne dabartinės laiko juostos formatu kaip datetime. Kai pasirinksite duomenis, laiko žyma vėl konvertuoja jį į dabartinę laiko juostos laiką.

Tarkime, kad esate Jungtinėse Amerikos Valstijose ir gaunate duomenis iš serverio, turinčio JAV laiko juostą. Tada gausite datą ir laiką pagal JAV laiko juostą. Laiko žymos duomenų stulpelis visada atnaujinamas automatiškai, kai jo eilutė atnaujinama. Taigi gali būti naudinga stebėti, kada paskutinė atnaujinta eilutė.

Norėdami gauti daugiau informacijos, galite perskaityti dienoraštį Timestamp Vs Datetime .

13
20 дек. atsakymą pateikė Arvindas 20 d. 2012-12-20 11:48 '12 11:48 2012-12-20 11:48

Saugokitės laiko žymos keitimo, kai vykdote UPDATE pareiškimą lentelėje. Jei turite lentelę su stulpeliais „Vardas“ (varchar), „Amžius“ (int) ir „Data_Added“ (laiko žymė), ir vykdote toliau nurodytą DML pareiškimą

 UPDATE table SET age = 30 

tada kiekviena stulpelio „Data_Added“ reikšmė bus pakeista į dabartinį laiko žymą.

12
04 окт. atsakymą pateikė Lloyd Banks 04 okt. 2013-10-04 09:00 '13, 9:00, 2013-10-04 09:00

Nuoroda iš šio straipsnio:

Pagrindiniai skirtumai:

TIMESTAMP naudojamas sekti įrašų ir atnaujinimų pakeitimus kiekvieną kartą, kai keičiamas įrašas. „DATETIME“ naudojama tam, kad būtų išsaugota specifinė ir statinė vertė, kuriai įtakos neturi įrašų pakeitimai.

TIMESTAMP taip pat priklauso nuo nustatymo, susijusio su TIME ZONE. DATETIME yra nuolatinis.

TIMESTAMP viduje konvertuoja dabartinę laiko juostą į saugyklą UTC, o paieškos metu ji konvertuojama atgal į dabartinę laiko juostą. DATETIME to negali padaryti.

Palaikomas diapazonas TIMESTAMP: '1970-01-01 00:00:01' UTC iki '2038-01-19 03:14:07' UTC palaikomas diapazonas DATETIME: '1000-01-01 00:00:00' iki '9999 -12-31 23:59:59 '

12
07 февр. Atsakymą pateikė Anvesh 07 vasaris. 2016-02-07 15:49 '16 at 15:49 2016-02-07 15:49

Visada naudoju „Unix“ laiko žymą, kad palaikytume sąžiningumą, kai susiduriame su daugybe informacijos apie laiką ir laiką, ypač taisant laiko juostas, pridedant / atimant datas ir pan. Lyginant laiko žymes, tai pašalina sudėtingus laiko juostos veiksnius ir leidžia taupyti išteklius serverio pusėje apdorojant (ar tai būtų programos kodas ar duomenų bazės užklausos), nes naudojate lengvą aritmetinį, o ne pridedant sunkų datos laiką / atimties funkcija.

Dar reikia apsvarstyti:

Jei kuriate programą, niekada nežinote, kaip jūsų duomenys gali būti naudojami žemyn. Jei turite, pavyzdžiui, palyginti duomenų rinkinio įrašų rinkinį, pvz., Elementų iš trečiosios šalies API krūva, ir, sakykime, įdėti juos chronologine tvarka, jums bus malonu turėti Unix laiko žymes jūsų styginiams. Net jei nuspręsite naudoti „MySQL“ laiko žymes, išsaugokite „Unix“ laiko žymą kaip draudimą.

12
05 янв. Atsakymą pateikė Oliver Holmberg 05 Jan 2012-01-05 05:50 '12 at 5:50 2012-01-05 05:50

Mano atveju, nustatiau UTC kaip laiko juostą viskas: sistema, duomenų bazės serveris ir kt. kiekvieną kartą, kai galiu. Jei mano klientui reikia kitos laiko juostos, ją sukonfigūruosiu programoje.

Beveik visada norėčiau pasirinkti laiko žymes, o ne datetime laukus, nes laiko žymos netiesiogiai apima laiko juostą. Taigi nuo to momento, kai programa yra prieinama vartotojams iš skirtingų laiko zonų, ir norite, kad jie matytų datą ir laiką savo vietinėje laiko juostoje, šio tipo laukas daro jį gana paprastą, nei jei duomenys būtų saugomi duomenų laukuose .

Kaip pliusas, jei duomenų bazė buvo perkelta į kitą laiko juostą turinčią sistemą, pasijutau labiau pasitikėjusi naudojant laiko antspaudus. Jūs negalite kalbėti apie galimas problemas, apskaičiuojant skirtumus tarp dviejų taškų, keičiant laukimo laiką tarp jų ir būtinybę nustatyti 1 ar mažiau valandų tikslumą.

Taigi apibendrinant vertinu šiuos laiko žymos privalumus:

  • pasirengusi naudoti tarptautinėse (kelių valandų) programose
  • lengva migracija tarp laiko juostų
  • gana paprasta apskaičiuoti skirtumus (tiesiog atimkite abu laiko žymes)
  • Nesijaudinkite datos iki vasaros laikotarpio.

Dėl visų šių priežasčių, jei įmanoma, pasirenku UTC ir laiko žymos laukus. Ir vengiu galvos skausmo;)

11
24 февр. atsakymas pateikiamas rogerpro 24 vasaris 2017-02-24 21:19 '17 - 21:19 2017-02-24 21:19

Radau neprilygstamą įrankį TIMESTAMP gebėjime automatiškai atnaujinti, remiantis dabartiniu laiku, nenaudojant nereikalingų paleidiklių. Tai tik aš, nors TIMESTAMP yra UTC, kaip buvo pasakyta.

Jis gali sekti skirtingas laiko juostas, todėl, jei reikia rodyti santykinį laiką, pvz., UTC laikas yra tai, ką norėtumėte.

10
01 нояб. Atsakymą pateikė Marc DiMillo 01 lapkričio. 2011-11-01 22:42 '11 prie 10:42 pm 2011-11-01 22:42

Kitas skirtumas tarp laiko žymos ir duomenų laiko laiko žyma, negalite naudoti NULL numatytosios vertės.

10
19 янв. atsakymą pateikė Ecleel Jan 19 2014-01-19 14:06 '14, 14:06, 2014-01-19 14:06