Làm cách nào để có được múi giờ hiện tại của MySQL?


217

Bất cứ ai cũng biết nếu có một chức năng như vậy trong MySQL?

CẬP NHẬT

Điều này không xuất ra bất kỳ thông tin hợp lệ:

mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM             | SYSTEM              |
+--------------------+---------------------+

Hoặc có thể bản thân MySQL không thể biết chính xác time_zoneđược sử dụng, điều đó tốt, chúng ta có thể tham gia PHPở đây, miễn là tôi có thể nhận được thông tin hợp lệ không như SYSTEM...


3
"chúng ta có thể liên quan đến PHP ở đây" - và liệu trường hợp đó của php có luôn ở trên cùng một máy với máy chủ MySQL không?
VolkerK

Vâng, họ sẽ ở trên cùng một máy.
dùng198729

10
Hãy thử @@system_time_zonenhư đã nêu trong câu trả lời của tôi dưới đây.
Andrew

Vì câu hỏi đã được hỏi thêm câu trả lời, có thể xem xét lại câu trả lời được chấp nhận?
Timo Huovinen

1
Mặc dù máy chủ MySQL và PHP nằm trên cùng một máy chủ, chúng có thể chọn các múi giờ khác nhau dựa trên cài đặt của chúng. Và những thời điểm này có thể khác với những gì hệ điều hành của bạn hiển thị và PHP / MySQL hiển thị.
Boudel tối đa

Câu trả lời:


226

Từ hướng dẫn ( phần 9.6 ):

Các giá trị hiện tại của múi giờ toàn cầu và dành riêng cho khách hàng có thể được truy xuất như sau:
mysql> SELECT @@global.time_zone, @@session.time_zone;

Chỉnh sửa Trả về ở trên SYSTEMnếu MySQL được đặt thành nô lệ theo múi giờ của hệ thống, điều này ít hữu ích hơn. Vì bạn đang sử dụng PHP, nếu câu trả lời từ MySQL là SYSTEM, thì bạn có thể hỏi hệ thống sử dụng múi giờ nào thông qua date_default_timezone_get. (Tất nhiên, như VolkerK đã chỉ ra, PHP có thể đang chạy trên một máy chủ khác, nhưng theo giả định, giả sử máy chủ web và máy chủ DB mà nó đang nói đến được đặt thành [nếu không thực sự ] cùng một múi giờ bước nhảy vọt lớn .) Nhưng hãy cẩn thận (như với MySQL), bạn có thể đặt múi giờ mà PHP sử dụng (date_default_timezone_set), có nghĩa là nó có thể báo cáo một giá trị khác với hệ điều hành đang sử dụng. Nếu bạn đang kiểm soát mã PHP, bạn nên biết liệu bạn đang làm điều đó và có ổn không.

Nhưng toàn bộ câu hỏi về việc múi giờ mà máy chủ MySQL đang sử dụng có thể là một tiếp tuyến, bởi vì việc hỏi máy chủ đó là múi giờ nào cho bạn biết hoàn toàn không có gì về dữ liệu trong cơ sở dữ liệu. Đọc để biết chi tiết:

Thảo luận thêm :

Nếu bạn đang kiểm soát máy chủ, tất nhiên bạn có thể đảm bảo rằng múi giờ là số lượng đã biết. Nếu bạn không kiểm soát máy chủ, bạn có thể đặt múi giờ được sử dụng bởi kết nối của bạn như thế này:

set time_zone = '+00:00';

Điều đó đặt múi giờ thành GMT, do đó, mọi hoạt động tiếp theo (như now()) sẽ sử dụng GMT.

Tuy nhiên, xin lưu ý rằng các giá trị thời gian và ngày không được lưu trữ với thông tin múi giờ trong 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)

