Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да получа текущата часова зона на MySQL?

От ръководството (раздел 9.6 ):

Текущите стойности на глобалните и специфични за клиента часови зони могат да бъдат извлечени по следния начин:
mysql> SELECT @@global.time_zone, @@session.time_zone;

Редактиране Горното връща SYSTEM ако MySQL е настроен да използва часовата зона на системата, което не е много полезно. Тъй като използвате PHP, ако отговорът от MySQL е SYSTEM , след това можете да попитате системата коя часова зона е то използване чрез date_default_timezone_get . (Разбира се, както VolkerK посочи, PHP може да работи на различен сървър, но според предположенията, ако се приеме, че уеб сървърът и DB сървърът, с който говори, са настроени на [ако всъщност не в ] същата часова зона не е огромна скок.) Но внимавайте, че (както при MySQL) можете да зададете часовата зона, която PHP използва (date_default_timezone_set ), което означава, че може да докладва различна стойност от тази, която ОС използва. Ако контролирате PHP кода, трябва да знаете дали го правите и да сте добре.

Но целият въпрос за това каква часова зона използва MySQL сървърът може да е допирателна, защото питането на сървъра в коя часова зона се намира ви казва абсолютно нищо относно данните в базата данни. Прочетете за подробности:

Допълнителна дискусия :

Ако контролирате сървъра, разбира се, можете да се уверите, че часовата зона е известно количество. Ако не контролирате сървъра, можете да зададете часовата зона, използвана от вашата връзка така:

set time_zone = '+00:00';

Това задава часовата зона на GMT, така че всички по-нататъшни операции (като now() ) ще използва GMT.

Имайте предвид обаче, че стойностите за час и дата не съхранени с информация за часовата зона в 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)

Така че познаването на часовата зона на сървъра е важно само по отношение на функциите, които получават времето точно сега, като now() , unix_timestamp() и др.; не ви казва нищо за това каква часова зона използват датите в данните в базата данни. Може да изберете да предполагате те са написани с помощта на часовата зона на сървъра, но това предположение може да е погрешно. За да знаете часовата зона на всякакви дати или часове, съхранени в данните, трябва да се уверите, че те се съхраняват с информация за часовата зона или (както аз правя) да се уверите, че винаги са в GMT.

Защо да приемем, че данните са записани с помощта на часовата зона на сървъра, е неправилна? Е, от една страна, данните може да са били записани с помощта на връзка, която задава различна часова зона. Базата данни може да е била преместена от един сървър на друг, където сървърите са били в различни часови зони (сблъсках се с това, когато наследих база данни, която се беше преместила от Тексас в Калифорния). Нодори ако данните се записват на сървъра, с текущата му часова зона, все още са двусмислени. Миналата година в Съединените щати лятното часово време беше изключено в 2:00 часа сутринта на 1 ноември. Да предположим, че моят сървър е в Калифорния, използвайки тихоокеанската часова зона и имам стойността 2009-11-01 01:30:00 в базата данни. Кога беше? Това ли беше 1:30 сутринта на 1 ноември PDT, или 1:30 сутринта на 1 ноември PST (един час по-късно)? Нямаш абсолютно никакъв начин да знаеш. Морално:Винаги съхранявайте дати/часове в GMT (което не прави DST) и преобразувайте в желаната часова зона, ако/когато е необходимо.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Извличане на свързан списък в MySQL база данни

  2. Промяна на часовата зона в MySQL?

  3. 4 начина за проверка на типа данни на колона в MySQL

  4. MySQL игнорира ли нулеви стойности при уникални ограничения?

  5. Промяна на ограничението за Mysql размер на ред е твърде голям