Datetime vs. Datownik w MySQL i PHP w praktyce?


24

Nie jestem pewien, jak określić mój typ danych jako datę i datę lub czas, myślę, że będę potrzebował obu z nich, ale na różnych wydarzeniach. Moja strona internetowa sprzedaje produkty i usługi na całym świecie, a także posiada system kont umożliwiający zalogowanie się. Proszę wyjaśnić następujące kwestie:

  • Bieżąca data i godzina, kiedy klient kupuje produkty z mojej witryny: Datetime?
  • Data i godzina dostawy na podstawie ich lokalizacji oraz daty / godziny zakupu, obliczona z naszego systemu: Datetime?
  • Ostatnim razem, gdy logowali się na swoje konto: Znacznik czasu?

    1. Jaki jest kod w php do przechowywania daty zakupu (bieżąca data), a następnie przechowywania w bazie danych?
    2. Proszę wyjaśnić, jak korzystać z każdego z nich, ponieważ po przeczytaniu wielu wyjaśnień w Internecie wciąż nie rozumiem tego.

Jakiś czas temu miałem duży projekt, w którym wydajność była absolutną koniecznością, po miesiącach badań skończyliśmy z datownikiem UTC przechowywanym w polu varchar, okazało się, że jest on szybszy i lepszy dla naszych potrzeb (duża sieć społecznościowa)
— JasonDavis

Odpowiedzi:


29

Znaczniki czasu MySQL :

  • Są przechowywane w UTC

    Są one konwertowane na UTC podczas przechowywania i konwertowane z powrotem do Twojej strefy czasowej podczas wyszukiwania. W przypadku zmiany ustawień strefy czasowej zmieniają się również pobrane wartości.

  • Może być automatycznie inicjowany i aktualizowany

    Możesz ustawić ich wartość domyślną i / lub wartość automatycznej aktualizacji na CURRENT_TIMESTAMP

  • Mieć zasięg 1970-01-01 00:00:01 UTCdo2038-01-19 03:14:07 UTC

Podczas gdy MySQL datetime :

  • Przechowujesz to, co dostajesz ™.

  • Mieć zasięg 1000-01-01 00:00:00do9999-12-31 23:59:59

    Wartości spoza zakresu mogą działać - ale gwarantowane są tylko wartości z tego zakresu .

  • Możesz przechowywać daty, w których dzień lub miesiąc wynosi zero.

    To jest sposób MySQL do przechowywania urodzin! Nie możesz tego zrobić za pomocą TIMESTAMP, z jedynym wyjątkiem jest wartość zerowa 0000-00-00.

  • W razie potrzeby możesz przechowywać nieprawidłowe daty w trybie ALLOW_INVALID_DATES .

  • W NOW()niektórych przypadkach można ustawić wartość domyślną , ale preferowanym i bardziej naturalnym sposobem automatycznego inicjowania i aktualizacji dat jest TIMESTAMP.

I oczywiście są też DATEi TIME, które działają tak samo DATETIME, ale oczywiście DATEnie zależy na czasie i TIMEnie zależy na randce. Wszystkie cztery typy danych działają doskonale z szeroką gamą funkcji daty i godziny , ale podczas mieszania typów danych należy pamiętać o efektach konwersji .

Teraz na twoje pytanie: powinieneś używać DATETIMEwszędzie. Nie ze względów technicznych, ale ponieważ nadal nie wiesz, jak działa MySQL, DATETIMEjest to prostszy wybór. Oznacza to, że przed zapisaniem będziesz musiał obliczyć bieżący znacznik czasu w PHP, co jest tak proste jak:

$mysqldate = date("Y-m-d H:i:s"); 

Funkcja daty w PHP działa jak:

string date ( string $format [, int $timestamp = time() ] )

Ten "Y-m-d H:i:s"format jest zgodny z MySQL, a pozostawiając drugi parametr pusty, date()wywołuje, time()aby uzyskać bieżący znacznik czasu UNIX .

Używanie TIMESTAMPzamiast zamiast DATETIMEma wartość dodaną MySQL przejmującą odpowiedzialność za decyzję o bieżącym znaczniku czasu, i możesz pominąć pole podczas wstawiania / aktualizacji. Ale ponieważ już wysyłasz zapytanie, a kod, aby uzyskać aktualny znacznik czasu w PHP, jest minimalny, możesz bezpiecznie przejść DATETIMEdo wszystkiego.

Jeśli chodzi o rzeczywisty kod do przechowywania znacznika czasu PHP w bazie danych, powinieneś spojrzeć na PHP Data Objects , a jeśli nadal nie jesteś pewien, zapytaj zamiast tego StackOverflow . Ale jest już prawie 1,5 tys. Pytań powiązanych , upewnij się, że je przejrzałeś przed zadaniem . Tylko wskazówka, przygotowane wypowiedzi to, jak robią to fajne dzieciaki.


Hmm, to może być problem ze sposobem wysłania zapytania do MySQL lub w strukturze tabeli ... StackOverflow jest lepszym miejscem dla tego rodzaju problemów, opublikuj tam pytanie ze strukturą tabeli i pełnym kodem php, i kilka szczegółów na temat problemu i tego, co już próbowałeś. Naprawdę nie rozmawiamy tutaj o szczegółach implementacji ...
— yannis

