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.
Modułowy
źródło
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.

Yannis
źródło
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 ′

Anvesh
źródło
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.

znak
źródło
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