Vì vậy, biết múi giờ của máy chủ là chỉ quan trọng về chức năng mà có được thời gian ngay bây giờ, chẳng hạn như now(), unix_timestamp(), vv .; nó không cho bạn biết bất cứ điều gì về múi giờ trong dữ liệu cơ sở dữ liệu đang sử dụng. Bạn có thể chọn giả sử chúng được viết bằng múi giờ của máy chủ, nhưng giả định đó có thể là thiếu sót. Để biết múi giờ của bất kỳ ngày hoặc thời gian nào được lưu trữ trong dữ liệu, bạn phải đảm bảo rằng chúng được lưu trữ với thông tin múi giờ hoặc (như tôi làm) đảm bảo chúng luôn luôn trong GMT.

Tại sao giả sử dữ liệu được ghi bằng múi giờ của máy chủ bị sai sót? Chà, đối với một điều, dữ liệu có thể đã được ghi bằng cách sử dụng một kết nối đặt múi giờ khác. Cơ sở dữ liệu có thể đã được chuyển từ máy chủ này sang máy chủ khác, trong đó các máy chủ ở các múi giờ khác nhau (tôi đã gặp phải điều đó khi tôi thừa hưởng cơ sở dữ liệu đã được chuyển từ Texas đến California). Nhưng ngay cả khi dữ liệu được ghi trên máy chủ, với múi giờ hiện tại, nó vẫn mơ hồ. Năm ngoái, tại Hoa Kỳ, Giờ tiết kiệm ánh sáng ban ngày đã bị tắt vào lúc 2:00 sáng ngày 1 tháng 11. Giả sử máy chủ của tôi ở California sử dụng múi giờ Thái Bình Dương và tôi có giá trị2009-11-01 01:30:00trong cơ sở dữ liệu. Khi là nó? Đó có phải là 1:30 sáng ngày 1 tháng 11 PDT hay 1:30 sáng ngày 1 tháng 11 PST (một giờ sau)? Bạn hoàn toàn không có cách nào để biết. Đạo đức: Luôn lưu trữ ngày / giờ trong GMT (không thực hiện DST) và chuyển đổi sang múi giờ mong muốn như / khi cần thiết.


5
@ user198729: Nó không vô nghĩa , mặc dù nó gần như không hữu ích như tôi mong đợi. Điều đó có nghĩa là: Hỏi hệ điều hành, MySQL đang nói về điều đó.
TJ Crowder

Chỉ tò mò, tại sao chúng ta phải tự đặt múi giờ và sau đó lấy nó? Đó là loại đánh bại mục đích phải không? Ý tôi là, tôi muốn hỏi MySQL về múi giờ vì tôi không biết câu trả lời. Có lẽ tôi bối rối và có những điều sai. Ai đó có thể giải thích?
Senthil

1
@Senthil DATETIMELoại myQuery không chứa thông tin múi giờ. Do đó, tôi nghĩ rằng triết lý cơ bản dự định ở đây là để myQuery bị mù múi giờ nhất có thể - điều đó có nghĩa là người dùng sẽ gắn bó với một múi giờ, hoặc UTC hoặc múi giờ mà máy chủ đang ở, lưu trữ mọi thứ trong vùng đó và thực hiện bất kỳ chuyển đổi nào ở cấp độ ứng dụng hoặc sử dụng CONVERT_TZ()( dev.mysql.com/doc/refman/5.0/en/iêu ) Ít nhất, đó là cách tôi luôn hiểu cách thức hoạt động của nó, nhìn vào các tùy chọn thưa thớt mà myQuery cung cấp trong trường này.
Pekka

Cảm ơn nhưng điều này vẫn chưa được giải quyết, làm thế nào để tôi có được thông tin tz bằng kết quả của now()PHP?
dùng198729

Tôi hoàn toàn đồng ý với phần "dính vào một múi giờ khi lưu dấu thời gian" .. Nhưng điều này-> ".. hoặc múi giờ của máy chủ đang ở .." làm thế nào để bạn phát hiện ra điều đó? Giả sử bạn đã lưu tất cả các giá trị dấu thời gian dưới dạng UTC. Nhưng máy chủ của bạn ở một số múi giờ khác và bạn muốn hiển thị các giá trị dấu thời gian theo múi giờ đó . Vậy làm thế nào bạn sẽ biết máy chủ của bạn đang ở múi giờ nào? Chỉ sau đó bạn mới có thể chuyển một số giá trị sang CONVERT_TZ () để chuyển đổi nó phải không?
Senthil