Dzięki za odpowiedź. Próbowałem użyć $ mysqldate = date („Ymd H: i: s”); $ query = INSERT INTO table VALUE ('". $ mysqldate."') na moim kodzie php, ale byłby przechowywany w MySQL jako 0000-00-00 00:00:00 w polu Data (pole) - Datetime (typ danych). Zamierzam zapisać aktualną datę i godzinę. Jeśli ustawię typ danych jako znacznik czasu w bazie danych, jak kodować w PHP?
— Modułowy

W tej chwili nie mogę publikować żadnych komentarzy na temat Stackoverflow. Brzmi trochę wstyd, ale tak mi zrobili.
— Modułowy

Przykro mi z tego powodu, ale jeśli jesteś w trybie tymczasowego zawieszenia, musi być dobry powód. Teraz jednym z możliwych błędów w kodzie w komentarzu jest to, że nazywamy to pole Date, ponieważ jest to słowo zastrzeżone dla DATEtypu danych i mogą się zdarzyć dziwne rzeczy (w zależności od wersji MySQL), więc spróbuj zmienić jego nazwę na coś podobnego creationdatei zobacz, co się stanie . Ponadto, z PHP powinieneś traktować TIMESTAMPpola tak samo jak DATETIMEpola, to nie ma większego znaczenia. Ich format jest taki sam.
— yannis

Stukrotne dzięki. Zostało to uporządkowane teraz, po prawie całej nocy, próbując dowiedzieć się, dlaczego. :)
— Modułowy

2

Odniesienie zaczerpnięte z tego artykułu:

Główne różnice:

TIMESTAMP służy do śledzenia zmian w rekordach i aktualizuje się za każdym razem, gdy rekord jest zmieniany. DATETIME służy do przechowywania określonej i statycznej wartości, na którą nie mają wpływu żadne zmiany w rekordach.

TIMESTAMP ma również wpływ na inne ustawienia związane ze STREFA CZASU. DATETIME jest stały.

TIMESTAMP wewnętrznie przekonwertował bieżącą strefę czasową na UTC w celu przechowywania, a podczas wyszukiwania konwertował z powrotem do bieżącej strefy czasowej. DATETIME nie może tego zrobić.

Obsługiwany zakres TIMESTAMP: „1970-01-01 00:00:01 ′ UTC do '2038-01-19 03:14:07 ′ Obsługiwany zakres UTC DATETIME:„ 1000-01-01 00:00:00 ′ do' 9999 -12-31 23:59:59 ′


1
Więc w 2040 roku, czego byś użył do zmian w rekordach, Datownik? Nie sądzę.
— Bsienn

-1

Cóż, patrzę na to w bardzo prosty sposób. W twoim przypadku chciałbym używać zarówno datetimei timestamp. Korzystając z obu, nie będziesz mieć żadnych dodatkowych problemów z przechowywaniem danych lub coś w tym rodzaju. Jedno dodatkowe pole (kolumna) w tabeli również nie stanowi dużego problemu.

Więc z mojego punktu widzenia i dotychczasowych doświadczeń zwykle używam obu. Jeśli chcesz pokazać datę odwiedzającemu lub uczynić ją zrozumiałą dla odwiedzających, wyświetl datę w formacie daty i godziny.

Format daty i godziny może być uciążliwy, gdy chcesz coś obliczyć (różnica między 2 datami, uzyskaj wczorajszą datę od bieżącej daty, uzyskaj 1 tydzień temu od bieżącej daty, uzyskaj jutrzejszą datę lub coś takiego.) To nie jest naprawdę trudne, ale zwykle trzeba je przekonwertować, timestampa następnie zrobić rzeczy. I tak, bieżąca data i godzina, na przykład, otrzymujesz: $current = date("Y-m-d");lub $current = date("Y-m-d H:i:s");jeśli chcesz także godzin, minut i sekund.

Znacznik czasu ma tylko 11 cyfr, co tak naprawdę „nie znaczy” niczego. Kiedy na to spojrzysz, nie będziesz wiedział, którą datę to reprezentuje. Nie jest więc przyjazny dla użytkownika i nie można go użyć do odtworzenia go na przykład i pokazania go użytkownikom. Będziesz musiał „przekształcić” go w coś czytelnego. Ale oferuje również możliwość łatwej konwersji i obliczania różnych dat. Na przykład, jeśli chcesz uzyskać znacznik czasu na jutro w tym samym czasie, po prostu dodajesz liczbę sekund do bieżącej daty i masz znacznik czasu na jutro. Przykład: $tomorrow = time()+24*3600;Możesz również łatwo uzyskać różnicę między dwiema datami w ciągu kilku sekund lub coś podobnego.

Sugerowałbym więc użycie daty i godziny oraz datownika. Nawet jeśli użyjesz na przykład PhpMyadmin i chcesz szybko przejrzeć niektóre dane, łatwiej ci będzie, gdy zobaczysz datę w formacie daty i godziny (na przykład 2011-12-20 10:15:20:), jak to będzie, jeśli spojrzysz na 11 cyfrę. Więc użyj obu, a następnie zadzwoń i użyj tego, który bardziej Ci odpowiada.

Jeśli musisz lub chcesz wybrać tylko jeden, sugerowałbym znacznik czasu, w przeciwnym razie użyj obu.


1
-1 Timestamp is just a number 11 digit long which doesn't really "mean" anythingznaczniki czasu MySQL są przechowywane w tym samym formacie co data i godzina. Musisz także przekonwertować je na znaczniki czasu php, aby wykonać obliczenia, które opisujesz, LUB po prostu użyć wielu funkcji daty / czasu MySQL i wykonać obliczenia w bazie danych. Twoja odpowiedź naprawdę nie ma sensu.
— yannis
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.