2016-11-30 5 views
1

mysqlのunix_timestampからutc datetimeを取得する方法を知りたいと思います。MySQLのUNIX_TIMESTAMP()からUTC Datetimeを取得する方法

しかし、CONVERT_TZは使用しないでください。

エラーはSQLスキーマに発生する(パーティショニングにタイムゾーン機能を使用することができませんでしたので。)

...

CREATE TABLE `table` (
    `idx` BIGINT(20) NOT NULL, 
    etc... 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 
PARTITION BY RANGE(YEAR(CONVERT_TZ(from_unixtime(`idx` >> 24), @@session.time_zone, '+00:00'))) 
SUBPARTITION BY HASH (MONTH(CONVERT_TZ(from_unixtime(`idx` >> 24), @@session.time_zone, '+00:00'))) 
SUBPARTITIONS 12 (
    PARTITION p2016 VALUES LESS THAN (2016), 
    PARTITION p2017 VALUES LESS THAN (2017), 
    PARTITION p2018 VALUES LESS THAN (2018), 
    PARTITION p2019 VALUES LESS THAN (2019), 
    PARTITION p2020 VALUES LESS THAN (2020) 
) 
+0

ご覧ください。https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_utc-timestamp – mba12

+0

申し訳ありませんが...間違いを... UTC_TIMESTAMPはUNIX_TIMESTAMPです.. – user212942

+0

'idx' columeの最も重要な40ビットはUNIX_TIMESTAMPです。 – user212942

答えて

0

私はあなたの問題はCONVERT_TZではないと思うが、FROM_UNIXTIME

FROM_UNIXTIMEは、整数を引数として取ります。これは32ビットを意味します。

unix-timestamp:1480546792を右に移動すると、unix_timeの有効なパラメータの32ビット制限を超えてしまいます。

from_unixtime2147483647件までのパラメータを処理することができます - それは2038-01-19 04:14:07

私もこの問題に遭遇した、と2002年以来、このための修正プログラムは、「開発中」であるまで働き、を意味します。

最終的に解決されるまで、date_addを使用して回避策を使用する必要があります。あなたがここにバインドしている

SELECT from_unixtime (2147483647); //2038-01-19 04:14:07 
SELECT from_unixtime (2147483648); //NULL 

SELECT date_add(from_unixtime(0), Interval 2147483647 second) //2038-01-19 04:14:07 
SELECT date_add(from_unixtime(0), Interval 2147483648 second) //2038-01-19 04:14:08 
+0

あなたの答えをありがとう。 私の 'idx' colume形式は(UNIX_TIMESTAMP()<< 24 + other number [24bit])です。 ちょうど年と月で分割したい。 – user212942

+0

@ user212942あなたは 'idx'に値の例を提供できますか?どこで失敗するのですか? – dognose

0

:代わりに

from_unixtime (x) 

使用

date_add(from_unixtime(0), INTERVAL x second) 

結果(複数可)の。あなたは、日付/時間項目としてTIMESTAMPデータ項目をレンダリング、MySQLは暗黙のうちに現地時間を現在の接続のtime_zone設定によって制御されている現地時間(までUTCからそれを変換するたび。それが実行不可能制御するYEAR(timestamp)を使用できるようになり

UNIX_TIMESTAMP() DIV (365 * 24 * 60 *60)またはそのようなものを使用することができますが、それはあなたが使用することができますか?そのような変換を実行するには、MySQL date and time functionsで何かを行うと変換が実行されます。あなたのパーティショニングを制御する年数を近似します。それは、密接で、不正確で、決定論的です。

また、パーティション化にはUNIX_TIMESTAMP() DIV 16777216またはUNIX_TIMESTAMP() >> 24を使用できます。それは2^24です。これは194日強です。それは恣意的です。しかし、何年も良いパーティション分割がある場合、これらの期間も同様です。また、インデックス作成にビットフィールドモデルを使用しています。

+0

OK ..お返事ありがとうございます〜 – user212942

関連する問題