MySQL의 현재 시간대는 어떻게 얻습니까?


217

MySQL에 그러한 기능이 있는지 아는 사람이 있습니까?

최신 정보

유효한 정보가 출력되지 않습니다 :

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

또는 MySQL 자체가 정확히 time_zone사용 된 것을 알 수없는 경우도 PHP있습니다 SYSTEM.


3
"여기에 PHP를 포함시킬 수 있습니다"-PHP의 인스턴스가 항상 MySQL 서버와 동일한 머신에 있습니까?
VolkerK

예, 그들은 같은 기계에있을 것입니다.
user198729

10
@@system_time_zone아래 답변에 명시된대로 시도하십시오 .
앤드류

질문에 더 많은 답변이 추가되었으므로 수락 된 답변을 다시 고려할 수 있습니까?
Timo Huovinen

1
MySQL 서버와 PHP는 동일한 서버에 있지만 설정에 따라 다른 시간대를 선택할 수 있습니다. 그리고이 시간은 OS 및 PHP / MySQL 쇼와 다를 수 있습니다.
Bimal Poudel

답변:


227

매뉴얼에서 ( 섹션 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)는 OS가 사용중인 것과 다른 값을보고 할 수 있음을 의미합니다. 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에 있는지 확인해야합니다.

서버 시간대를 사용하여 데이터를 작성했다고 가정하는 이유는 무엇입니까? 우선, 다른 시간대를 설정하는 연결을 사용하여 데이터를 썼을 수도 있습니다. 데이터베이스가 한 서버에서 다른 서버로 이동했을 수 있습니다. 서버는 서로 다른 시간대에있었습니다. (텍사스에서 캘리포니아로 이동 한 데이터베이스를 상속 받았을 때 데이터베이스에 접속했습니다). 그러나 데이터가 현재 시간대로 서버에 기록 되더라도 여전히 모호합니다. 작년 미국에서는 일광 절약 시간 제가 11 월 1 일 오전 2시에 꺼졌습니다. 태평양 시간대를 사용하여 내 서버가 캘리포니아에 있고 값이 있다고 가정합니다.2009-11-01 01:30:00데이터베이스에서. 언제 였어? 1 월 30 일 (PDT) 오전 11시 1 분 또는 PST (1 시간 후) 오전 1시 30 분입니까? 당신은 전혀 알 방법이 없습니다. 도덕적 : 항상 날짜 / 시간을 GMT (DST를 수행하지 않음)에 저장하고 필요에 따라 원하는 시간대로 변환하십시오.


5
@ user198729 : 의미 가 없지만, 내가 바라는 것만 큼 도움이되지는 않습니다. 의미하는 것은 : OS에게 물어보십시오. MySQL은 그것에 노예입니다.
TJ Crowder

궁금한 점이 있습니다. 시간대를 직접 설정 한 다음 검색해야하는 이유는 무엇입니까? 그런 종류의 패배가 그렇지 않습니까? 나는 대답을 알지 못하기 때문에 MySQL에 시간대를 묻고 싶다. 어쩌면 나는 혼란스럽고 문제가 있습니다. 누군가 설명 할 수 있습니까?
Senthil

1
@Senthil mySQL DATETIME유형에는 시간대 정보가 없습니다. 따라서, 여기에 의도 된 기본 철학은 mySQL이 가능한 한 시간대 맹목적이라고 생각합니다. 즉, 사용자는 UTC 또는 서버가있는 표준 시간대 중 하나를 고수하고 모든 것을 해당 영역에 저장하고 응용 프로그램 수준에서 또는 CONVERT_TZ()( dev.mysql.com/doc/refman/5.0/en/… )을 사용하여 변환을 수행하십시오 . 적어도, 그것이 그것이 어떻게 작동 해야하는지 이해하는 방법입니다 .mySQL 이이 분야에서 제공하는 스파 스 옵션을 살펴보십시오.
Pekka

고맙지 만 여전히 해결되지는 않지만 now()PHP 결과로 tz 정보를 얻는 방법은 무엇입니까?
user198729

"타임 스탬프를 저장할 때 하나의 시간대를 고수"부분에 전적으로 동의합니다. 그러나이-> ".. 또는 서버가있는 시간대"는 어떻게 알 수 있습니까? 모든 타임 스탬프 값을 UTC로 저장했다고 가정 해 보겠습니다. 그러나 서버가 다른 시간대에 있으며 해당 시간대 에 따라 타임 스탬프 값을 표시하려고 합니다. 서버가 어떤 시간대에 있는지 어떻게 알 수 있습니까? 그런 다음에야 CONVERT_TZ ()에 값을 전달하여 올바르게 변환 할 수 있습니까?
Senthil

196

아래 쿼리는 현재 세션의 시간대를 반환합니다.

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

6
이것은 'SYSTEM'이 변환의 시간대로 인식되어 NOW ()를 모든 시간대로 변환하기에 충분하다는 것을 보여주기 때문에 실제로 정답입니다.
nilskp

