80

MySQLは、通常のselectステートメントで保存されたUTC時刻をローカルタイムゾーン時刻に直接変換できますか?

タイムスタンプ(UTC)のデータがあるとします。

CREATE TABLE `SomeDateTable` (
  `id`    int(11) NOT NULL auto_increment,
  `value` float NOT NULL default '0',
  `date`  datetime NOT NULL default '0000-00-00 00:00:00',
  PRIMARY KEY  (`id`)
)

それから私が

"select value, date from SomeDateTable";

もちろん、保存されているUTC形式のようにすべての日付を取得します。

しかし、それらを別のタイムゾーン(DSTを使用)に置きたいとしましょう。次に、選択したクエリに魔法を追加して、選択したタイムゾーンのすべての日付を取得できますか?

"select value, TIMEZONE(date, "Europe/Berlin") from SomeDateTable";

または、いくつかのphpコードのように、上の他のレイヤーでこれを行う必要がありますか?(ほとんどの人がこの問題を解決した方法のようです)。


MySQLのインストールでCONVERT_TZを使用できる場合、それは非常にクリーンなソリューションです。この例は、その使用方法を示しています。

SELECT CONVERT_TZ( '2010-01-01 12:00', 'UTC', 'Europe/Stockholm' )

ただし、一部のMySQLインストールにはこの機能がないため、これが適切な方法かどうかはわかりません。注意して使用してください。

4

6 に答える 6

54

うん、convert_tz機能があります。

于 2010-02-02T20:58:55.013 に答える
34

「America/Denver」や「GMT」などの人間にわかりやすいタイムゾーン名を使用するようにmysql環境を構成できない場合(たとえば、SUPERアクセスがないため)、次のような数値オフセットを使用して関数を使用することもできます。

CONVERT_TZ(date,'+00:00','-07:00')
于 2013-08-23T23:48:15.187 に答える
12
select convert_tz(now(),@@session.time_zone,'+03:00')

時間を取得するには、次を使用します。

time(convert_tz(now(),@@session.time_zone,'+03:00'))
于 2016-07-11T08:32:51.263 に答える
8

簡単に使える

CONVERT_TZ(your_timestamp_column_name, 'UTC', 'your_desired_timezone_name')

例えば:

CONVERT_TZ(timeperiod, 'UTC', 'Asia/Karachi')

さらに、これはWHEREステートメントでも使用でき、タイムスタンプを比較するには、Where句で次を使用します。

WHERE CONVERT_TZ(timeperiod, 'UTC', '{$this->timezone}') NOT BETWEEN {$timeperiods['today_start']} AND {$timeperiods['today_end']}
于 2019-07-31T19:25:21.243 に答える
6

1.サーバーを正しくセットアップします。

サーバー上で、suをrootにして、これを実行します。

# mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql mysql

(もちろん、最後のコマンドは、同じ名前のテーブルmysqlに送信していることに注意してください:。)mysql

次に、あなたは今することができます# ls /usr/share/zoneinfo

そのコマンドを使用して、ubuntuまたはほぼすべてのunixishサーバーのすべてのタイムゾーン情報を表示します。

(ところで、これは、あるタイムゾーンの正確な正式名称を見つけるための便利な方法です。)

2. mysqlでは簡単です:

例えば

mysql> select ts, CONVERT_TZ(ts, 'UTC', 'Pacific/Tahiti') from example_table ;
+---------------------+-----------------------------------------+
| ts                  | CONVERT_TZ(ts, 'UTC', 'Pacific/Tahiti') |
+---------------------+-----------------------------------------+
| 2020-10-20 16:59:57 | 2020-10-20 06:59:57                     |
| 2020-10-20 17:02:59 | 2020-10-20 07:02:59                     |
| 2020-10-20 17:30:08 | 2020-10-20 07:30:08                     |
| 2020-10-20 18:36:29 | 2020-10-20 08:36:29                     |
| 2020-10-20 18:37:20 | 2020-10-20 08:37:20                     |
| 2020-10-20 18:37:20 | 2020-10-20 08:37:20                     |
| 2020-10-20 19:00:18 | 2020-10-20 09:00:18                     |
+---------------------+-----------------------------------------+
于 2020-10-21T14:23:38.923 に答える
2

私は使用することを提案します

SET time_zone = 'proper timezone';

データベースに接続した直後に1回実行されます。この後、すべてのタイムスタンプは選択時に自動的に変換されます。

于 2010-02-14T21:56:34.493 に答える