196

Truy vấn dưới đây trả về múi giờ của phiên hiện tại.

select timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00'));

6
Đây thực sự là câu trả lời đúng, bởi vì nó chứng minh rằng 'HỆ THỐNG' được công nhận là múi giờ trong chuyển đổi, làm cho nó đủ để chuyển đổi, ví dụ NOW () thành bất kỳ múi giờ nào.
nilskp

5
Cảm ơn, sử dụng điều này tôi đã có thể có được định dạng tôi muốn:select time_format(timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00')),'%H%i');
jordanbtucker

97
SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP)đơn giản hơn
Jakub Vrána

3
Hoặc SELECT TIMESTAMPDIFF(SECOND, NOW(), UTC_TIMESTAMP);để có được sự khác biệt trong vài giây.
philfreo

106

Đơn giản SELECT @@system_time_zone;

Trả về PST(hoặc bất cứ điều gì có liên quan đến hệ thống của bạn).

Nếu bạn đang cố xác định múi giờ phiên, bạn có thể sử dụng truy vấn này:
SELECT IF(@@session.time_zone = 'SYSTEM', @@system_time_zone, @@session.time_zone);

Sẽ trả về múi giờ phiên nếu nó khác với múi giờ của hệ thống.


6
Nhược điểm duy nhất là nếu múi giờ thay đổi do thời gian tiết kiệm ánh sáng thay đổi, nó vẫn sẽ báo cáo cái đã được "ghi nhớ" tại thời điểm khởi động máy chủ, xem lỗi mysql 9518
Đánh dấu

72

Như Jakub Vrána (Người tạo hoặc Quản trị viênNotORM ) đã đề cập trong các nhận xét, để chọn phần bù múi giờ hiện tại đang TIMEsử dụng:

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);

Nó sẽ trở lại: 02:00:00 nếu múi giờ của bạn là +2: 00 cho ngày đó

Tôi đã tạo ra một chiếc áo choàng ở đây: MySQL có nên đặt múi giờ của nó thành UTC không?


Hoặc SELECT TIMESTAMPDIFF(SECOND, NOW(), UTC_TIMESTAMP);để có được sự khác biệt trong vài giây.
philfreo

add-on cho @philfreo - lưu ý rằng các tham số nên được đảo ngược trong TIMESTAMPDIFF so với TIMEDIFF. Để lấy ví dụ được đưa ra trong câu trả lời này, nếu lợi nhuận TIMEDIFF 02:00:00, các TIMESTAMPDIFF tương ứng sẽ quay trở lại -2nếu đơn vị là HOUR, -120nếu đơn vị là PHÚT, vv Để có được dấu hiệu để tương ứng với các múi giờ, trao đổi các thông số: SELECT TIMESTAMPDIFF(MINUTE, UTC_TIMESTAMP, NOW())sẽ trở lại với dự kiến 120cho múi giờ +2: 00. Lý do để chỉ định phút, có một vài múi giờ được bù 30 hoặc 45 phút, xem en.wikipedia.org/wiki/Time_zone
ToolmakerSteve

1
đây là một câu trả lời tốt hơn nhiều so với câu trả lời được chấp nhận vì nó trả lời trực tiếp câu hỏi và đưa ra giải pháp thay vì chỉ là lý thuyết.
supersan

10

Để có được múi giờ hiện tại của mysql, bạn có thể làm như sau:

 1. SELECT @@system_time_zone;   //from this you can get the system timezone 
 2. SELECT IF(@@session.time_zone = 'SYSTEM', @@system_time_zone, @@session.time_zone) //This will give you time zone if system timezone is different from global timezone

Bây giờ nếu bạn muốn thay đổi múi giờ mysql thì:

 1. SET GLOBAL time_zone = '+00:00'   //this will set mysql timezone in UTC
 2. SET @@session.time_zone = "+00:00";  //by this you can chnage the timezone only for your particular session 

