programing

MySQL CONVERT_TZ()

starjava 2023. 8. 30. 21:04
반응형

MySQL CONVERT_TZ()

사용자가 지정한 일일 알림 시간을 저장하는 데이터베이스를 설정하려고 합니다.예를 들어, 사용자는 매일 오전 7시에서 7시 30분 사이에 일부 기준이 충족되면 경보를 수신하려고 합니다.이를 구현하기 위해 저는 일광 절약 시간을 수용해야 합니다.제가 시도한 해결책은 다음과 같습니다.

  1. 사용자 로컬 표준 시간대(예: "US/Eastern") 정보를 한 테이블(예: userInfo)에 저장하고 알람 시간을 다른 테이블(예: userAlarm)에 저장합니다.
  2. userAlarms 테이블을 쿼리할 때 UTC 시간을 userInfo 테이블에 저장된 tz 열로 지정된 사용자 현지 시간으로 변환합니다.CONVERT_TZ(UTC_TIME(), 'UTC', userInfo.tz).

질문 1.표준 시간대 이름(예: 미국/동부)을 지정하는 것은 일광 절약 시간을 고려해야 하는 것으로 알고 있습니다.예를 들어, 호출CONVERT_TZ('00:00:00', 'UTC', 'US/EASTERN')1월 1일에는 '19:00:00'을 생성해야 하지만 7월 1일에는 '20:00:00'을 생성해야 합니다.내가 맞나요?

질문 2.Q1이 맞다면, 표준 시간대 UTC 오프셋을 최신 상태로 유지하기 위해 MySQL의 표준 시간대 테이블을 지속적으로 업데이트해야 합니까?

질문 3.MySQL 문서에 제시된 샘플SELECT CONVERT_TZ('2004-01-01 12:00:00','GMT','MET')산출물 "NULL내 서버에서 실행할 때.표준 시간대 테이블이 설정되어 있지 않아서 발생할 수 있습니까?

이걸 어떻게 확인해야 하나요?

이 값이 null이면 TZ 테이블이 설정되지 않은 것입니다.

SELECT CONVERT_TZ(now(),'US/Eastern','US/Central');

표준시 테이블을 설정하지 않은 경우 사용자 테이블의 시간 오프셋을 업데이트한 후 다음을 수행할 수 있습니다.

select utc_timezone() - interval user_timezone_offset_in_hours hour
from userinfo a
where user_id = 999;

그러나 사용자의 표준 시간대를 업데이트하는 방법이 여전히 필요합니다.

만약 당신이 웹 애플리케이션을 위해 이것을 쓰고 있다면, 당신은 자바스크립트를 통해 시간대를 얻을 수 있습니다. (이것을 시도하지 않았지만 효과가 있을 것으로 보이는) 방법을 설명하는 기사가 여기 있습니다.

위의 '간격'에 대한 약간의 설명은...

MySQL에서 더 많은 트릭 구조 중 하나는 다음과 같은 것을 사용하는 것입니다.INTERVAL키워드(예: 키워드는 식 또는 필드 값일 수 있음)

select now() today, now() - interval 1 day yesterday;
+---------------------+---------------------+
| today               | yesterday           |
+---------------------+---------------------+
| 2011-05-26 13:20:55 | 2011-05-25 13:20:55 |
+---------------------+---------------------+

원하는 대로 추가하고 뺄 수 있으므로 날짜/시간 추가/감산/변환 기능을 사용할 필요가 없습니다.

select now() a, now() - interval 1 day + interval 4 hour + interval 8 minute b;
+---------------------+---------------------+
| a                   | b                   |
+---------------------+---------------------+
| 2011-05-26 13:24:16 | 2011-05-25 17:32:16 |
+---------------------+---------------------+

음수를 사용할 수 있습니다(음의 시간대 오프셋에 적합해야 함). 다음은 동일합니다.

select now() - interval 1 month a, now() + interval -1 month b;
+---------------------+---------------------+
| a                   | b                   |
+---------------------+---------------------+
| 2011-04-26 13:38:05 | 2011-04-26 13:38:05 |
+---------------------+---------------------+

저는 이 스레드가 도움이 된다는 것을 알고 이 정보를 가져오기 위한 문서 페이지를 공유하기로 결정했습니다.저는 CentOS와 RHEL에서 아래의 지시에 따라 정확히 수행했고 완벽하게 작동했습니다.이제 "GMT" 및 "US/Eastern"과 같은 인수와 함께 CONVERT_TZ 함수를 사용할 수 있습니다.

MySQL 문서에서 MySQL 시간대 테이블 정보를 가져오는 방법은 다음과 같습니다.

http://dev.mysql.com/tech-resources/articles/4.1/time.html


Unix 기반 시스템에서 MySQL 4.1.3 이상을 실행하는 모든 사용자의 경우(Windows 시스템에서는 아직 작동하지 않음):

표준시 테이블을 채웁니다.

실행하려면 다음을 실행합니다.mysql_tzinfo_to_sqlMySQL 배포와 함께 제공되는 프로그램입니다.mysql_tzinfo_to_sql운영 체제 표준 시간대 파일을 읽고 이 파일에서 SQL 문을 생성합니다.그런 다음 mysql에서 SQL 문을 처리하여 표준 시간대 테이블을 로드합니다.

실행하기mysql_tzinfo_to_sql의 운영 이 저장된. 이 으로서, 시운체영제표와 합니다. 이름이 유사한 디렉토리를 확인합니다./usr/share/zoneinfo 이름을 줄에이리전달로 합니다.mysql_tzinfo_to_sql출력을 mysql 프로그램으로 보냅니다.여기 예가 있어요.

shell> mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql

참고: 위 명령은 "mysql_tzinfo_to_sql" 및 "mysql"이 경로에 있다고 가정합니다.그렇지 않은 경우 명령을 실행할 때 두 가지 모두에 전체 경로를 제공하거나 mysql bin 폴더로 전환하여 다음과 같은 명령을 사용해야 합니다.

shell> ./mysql_tzinfo_to_sql /usr/share/zoneinfo | ./mysql -u root mysql

Q1: 예, CONVERT_TZ는 일광 절약 시간을 고려합니다.이 정보와 각 시간대에 대해 DST가 시작/종료되는 시간은 time_zone_* 테이블에 저장됩니다.

Q2: 예, mysql 문서에 명시된 대로, 시간대 정보는 각 영역의 정치에 따라 달라집니다.변경이 발생할 때마다 time_zone_* 테이블을 업데이트해야 합니다.때때로 IT가 되는 것은 최악이지만, 이것은 그들 중 하나입니다.

Q3: 다음은 5개의 표준 시간대 표입니다. 표에 포함된 내용이 있는지 문의하십시오.

select * from mysql.time_zone_transition_type;
select * from mysql.time_zone_transition;
select * from mysql.time_zone_name;
select * from mysql.time_zone_leap_second;
select * from mysql.time_zone;

언급URL : https://stackoverflow.com/questions/2523286/mysql-convert-tz

반응형