sql >> Databáze >  >> RDS >> Mysql

Jak získám aktuální časové pásmo MySQL?

Z příručky (část 9.6 ):

Aktuální hodnoty globálních časových pásem a časových pásem specifických pro klienta lze získat takto:
mysql> SELECT @@global.time_zone, @@session.time_zone;

Upravit Výše uvedené vrátí SYSTEM pokud je MySQL nastaveno na použití časového pásma systému, což je méně než užitečné. Vzhledem k tomu, že používáte PHP, je odpověď z MySQL SYSTEM , můžete se pak systému zeptat, jaké časové pásmo je pomocí přes date_default_timezone_get . (Samozřejmě, jak zdůraznil VolkerK, PHP může běžet na jiném serveru, ale podle předpokladů za předpokladu, že webový server a DB server, se kterým mluví, jsou nastaveny [pokud ve skutečnosti není v ] stejné časové pásmo není velké skok.) Ale pozor, (stejně jako u MySQL) můžete nastavit časové pásmo, které PHP používá (date_default_timezone_set ), což znamená, že může hlásit jinou hodnotu, než používá operační systém. Pokud ovládáte kód PHP, měli byste vědět, zda to děláte, a být v pořádku.

Ale celá otázka, jaké časové pásmo server MySQL používá, může být tečnou, protože dotaz na server, v jakém časovém pásmu se nachází, vám neřekne absolutně nic o údajích v databázi. Podrobnosti naleznete dále:

Další diskuse :

Pokud máte server pod kontrolou, můžete samozřejmě zajistit, aby časové pásmo bylo známé množství. Pokud nemáte kontrolu nad serverem, můžete nastavit časové pásmo používané vaším připojením takhle:

set time_zone = '+00:00';

Tím se časové pásmo nastaví na GMT, takže všechny další operace (jako now() ) bude používat GMT.

Upozorňujeme však, že hodnoty času a data nejsou uložené s informacemi o časovém pásmu v 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)

Znalost časového pásma serveru je tedy důležitá pouze z hlediska funkcí, které zjišťují čas právě teď, jako je now() , unix_timestamp() , atd.; neříká vám nic o tom, jaké časové pásmo data v databázových datech používají. Můžete se rozhodnout předpokládat byly napsány pomocí časového pásma serveru, ale tento předpoklad může být chybný. Chcete-li znát časové pásmo jakýchkoli dat nebo časů uložených v datech, musíte zajistit, aby byly uloženy s informacemi o časovém pásmu, nebo (jako já) zajistit, aby byly vždy v GMT.

Proč je předpoklad, že data byla zapsána pomocí časového pásma serveru, chybný? No, za prvé, data mohla být zapsána pomocí připojení, které nastavilo jiné časové pásmo. Databáze mohla být přesunuta z jednoho serveru na druhý, kde byly servery v různých časových pásmech (narazil jsem na to, když jsem zdědil databázi, která se přestěhovala z Texasu do Kalifornie). Ale i když data jsou zapsána na serveru, s aktuálním časovým pásmem je to stále nejednoznačné. Loni byl ve Spojených státech letní 1. listopadu ve 2:00 hodin vypnutý. Předpokládejme, že můj server je v Kalifornii a používá tichomořské časové pásmo a mám hodnotu 2009-11-01 01:30:00 v databázi. Kdy to bylo? Bylo to 1:30 1. listopadu PDT, nebo 1:30 1. listopadu PST (o hodinu později)? Absolutně to nemáš jak vědět. Morálka:Vždy ukládejte data/časy v GMT (který nedělá DST) a podle potřeby převeďte na požadované časové pásmo.



  1. Musí být SQL připojení otevřená pomocí PDO v PHP uzavřena

  2. SELECT max(x) vrací hodnotu null; jak mohu dosáhnout toho, aby vrátil 0?

  3. Jaký je nejlepší rámec vysoké dostupnosti PostgreSQL? PAF vs. repmgr vs. Patroni Infographic

  4. tisk počátečního a koncového data v jednom řádku pro souvislé nebo překrývající se časové rozsahy v Oracle SQL