Czy ktoś wie, czy istnieje taka funkcja w MySQL?
AKTUALIZACJA
To nie wyświetla żadnych ważnych informacji:
mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM | SYSTEM |
+--------------------+---------------------+
A może sam MySQL nie może dokładnie znać time_zone
używanego, to dobrze, możemy się PHP
tu zaangażować , o ile mogę uzyskać ważne informacje, które nie są takie SYSTEM
...
@@system_time_zone
jak podano w mojej odpowiedzi poniżej.Odpowiedzi:
Z instrukcji ( rozdział 9.6 ):
Edytuj Powyższe zwraca,
SYSTEM
jeśli MySQL jest ustawiony jako slave w strefie czasowej systemu, co jest mniej niż pomocne. Ponieważ używasz PHP, jeśli odpowiedź na MySQL brzmiSYSTEM
, możesz zapytać system , za pomocą której strefy czasowej używadate_default_timezone_get
. (Oczywiście, jak VolkerK wskazał, PHP może być uruchomiony na innym serwerze, ale założenia iść, przy założeniu, że serwer WWW i serwer DB to rozmawiasz są ustawione na [jeśli nie faktycznie w ] ta sama strefa czasowa nie jest ogromny skok.) Ale uwaga: tak jak w przypadku MySQL, możesz ustawić strefę czasową używaną przez PHP (date_default_timezone_set
), co oznacza, że może zgłaszać inną wartość niż system operacyjny. Jeśli masz kontrolę nad kodem PHP, powinieneś wiedzieć, czy to robisz i być w porządku.Ale całe pytanie o strefę czasową, z której korzysta serwer MySQL, może być styczną, ponieważ pytanie serwera o strefę czasową nie mówi absolutnie nic o danych w bazie danych. Czytaj dalej, aby uzyskać szczegółowe informacje:
Dalsza dyskusja :
Jeśli kontrolujesz serwer, możesz oczywiście upewnić się, że strefa czasowa jest znaną ilością. Jeśli nie kontrolujesz serwera, możesz ustawić strefę czasową używaną przez twoje połączenie w następujący sposób:
To ustawia strefę czasową na GMT, aby wszelkie dalsze operacje (jak
now()
) wykorzystywały GMT.Należy jednak pamiętać, że wartości czasu i daty nie są przechowywane z informacjami o strefie czasowej w MySQL:
Więc wiedząc strefę czasową serwera jest ważna tylko pod względem funkcji, które uzyskać czas teraz, takie jak
now()
,unix_timestamp()
itp .; nie mówi nic o strefie czasowej, której używają daty w danych bazy danych. Możesz założyć, że zostały napisane w strefie czasowej serwera, ale założenie to może być błędne. Aby poznać strefę czasową dowolnych dat lub godzin przechowywanych w danych, musisz upewnić się, że są one przechowywane wraz z informacjami o strefie czasowej lub (tak jak ja), aby zawsze znajdowały się w GMT.Dlaczego założenie, że dane zostały zapisane przy użyciu strefy czasowej serwera, jest wadliwe? Po pierwsze, dane mogły zostać zapisane przy użyciu połączenia, które ustawiło inną strefę czasową. Baza danych mogła zostać przeniesiona z jednego serwera na inny, gdzie serwery znajdowały się w różnych strefach czasowych (wpadłem na to, kiedy odziedziczyłem bazę danych, która przeniosła się z Teksasu do Kalifornii). Ale nawet jeśli dane są zapisywane na serwerze wraz z bieżącą strefą czasową, nadal są niejednoznaczne. W ubiegłym roku, w Stanach Zjednoczonych, czas letni został wyłączony o 2:00 1 listopada. Załóżmy, że mój serwer znajduje się w Kalifornii i korzysta ze strefy czasowej Pacyfiku, a ja mam wartość
2009-11-01 01:30:00
w bazie danych. Kiedy to było? Czy to 1:30 PDT 1 listopada, czy 1:30 PST 1 listopada (godzina później)? Nie masz absolutnie żadnej możliwości poznania. Morał: zawsze przechowuj daty / godziny w GMT (który nie robi czasu letniego) i konwertuj do żądanej strefy czasowej w razie potrzeby.źródło
DATETIME
nie zawiera informacji o strefie czasowej. Dlatego myślę, że zamierzoną podstawową filozofią jest to, aby mySQL był jak najbardziej ślepy na strefę czasową - co oznacza, że użytkownik musi trzymać się jednej strefy czasowej, UTC lub strefy czasowej, w której znajduje się serwer, przechowywać wszystko w tej strefie i rób dowolne konwersje na poziomie aplikacji lub używającCONVERT_TZ()
( dev.mysql.com/doc/refman/5.0/en/... ) Przynajmniej tak zawsze rozumiałem, jak to powinno działać, patrząc na rzadkie opcje, które mySQL udostępnia w tym polu.now()
w PHP?Poniższe zapytanie zwraca strefę czasową bieżącej sesji.
źródło
select time_format(timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00')),'%H%i');
SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP)
jest prostsze.SELECT TIMESTAMPDIFF(SECOND, NOW(), UTC_TIMESTAMP);
uzyskać różnicę w kilka sekund.Po prostu
SELECT @@system_time_zone;
Zwraca
PST
(lub cokolwiek, co jest istotne dla twojego systemu).Jeśli próbujesz określić strefę czasową sesji, możesz użyć tego zapytania:
SELECT IF(@@session.time_zone = 'SYSTEM', @@system_time_zone, @@session.time_zone);
Która zwróci strefę czasową sesji, jeśli różni się od systemowej strefy czasowej.
źródło
Jak wspomina Jakub Vrána (twórca lub administrator i NotORM ) w komentarzach, aby wybrać aktualnie używane przesunięcie strefy czasowej
TIME
:Zwróci:
02:00:00
jeśli twoja strefa czasowa wynosi +2: 00 dla tej datyZrobiłem tutaj cheatheet: Czy MySQL powinien mieć strefę czasową ustawioną na UTC?
źródło
SELECT TIMESTAMPDIFF(SECOND, NOW(), UTC_TIMESTAMP);
uzyskać różnicę w kilka sekund.02:00:00
, odpowiedni TIMESTAMPDIFF zwróci,-2
jeśli jednostka to GODZINA,-120
jeśli jednostka to MINUTA itp. Aby uzyskać znak odpowiadający strefie czasowej, zamień parametry:SELECT TIMESTAMPDIFF(MINUTE, UTC_TIMESTAMP, NOW())
zwróci oczekiwaną120
strefę czasową +2: 00. Powodem do określenia minut jest to, że istnieje kilka stref czasowych z przesunięciem 30 lub 45 minut, patrz en.wikipedia.org/wiki/Time_zoneAby uzyskać bieżącą strefę czasową mysql, możesz wykonać następujące czynności:
Teraz, jeśli chcesz zmienić strefę czasową mysql, to:
źródło
Zwróci strefę czasową jako liczbę całkowitą (np .
-6
:), obsługując czasy dodatnie lub ujemne (tutajEXTRACT
pojawia się miejsce:HOUR
sama funkcja zwraca ujemne strefy czasowe jako dodatnie).źródło
Każdemu przyjdzie znaleźć strefę czasową mysql db.
Za pomocą tego zapytania możesz uzyskać aktualną strefę czasową:
źródło
Komenda wymieniona w opisie zwraca „SYSTEM”, co oznacza, że zajmuje ona strefę czasową serwera. Co nie jest przydatne w naszym zapytaniu.
Poniższe zapytanie pomoże zrozumieć strefę czasową
Powyższe zapytanie podaje przedział czasu w odniesieniu do uniwersalnego czasu koordynowanego (UTC). Możesz więc łatwo analizować strefę czasową. jeśli strefa czasowa bazy danych to IST, wyjście wyniesie 5:30
UTC_TIMESTAMP
W MySQL UTC_TIMESTAMP zwraca bieżącą datę i godzinę UTC jako wartość w formacie „RRRR-MM-DD GG: MM: SS” lub RRRRMMDDGGMMSS.uuuuuu, w zależności od użycia funkcji, tj. W kontekście łańcuchowym lub liczbowym.
TERAZ()
Funkcja NOW (). MySQL NOW () zwraca wartość bieżącej daty i godziny w formacie „RRRR-MM-DD GG: MM: SS” lub RRRRMMDDGGMMSS.uuuuuu, w zależności od kontekstu (numerycznego lub ciągu) funkcji. CURRENT_TIMESTAMP, CURRENT_TIMESTAMP (), LOCALTIME, LOCALTIME (), LOCALTIMESTAMP, LOCALTIMESTAMP () są synonimami NOW ().
źródło
Sprawdź obsługę strefy czasowej serwera MySQL i
system_time_zone
zmienną systemową. To pomaga?źródło
Mój framework PHP używa
na po połączeniu, gdzie „Cokolwiek” == date_default_timezone_get ()
Nie moje rozwiązanie, ale zapewnia, że strefa
SYSTEM
czasowa serwera MySQL jest zawsze taka sama jak PHPTak, PHP jest mocno zaangażowane i może na to wpływać
źródło
Aby uzyskać bieżący czas zgodnie ze strefą czasową, możesz użyć następujących (w moim przypadku jest to „+5: 30”)
źródło
Musisz tylko ponownie uruchomić mysqld po zmianie strefy czasowej Systemu.
Globalna strefa czasowa MySQL zajmuje strefę czasową System. Po zmianie dowolnego takiego atrybutu systemu wystarczy ponownie uruchomić Mysqld.
źródło
Wstaw fikcyjny rekord do jednej z baz danych, która ma znacznik czasu Wybierz ten rekord i uzyskaj wartość znacznika czasu. Usuń ten rekord. Pobiera na pewno strefę czasową, której serwer używa do zapisywania danych, i ignoruje strefy czasowe PHP.
źródło
Możesz spróbować:
Tutaj możesz określić różnicę czasu w sekundach
źródło
Użyj,
LPAD(TIME_FORMAT(TIMEDIFF(NOW(), UTC_TIMESTAMP),’%H:%i’),6,’+')
aby uzyskać wartość w formacie strefy czasowej MySQL, z którą możesz wygodnie korzystaćCONVERT_TZ()
. Zwróć uwagę, że otrzymane przesunięcie strefy czasowej jest ważne tylko w momencie, w którym wyrażenie jest oceniane, ponieważ przesunięcie może się zmieniać w czasie, jeśli masz czas letni. Jednak wyrażenie to jest przydatne wraz zNOW()
przechowywaniem przesunięcia względem czasu lokalnego, co jednoznacznie określa, coNOW()
daje. (W strefach czasowych czasu letniegoNOW()
przeskakuje o godzinę raz w roku, a zatem ma pewne zduplikowane wartości dla różnych punktów w czasie).źródło
Może być
W ten sposób nie uzyskasz bezpośrednio wartości strefy czasowej.
@@global.time_zone
nie może być użyte, ponieważ jest zmienną i zwraca wartość'SYSTEM'
.Jeśli potrzebujesz użyć zapytania w sesji ze zmienioną strefą czasową przy użyciu
session SET TIME_ZONE =
, to dostaniesz to za pomocą@@session.time_zone
. Jeśli zapytasz@@global.time_zone
, to dostaniesz'SYSTEM'
.Jeśli spróbujesz
datediff
,date_sub
lubtimediff
znow()
iutc_time()
, prawdopodobnie będziesz mieć problemy z konwersją.Ale rzeczy sugerowane powyżej prawdopodobnie będą działać przynajmniej w przypadku niektórych wersji serwerów. Moja wersja to 5.5.43-37 i jest to hostowane rozwiązanie.
źródło
Spróbuj użyć następującego kodu:
źródło