2016-04-29 10 views
0

私はdb worldを初めて使っています。私はmysqlデータベースに保存するために、Javaプログラムから '2016-04-27 09:00:00'のようなdatetime値を送信しています。私の質問は、どのようにこの値はdatetime型のフィールドにmysqlのdbテーブルに保存されます。つまり、渡された文字列として格納されるか、またはmysqlが文字列を解析してUTCのタイムスタンプを構築し、その数値をdbに格納するかどうかです。さらに、mysqlサーバーとjavaサーバーの異なるタイムゾーン設定に関係なく、このストアド値はJavaプログラムから取得されますか?datetime値はどのようにmysqlに格納されますか?

申し訳ありませんが、このような愚かな質問をしていますが、それは私をたくさん傷つけ、インターネット上で検索しながら、単純であまり混乱しない答えを得ることはありませんでした。

+0

このブログの投稿には、「日付の保存方法」(https://www.informit.com/library/content.aspx?b=STY_Sql_24hours&seqNum=93) – Phiter

+0

ネイティブタイプがネイティブフォーマットで保存されています。 –

+1

あなたは「それは私をたくさん傷つけています」と、 – Drew

答えて

2

mysql 5.6.4以降のdatetimeデータ型は、マニュアルページDate and Time Data Type Representationの説明に従って保存されます。つまり、分数秒を含む5バイトの形式であり、タイムゾーン情報とは離されています。

テストテーブル

create table dtTest 
(
    id int auto_increment primary key, 
    dt datetime not null 
); 

insert dtTest (dt) values ('2016-04-27 09:00:00'); 

これを確認するために必要な1場合は、1が保存されたファイルのバイナリエディタにジャンプし、その日時のビッグエンディアン形式を確認できます。

'%datadir%'のような変数を表示します。フォルダとdbテーブルに

C:\ProgramData\MySQL\MySQL Server 5.6\Data\ 

トラバース(dtTest.ibd)

タイムゾーンのためのシステムおよびセッション変数があります: '%のsystem_time_zoneの%' のような

ショーの変数は、

Eastern Daylight Time 

'%time_zone%'のような変数を表示します。

SYSTEM 

私はこれらの重要性を完全に無知だということを明確にしましょう。うまくいけば、同輩は明快さを加えることができます。

SELECT @@ global.time_zone、@@ session.time_zone;

SYSTEM SYSTEM 

テスト別の何かにリセット:dtTestから選択

SET SESSION time_zone = '+10:00'; 

*;

上記の設定変更は、データの出力には影響しません。これはまだ未加工であり、タイムゾーンとは無関係です。仕事をする上でのため

SET SESSION time_zone = 'America/Chicago'; 

、以下を参照してください。バックセッションを設定

SET SESSION time_zone = '+10:00'; 

SELECT @@global.time_zone, @@session.time_zone; 
SYSTEM  +10:00 

http://dev.mysql.com/doc/refman/5.6/en/mysql-tzinfo-to-sql.html

そうでない場合は、ロードされているタイムゾーンのサポートなしで、1は次のような何かを実行する必要があります私のデフォルトに:

SET SESSION time_zone = 'SYSTEM'; 

SELECT COUNT(*) FROM mysql.time_zone_name; 

私はまだ

SELECT CONVERT_TZ('2007-03-11 3:00:00','US/Eastern','US/Central'); 

タイムゾーンのサポートテーブルをロードしていないので、私のカウントが0である - これは私のためにNULLです。私のシステムにサポートテーブルがまだロードされていません。

SELECT CONVERT_TZ('2007-03-11 3:00:00','-4:00','-7:00'); 

2007-03-11 00:00:00 - 午前3時NYCはサンフラン

にmidniteであることを意味したがって、上記のUTC時間オフセットを読むことが少ない優しい(NULLではありませんハードコーディングされました。 )。

dtTestからのSELECT ID、CONVERT_TZ(dt、 ' - 4:00'、 ' - 7:00'); - dtは

1 2016-04-27 06:00:00 

上記のSELECT文はできるが、サンフラン時間にNYC時間からそれを変換し、デシベルで午前9時値をとり、私の列の名前でした。

それは私があなたのために持っている最高です。うまくいけば、誰かが時間帯のサポートの欠落した詳細を記入することができます。

関連する問題