5
: 덕분에,이 I를 사용하여 내가 원하는 형식으로 얻을 수있었습니다select time_format(timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00')),'%H%i');
jordanbtucker

97
SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP)더 간단합니다.
Jakub Vrána

3
또는 SELECT TIMESTAMPDIFF(SECOND, NOW(), UTC_TIMESTAMP);몇 초 만에 차이를 얻을 수 있습니다.
philfreo

106

간단히 SELECT @@system_time_zone;

반환 PST(또는 시스템과 관련된 모든 것).

세션 시간대를 결정하려는 경우 다음 쿼리를 사용할 수 있습니다.
SELECT IF(@@session.time_zone = 'SYSTEM', @@system_time_zone, @@session.time_zone);

시스템 시간대와 다른 경우 세션 시간대를 반환합니다.


6
유일한 단점은 일광 절약 시간제 변경으로 인해 시간대가 변경되면 서버를 시작할 때 "기억 된"시간대를 계속보고한다는 것입니다. mysql 버그 9518
Mark

72

으로 자쿱 브라 나 (작성자 또는 AdminerNotORM가 ) 코멘트에 언급, 현재의 오프셋 (offset) 시간대 선택 TIME사용 :

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);

02:00:00시간대가 해당 날짜의 +2 : 00 인 경우 반환됩니다.

여기에 치트 시트를 만들었습니다 : MySQL의 시간대를 UTC로 설정해야합니까?


또는 SELECT TIMESTAMPDIFF(SECOND, NOW(), UTC_TIMESTAMP);몇 초 만에 차이를 얻을 수 있습니다.
philfreo

@philfreo에 추가-매개 변수는 TIMEDIFF와 비교하여 TIMESTAMPDIFF에서 반전되어야합니다. TIMEDIFF 반환하는 경우,이 답변에 주어진 예제를 이용하려면 02:00:00, 해당 TIMESTAMPDIFF이 반환 -2장치가 HOUR 경우, -120장치가 MINUTE 경우 시간대에 해당하는 기호를 얻으려면 등의 매개 변수를 교환, : SELECT TIMESTAMPDIFF(MINUTE, UTC_TIMESTAMP, NOW())예상 돌아갑니다 120시간대를 들어 +2 : 00. 분을 지정하는 이유는 30 분 또는 45 분 오프셋 된 몇 개의 시간대가 있기 때문입니다. en.wikipedia.org/wiki/Time_zone
ToolmakerSteve

1
이것은 질문에 직접 대답하고 이론 대신 솔루션을 제공하기 때문에 허용되는 답변보다 훨씬 나은 답변입니다.
supersan

10

mysql의 현재 시간대를 얻으려면 다음을 수행하십시오.

 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