6
SELECT EXTRACT(HOUR FROM (TIMEDIFF(NOW(), UTC_TIMESTAMP))) AS `timezone`

Điều này sẽ trả về múi giờ dưới dạng một số nguyên (ví dụ -6:), xử lý thời gian dương hoặc âm (đây là nơi EXTRACTphát huy tác dụng: HOURmột mình hàm trả về các múi giờ âm là dương).


6

Để bất cứ ai đến để tìm múi giờ của mysql db.

Với truy vấn này, bạn có thể nhận được múi giờ hiện tại:

mysql> SELECT @@system_time_zone as tz;
+-------+
|  tz   |
+-------+
|  CET  |
+-------+

4

Lệnh được đề cập trong phần mô tả trả về "HỆ THỐNG" cho biết nó mất múi giờ của máy chủ. Điều này không hữu ích cho truy vấn của chúng tôi.

Truy vấn sau đây sẽ giúp hiểu múi giờ

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

Truy vấn trên sẽ cung cấp cho bạn khoảng thời gian liên quan đến Giờ phối hợp quốc tế (UTC). Vì vậy, bạn có thể dễ dàng phân tích múi giờ. nếu múi giờ của cơ sở dữ liệu là IST thì đầu ra sẽ là 5:30

UTC_TIMESTAMP

Trong MySQL, UTC_TIMESTAMP trả về ngày và giờ UTC hiện tại dưới dạng giá trị ở định dạng 'YYYY-MM-DD HH: MM: SS' hoặc YYYYMMDDHHMMSS.uuuuuu tùy thuộc vào cách sử dụng hàm tức là trong chuỗi hoặc ngữ cảnh số.

HIỆN NAY()

Hàm NOW (). MySQL NOW () trả về giá trị của ngày và giờ hiện tại ở định dạng 'YYYY-MM-DD HH: MM: SS' hoặc YYYYMMDDHHMMSS.uuuuuu tùy thuộc vào ngữ cảnh (số hoặc chuỗi) của hàm. CURRENT_TIMESTAMP, CURRENT_TIMESTAMP (), LOCALTIME, LOCALTIME (), LOCALTIMESTAMP, LOCALTIMESTAMP () là các từ đồng nghĩa của NOW ().


2

Kiểm tra Hỗ trợ múi giờ của máy chủ MySQLsystem_time_zonebiến hệ thống. cái đó có giúp ích không?


@user bạn có thể vui lòng đánh vần trong câu hỏi của bạn về thông tin chính xác mà bạn đang tìm kiếm (múi giờ của máy chủ không? Máy khách?) và những công cụ nào theo ý của bạn? Bạn đề cập đến PHP. Bạn có thể truy cập dòng lệnh?
Pekka

5
@user cũng vậy, tôi thấy bạn đang đi qua như một chút câu trả lời tinh ranh từ những người đang cố gắng trở nên hữu ích, và không hoàn toàn sai. Tôi không bận tâm đến việc bỏ phiếu cũng như mất điểm, nhưng thái độ của bạn không thực sự khuyến khích để tìm kiếm thêm một giải pháp.
Pekka

3
@user như tôi đã nói, thái độ của bạn không thúc đẩy tôi nghiên cứu để có câu trả lời thêm cho bạn, đặc biệt là về thông tin ít ỏi mà bạn cung cấp. Lấy làm tiếc.
Pekka

3
@ user198729: Wow, mất thái độ. Pekka là kiểu người thực sự giúp đỡ mọi người. Nếu phép lịch sự thôi không đủ để thúc đẩy bạn, hãy thử tự quan tâm.
TJ Crowder

2
Chỉ là suy nghĩ của tôi: Tôi sẽ không vi phạm nếu người dùng đã làm điều tương tự với bài viết của tôi. Ý tôi là, áp lực thời hạn hoặc sự thất vọng có thêm một số góc cạnh xung quanh mọi người, nhưng tôi nghĩ chúng ta nên cho phép nó ở một mức độ nào đó. Có lẽ tôi quá tha thứ: |
Senthil

1

Khung PHP của tôi sử dụng

SET LOCAL time_zone='Whatever'

