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?
- Jaki jest kod w php do przechowywania daty zakupu (bieżąca data), a następnie przechowywania w bazie danych?
- Proszę wyjaśnić, jak korzystać z każdego z nich, ponieważ po przeczytaniu wielu wyjaśnień w Internecie wciąż nie rozumiem tego.
Odpowiedzi:
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 UTC
do2038-01-19 03:14:07 UTC
Podczas gdy MySQL datetime :
Przechowujesz to, co dostajesz ™.
Mieć zasięg
1000-01-01 00:00:00
do9999-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ść zerowa0000-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 jestTIMESTAMP
.I oczywiście są też
DATE
iTIME
, które działają tak samoDATETIME
, ale oczywiścieDATE
nie zależy na czasie iTIME
nie 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ć
DATETIME
wszędzie. Nie ze względów technicznych, ale ponieważ nadal nie wiesz, jak działa MySQL,DATETIME
jest to prostszy wybór. Oznacza to, że przed zapisaniem będziesz musiał obliczyć bieżący znacznik czasu w PHP, co jest tak proste jak:Funkcja daty w PHP działa jak:
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
TIMESTAMP
zamiast zamiastDATETIME
ma 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śćDATETIME
do 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.
źródło
Date
, ponieważ jest to słowo zastrzeżone dlaDATE
typu danych i mogą się zdarzyć dziwne rzeczy (w zależności od wersji MySQL), więc spróbuj zmienić jego nazwę na coś podobnegocreationdate
i zobacz, co się stanie . Ponadto, z PHP powinieneś traktowaćTIMESTAMP
pola tak samo jakDATETIME
pola, to nie ma większego znaczenia. Ich format jest taki sam.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 ′
źródło
Cóż, patrzę na to w bardzo prosty sposób. W twoim przypadku chciałbym używać zarówno
datetime
itimestamp
. 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ć,
timestamp
a 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.
źródło
Timestamp is just a number 11 digit long which doesn't really "mean" anything
znaczniki 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.