Jak uzyskać aktualną strefę czasową MySQL?

Ktoś wie czy w MySQL jest taka funkcja?

UPDATE

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żytego, to dobrze, możemy zaangażować PHP tutaj, o ile mogę uzyskać poprawne informacje nie jak SYSTEM...

Author: hlopetz, 2010-05-29

16 answers

Z sekcji manual (9.6):

Bieżące wartości globalnych i specyficznych dla klienta stref czasowych można pobrać w następujący sposób:
mysql> SELECT @@global.time_zone, @@session.time_zone;

Edit powyższe zwraca SYSTEM Jeśli MySQL jest ustawiony na slave do strefy czasowej systemu, co jest mniej niż pomocne. Ponieważ używasz PHP, jeśli odpowiedź z MySQL to SYSTEM, możesz zapytać system, w jakiej strefie czasowej jest to używając via date_default_timezone_get. (Oczywiście, jak wskazał VolkerK obecnie PHP może działać na innym serwerze, ale zgodnie z założeniami, zakładając, że serwer WWW i serwer DB, z którym rozmawia, są ustawione na [jeśli nie W ] ta sama strefa czasowa nie jest wielkim skokiem .) Ale uważaj (tak jak w przypadku MySQL), możesz ustawić strefę czasową, której używa PHP (date_default_timezone_set), co oznacza, że może zgłaszać inną wartość niż używana przez system operacyjny. Jeśli masz kontrolę nad kodem PHP, powinieneś wiedzieć, czy to robisz i być ok.

Ale całe pytanie, jakiej strefy czasowej używa serwer MySQL, może być styczne, ponieważ pytanie serwera, w której strefie czasowej jest, mówi ci absolutnie nic o danych w bazie danych. Czytaj dalej po szczegóły:

Dalsza dyskusja :

Jeśli masz kontrolę nad serwerem, oczywiście możesz upewnić się, że strefa czasowa jest znana. Jeśli nie masz kontroli nad serwerem, możesz ustawić strefę czasową używaną przez połączenie tak:

set time_zone = '+00:00';

Ustawia strefę czasową na GMT, tak aby wszelkie dalsze operacje (np. now()) używały GMT.

Należy jednak pamiętać, że wartości czasu i Daty są , a nie przechowywane z informacjami o strefie czasowej w MySQL:

mysql> create table foo (tstamp datetime) Engine=MyISAM;
Query OK, 0 rows affected (0.06 sec)

mysql> insert into foo (tstamp) values (now());
Query OK, 1 row affected (0.00 sec)

mysql> set time_zone = '+01:00';
Query OK, 0 rows affected (0.00 sec)

mysql> select tstamp from foo;
+---------------------+
| tstamp              |
+---------------------+
| 2010-05-29 08:31:59 |
+---------------------+
1 row in set (0.00 sec)

mysql> set time_zone = '+02:00';
Query OK, 0 rows affected (0.00 sec)

mysql> select tstamp from foo;
+---------------------+
| tstamp              |
+---------------------+
| 2010-05-29 08:31:59 |      <== Note, no change!
+---------------------+
1 row in set (0.00 sec)

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2010-05-29 10:32:32 |
+---------------------+
1 row in set (0.00 sec)

mysql> set time_zone = '+00:00';
Query OK, 0 rows affected (0.00 sec)

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2010-05-29 08:32:38 |      <== Note, it changed!
+---------------------+
1 row in set (0.00 sec)

Więc znajomość strefy czasowej serwera jest ważna tylko pod względem funkcji, które otrzymują czas w tej chwili, takich jak now(), unix_timestamp(), itd.; nie mówi nic o tym, jaką strefą czasową są daty w danych bazy danych używam. Możesz wybrać założyć zostały napisane przy użyciu strefy czasowej serwera, ale założenie to może być błędne. Aby poznać strefę czasową wszelkich dat lub godzin przechowywanych w danych, musisz upewnić się, że są one przechowywane z informacjami o strefie czasowej lub (tak jak ja) upewnić się, że są zawsze w GMT.