bật sau khi kết nối, trong đó 'Dù thế nào' == date_default_timezone_get ()

Không phải giải pháp của tôi, nhưng điều này đảm bảo SYSTEM múi giờ của máy chủ MySQL luôn giống như của PHP

Vì vậy, vâng, PHP được hình dung mạnh mẽ và có thể ảnh hưởng đến nó


1

Để có được thời gian hiện tại theo múi giờ của bạn, bạn có thể sử dụng cách sau (trong trường hợp của tôi là '+5: 30')

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


0

Bạn chỉ cần khởi động lại mysqld sau khi thay đổi múi giờ của Hệ thống ..

Múi giờ toàn cầu của MySQL chiếm múi giờ của Hệ thống. Khi bạn thay đổi bất kỳ thuộc tính nào như vậy của hệ thống, bạn chỉ cần khởi động lại Mysqld.


sau khi thay đổi múi giờ trên HĐH, các phần chèn của mysql sẽ sử dụng múi giờ mới nhưng chọn ngay (); và chọn current_timestamp; các lệnh vẫn sẽ sử dụng múi giờ cũ. Để đồng bộ hóa tất cả những điều này, dịch vụ mysql phải được khởi động lại.
Manoj Kumar G

0

Chèn một bản ghi giả vào một trong các cơ sở dữ liệu của bạn có dấu thời gian Chọn bản ghi đó và nhận giá trị của dấu thời gian. Xóa hồ sơ đó. Chắc chắn rằng múi giờ mà máy chủ đang sử dụng để ghi dữ liệu và bỏ qua các múi giờ PHP.


0

Bạn có thể thử như sau:

select sec_to_time(TIME_TO_SEC( curtime()) + 48000);

Tại đây bạn có thể chỉ định chênh lệch thời gian của mình là giây


1
bạn không nên thêm và bớt đi. với quy tắc nói ban ngày, v.v ... đó là một bãi mìn
eweb

0

Sử dụng LPAD(TIME_FORMAT(TIMEDIFF(NOW(), UTC_TIMESTAMP),’%H:%i’),6,’+')để nhận giá trị ở định dạng múi giờ của MySQL mà bạn có thể sử dụng thuận tiện CONVERT_TZ(). Lưu ý rằng phần bù múi giờ bạn nhận được chỉ có giá trị tại thời điểm biểu thức được ước tính do phần bù có thể thay đổi theo thời gian nếu bạn có thời gian tiết kiệm ánh sáng ban ngày. Tuy nhiên, biểu thức là hữu ích cùng với NOW()việc lưu trữ phần bù với thời gian cục bộ, điều này làm phân tán những gì NOW()mang lại. (Trong các múi giờ DST, NOW()nhảy trở lại một giờ mỗi năm một lần, do đó có một số giá trị trùng lặp cho các điểm khác biệt theo thời gian).


0

Nó có thể

select timediff(current_time(),utc_time())

Bạn sẽ không nhận được giá trị múi giờ trực tiếp theo cách này.

@@global.time_zonekhông thể được sử dụng vì nó là một biến và nó trả về giá trị 'SYSTEM'.

Nếu bạn cần sử dụng truy vấn của mình trong một phiên có múi giờ thay đổi bằng cách sử dụng session SET TIME_ZONE =, thì bạn sẽ nhận được điều đó với @@session.time_zone. Nếu bạn truy vấn @@global.time_zone, sau đó bạn nhận được 'SYSTEM'.

Nếu bạn thử datediff, date_subhoặc timediffvới now()utc_time(), thì có lẽ bạn sẽ gặp phải các vấn đề chuyển đổi.

Nhưng những điều được đề xuất ở trên có thể sẽ hoạt động ít nhất với một số phiên bản máy chủ. Phiên bản của tôi là 5.5.43-37 và là một giải pháp lưu trữ.


Điều này không trả lời rõ ràng câu hỏi. Có lẽ bạn có thể chỉnh sửa nó để tập trung vào câu hỏi được hỏi.
Mogsdad

-3

Hãy thử sử dụng mã sau đây:

//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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.