이제 mysql 시간대를 변경하려면 다음을 수행하십시오.

 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`

이렇게하면 시간대가 정수 (예 :)로 반환되어 -6양수 또는 음수 시간을 처리합니다 (여기서 실행되는 위치 EXTRACT: HOUR함수만으로는 음수 시간대를 양수로 반환 함).


6

누구든지 mysql db의 시간대를 찾게됩니다.

이 쿼리를 사용하면 현재 시간대를 얻을 수 있습니다.

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

4

설명에서 언급 된 명령은 서버의 시간대를 사용함을 나타내는 "SYSTEM"을 리턴합니다. 쿼리에 유용하지 않습니다.

다음 쿼리는 시간대를 이해하는 데 도움이됩니다.

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

위의 쿼리는 UTC (협정 세계시)와 관련하여 시간 간격을 제공합니다. 따라서 시간대를 쉽게 분석 할 수 있습니다. 데이터베이스 시간대가 IST 인 경우 출력은 5:30입니다.

UTC_TIMESTAMP

MySQL에서 UTC_TIMESTAMP는 함수 사용에 따라 문자열 또는 숫자 컨텍스트에서 현재 UTC 날짜 및 시간을 'YYYY-MM-DD HH : MM : SS'또는 YYYYMMDDHHMMSS.uuuuuu 형식의 값으로 반환합니다.

지금()

NOW () 함수. MySQL NOW ()는 함수의 컨텍스트 (숫자 또는 문자열)에 따라 현재 날짜 및 시간 값을 'YYYY-MM-DD HH : MM : SS'형식 또는 YYYYMMDDHHMMSS.uuuuuu 형식으로 반환합니다. CURRENT_TIMESTAMP, CURRENT_TIMESTAMP (), LOCALTIME, LOCALTIME (), LOCALTIMESTAMP, LOCALTIMESTAMP ()는 NOW ()의 동의어입니다.


2

확인 MySQL 서버 시간대 지원system_time_zone시스템 변수를. 도움이 되나요?


@user 질문에 정확하게 찾고있는 정보 (서버의 시간대? 클라이언트의 정보)와 어떤 도구를 사용할 수 있습니까? 당신은 PHP를 언급합니다. 명령 행에 액세스 할 수 있습니까?
Pekka

5
@ user 또한, 당신이 도움이 되려고 노력하는 사람들의 대답을 약간 거칠게 생각합니다. 나는 투표 나 점수 손실을 신경 쓰지 않지만, 당신의 태도는 해결책을 찾기 위해 더 이상 격려하지 않습니다.
Pekka

3
@user, 내가 말했듯이, 당신의 태도는 특히 당신이 제공하는 빈약 한 정보에 비추어 당신을 위해 추가 답변을 연구하도록 동기를 부여하지 않습니다. 죄송합니다.
Pekka

3
@ user198729 :와, 태도를 잃어 버리세요. 페카는 사람들을 정말로 도와주는 사람입니다. 예의만으로는 동기를 부여하기에 충분하지 않은 경우 자기 이익을 시도하십시오.
TJ Crowder

2
단지 내 생각 : 사용자가 내 게시물에 대해 똑같은 일을했다면 나는 화를 내지 않았을 것입니다. 최종 기한 압박이나 좌절은 사람들 주변에 약간의 경계를 더해 주지만 어느 정도는 허용해야한다고 생각합니다. 어쩌면 나는 너무 용서합니다 : |
Senthil

1

내 PHP 프레임 워크는

SET LOCAL time_zone='Whatever'

연결 후 '여기서'== date_default_timezone_get ()

내 해결책은 아니지만 이렇게하면 SYSTEM MySQL 서버의 시간대는 항상 PHP의 시간대와 동일합니다.

예, PHP는 강력하게 관련되어 있으며 영향을 줄 수 있습니다


1

시간대에 따라 현재 시간을 얻으려면 다음을 사용할 수 있습니다 (제 경우에는 '+5 : 30')

DATE_FORMAT (convert_tz (now (), @@ session.time_zone, '+ 05:30'), '% Y- % m- % d')를 선택하십시오.


0

System의 시간대를 변경 한 후 mysqld를 다시 시작하면됩니다.

MySQL의 글로벌 시간대는 시스템의 시간대를 사용합니다. 시스템의 이러한 속성을 변경하면 Mysqld를 다시 시작하면됩니다.


OS에서 시간대를 변경하면 mysql inserts는 새 시간대를 사용하지만 now ()를 선택합니다. current_timestamp를 선택하십시오. 명령은 여전히 ​​기존 시간대를 사용합니다. 이 모든 것을 동기화하려면 mysql 서비스를 다시 시작해야합니다.
Manoj Kumar G

0

타임 스탬프가있는 데이터베이스 중 하나에 더미 레코드 삽입 해당 레코드를 선택하고 타임 스탬프 값을 가져옵니다. 해당 레코드를 삭제하십시오. 서버가 데이터를 쓰는 데 사용하는 시간대를 확인하고 PHP 시간대를 무시합니다.


0

다음을 시도 할 수 있습니다.

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

여기에서 시차를 초로 지정할 수 있습니다


1
오프셋을 더하거나 빼지 않아야합니다. 일광 규칙을 말하는 등 그것은 지뢰밭입니다
eweb

0

LPAD(TIME_FORMAT(TIMEDIFF(NOW(), UTC_TIMESTAMP),’%H:%i’),6,’+')와 함께 편리하게 사용할 수있는 MySQL 시간대 형식의 값을 얻는 데 사용하십시오 CONVERT_TZ(). 일광 절약 시간제를 사용하는 경우 시간이 지남에 따라 오프셋이 변경 될 수 있으므로 시간대 오프셋은식이 평가되는 순간에만 유효합니다. 그러나이 표현은 NOW()현지 시간으로 오프셋을 저장하는 데 유용하며 ,이 결과는 NOW()산출량 을 명확하게 합니다. (DST 시간대에서는 NOW()1 년에 한 번 1 시간 뒤로 이동하므로 특정 시점에 대해 중복 값이 ​​있습니다).


0

아마도

select timediff(current_time(),utc_time())

이 방법으로 시간대 값을 직접 얻을 수는 없습니다.

@@global.time_zone 변수이므로 사용할 수 없으며 값을 반환합니다. 'SYSTEM' .

을 사용하여 시간대가 변경된 세션에서 쿼리를 사용해야하는 경우을 사용하여 session SET TIME_ZONE =얻을 수 있습니다 @@session.time_zone. 당신이 쿼리 @@global.time_zone하면 얻을 수 'SYSTEM'있습니다.

당신이 시도하는 경우 datediff, date_sub또는 timediff으로 now()하고 utc_time(), 그때는 아마 변환 문제로 실행하겠습니다.

그러나 위에서 제안한 것은 적어도 일부 서버 버전에서 작동 할 것입니다. 내 버전은 5.5.43-37이며 호스팅 솔루션입니다.


이것은 분명히 질문에 대답하지 않습니다. 아마도 질문에 집중하도록 편집 할 수 있습니다 .
Mogsdad

-3

다음 코드를 사용해보십시오.

//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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.