Dlaczego założenie, że dane zostały zapisane w strefie czasowej serwera jest błędne? Po pierwsze, dane mogły zostać zapisane przy użyciu połączenia, które ustawiło inną strefę czasową. Na baza danych mogła zostać przeniesiona z jednego serwera na drugi, gdzie serwery były w różnych strefach czasowych (wpadłem na to, gdy odziedziczyłem bazę danych, która przeniosła się z Teksasu do Kalifornii). Ale nawet jeśli dane są zapisywane na serwerze, z aktualną strefą czasową, nadal są niejednoznaczne. W zeszłym roku, w Stanach Zjednoczonych, czas letni został wyłączony o 2:00 w nocy 1 listopada. Załóżmy, że mój serwer jest w Kalifornii za pomocą strefy czasowej Pacyfiku i mam wartość 2009-11-01 01:30:00 w baza danych. Kiedy to było? Czy to było 1: 30 w nocy 1 listopada PDT, czy 1: 30 w nocy 1 listopada PST (godzinę później)? Nie możesz się dowiedzieć. Morał: zawsze przechowuj daty / godziny w GMT (co nie robi DST) i przekonwertuj do żądanej strefy czasowej jako / kiedy to konieczne.

 173
Author: T.J. Crowder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-29 09:08:53

Poniższe zapytanie zwraca strefę czasową bieżącej sesji.

select timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00'));
 155
Author: JohnZ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-15 22:48:54

Po prostu SELECT @@system_time_zone;

Zwraca PST (lub cokolwiek 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ę ona od strefy czasowej systemu.

 69
Author: Andrew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-24 20:26:11

Jako Jakub Vrána (twórca lub Adminer i NotORM) wspomina w komentarzach, aby wybrać bieżące przesunięcie strefy czasowej w TIME Użyj:

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);

Zwróci: 02:00:00 jeśli Twoja strefa czasowa wynosi +2: 00 dla tej daty

Zrobiłem tu cheatsheet: czy MySQL powinien mieć ustawioną strefę czasową na UTC?

 48
Author: Timo Huovinen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:59
SELECT EXTRACT(HOUR FROM (TIMEDIFF(NOW(), UTC_TIMESTAMP))) AS `timezone`

Zwróci strefę czasową jako liczbę całkowitą (np: -6), obsługując dodatnie lub ujemne czasy (tutaj pojawia się EXTRACT: HOUR sama funkcja zwraca ujemne strefy czasowe jako dodatnie).

 6
Author: Luca Fagioli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-07 19:38:33

Aby uzyskać bieżącą strefę czasową mysql możesz zrobić następujące rzeczy:

  1. SELECT @ @ system_time_zone; / / z tego można uzyskać systemową strefę czasową
  2. SELECT IF (@@session.time_zone = 'SYSTEM', @ @ system_time_zone, @ @ session.time_zone) / / to da ci strefę czasową, jeśli systemowa Strefa czasowa różni się od globalnej strefy czasowej

Teraz jeśli chcesz zmienić strefę czasową mysql to: 1. SET GLOBAL time_zone = '+00:00' //spowoduje to ustawienie strefy czasowej mysql w UTC 2. SET @@ session.time_zone = "+00:00"; //w ten sposób można chnage strefy czasowej tylko dla danej sesji

 4
Author: Abhinav bhardwaj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-10 08:52:21

Select sec_to_time( TIME_TO_SEC (curtime ()) + 48000); tutaj możesz określić swoje różnice czasowe jako sec

 2
Author: Bala Kayan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-20 06:24:34

Sprawdź Obsługa strefy czasowej serwera MySQL i system_time_zone zmienna systemowa. Czy to pomaga?

 2
Author: Pekka 웃,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-04 23:33:48

Wystarczy ponownie uruchomić mysqld po zmianie strefy czasowej systemu..

Globalna Strefa czasowa MySQL zajmuje strefę czasową systemu. Po zmianie takiego atrybutu Systemu wystarczy ponownie uruchomić Mysqld.

 0
Author: Storm Young,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-12 19:49:36

Wstaw fałszywy 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 zapisu danych i ignoruje strefy czasowe PHP.

 0
Author: alee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-27 09:49:59

Mój framework PHP używa

SET LOCAL time_zone='Whatever'

On after connect, where 'Whatever' = = date_default_timezone_get()

Nie moje rozwiązanie, ale to zapewnia SYSTEM Strefa czasowa serwera MySQL jest zawsze taka sama jak PHP

Więc, tak, PHP jest silnie envolved i może wpływać na to

 0
Author: vladkras,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-08 07:24:37

Użyj LPAD(TIME_FORMAT (TIMEDIFF (NOW (), UTC_TIMESTAMP),'%H:%i'),6,'+'), aby uzyskać wartość w formacie strefy czasowej MySQL, której możesz wygodnie używać za pomocą convert_tz (). Zwróć uwagę, że przesunięcie strefy czasowej jest ważne tylko w momencie, w którym wyrażenie jest obliczane, ponieważ przesunięcie może zmieniać się w czasie, jeśli masz czas letni. Jednak wyrażenie jest użyteczne razem z NOW() do przechowywania offsetu z czasem lokalnym, co disambiguates what NOW() daje. (W strefach czasowych DST, NOW () odskakuje o godzinę raz w roku, więc ma kilka zduplikowanych wartości dla różnych punktów w czasie).

 0
Author: rtc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-24 18:46:47

Aby uzyskać bieżący czas zgodnie z twoją strefą czasową, możesz użyć następującego (w moim przypadku jego '+5:30')

Select DATE_FORMAT (convert_tz (now (), @ @ session.time_zone,'+05:30') ,'%Y - % m - % d')

 0
Author: Sanjoy Kanrar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-04 11:49:32

Polecenie wymienione w opisie zwraca "SYSTEM", który wskazuje, że zajmuje strefę czasową serwera. Co nie jest przydatne dla naszego zapytania.

Poniższe zapytanie pomoże zrozumieć strefę czasową

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP) as GMT_TIME_DIFF;

Powyższe zapytanie poda przedział czasu w odniesieniu do Coordinated Universal Time(UTC). Możesz więc łatwo analizować strefę czasową. jeśli Strefa czasowa bazy danych jest IST, wyjście będzie 5: 30

UTC_TIMESTAMP

W MySQL, UTC_TIMESTAMP zwraca bieżącą datę i godzinę UTC jako wartość w "YYYY-MM-DD HH:MM:SS" lub YYYYMMDDHHMMSS.format Uuuuu w zależności od zastosowania funkcji tj. w kontekście łańcuchowym lub liczbowym.

Teraz()

Funkcja NOW (). MySQL NOW () Zwraca wartość bieżącej daty i godziny w formacie' YYYY-MM-DD HH:MM:SS' lub YYYYMMDDHHMMSS.format Uuuuu w zależności od kontekstu (liczbowego lub łańcuchowego) funkcji. CURRENT_TIMESTAMP, CURRENT_TIMESTAMP (), LOCALTIME, LOCALTIME (), LOCALTIMESTAMP, LOCALTIMESTAMP () są synonimami NOW().

 0
Author: FullStack,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-18 13:44:48

It may be as stupid as this

Select timediff (current_time (), utc_time ())

Jak jest cały mysql

Nie otrzymasz bezpośrednio wartości strefy czasowej w ten sposób, ale gdyby nie było innego sposobu...

@@global.time_zone nie może być użyte w widoku, ponieważ jest zmienną-i zwraca całkiem bezużyteczną wartość 'SYSTEM' (nie mam czemu ktoś się tym przejmował)

Jeśli chcesz użyć zapytania w sesji ze zmienioną time_zone (przez session SET TIME_ZONE =), będziesz get that with @ @ session.time_zone jeśli zapytasz @ @ global.time_zone dostajesz 'SYSTEM' catch 22

Jeśli spróbujesz datediff, date_sub lub timediff z now() I utc_time () prawdopodobnie napotkasz problemy z konwersją, które będą cicho chowane przez serwer

Najgorsza dokumentacja, jaką widziałem, też Ci nie pomaga.

Świetna robota!

Ale coś sugerowane powyżej prawdopodobnie będzie działać przynajmniej z niektórymi wersjami serwera, jak jest mój (5.5.43-37) rozwiązanie hostowane.

 -1
Author: dwaid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-24 20:31:42

Spróbuj użyć następującego kodu:

//ASP CLASSIC
Set dbdate = Server.CreateObject("ADODB.Recordset")
dbdate.ActiveConnection = MM_connection
dbdate.Source = "SELECT NOW() AS currentserverdate "
dbdate.Open()
currentdate = dbdate.Fields("currentserverdate").Value
response.Write("Server Time is "&currentdate)
dbdate.Close()
Set dbdate = Nothing
 -2
Author: Oscar Rojas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-30 19:21:46