TimestampとDatetime


TimestampとDateTimeホットスポット

TimestampDatetimeの最大の違いは、timezoneの情報がユニークであることである.
我々のグループが実装するAPIサーバロジックは、JavaコードからLocalDateTime.now()を呼び出し、APIサーバコンピュータのtimezone時間情報を利用してLocalDataTimeオブジェクトを生成し、timestampタイプのcreated_at列にデータを入れることによって実現される.
AWS上でAPIサーバを配備してテストした後、Createat上の予想値とは異なる問題が発生しました.つまり、データは-9時間処理されます.
これは、AWSで作成されたインスタンスのデフォルトのtimezone環境変数がUTCに設定されているためです.ubuntutimezone設定を様々な方法で変更し、terminalウィンドウにdateコマンドを入力し、KSTに変更されたことを確認し、試行を続けたが、困難に直面した.
通常時間終了後にテストを行ったところ、timezone変数を修正する操作はUbuntu OSに表示されている設定にのみ触れており、実際に使用されているjavaコードのシステム環境変数は変更されていないことがわかり、これは問題のようです.Javaコードにおいて、LocalDateTimeは、対応する実行環境コンピュータのtimezone設定に従い、timezone設定をKSTに変更したが、Javaに見られるtimezone設定はUTCのままであるため、Javaセグメントにおいて誤った時間でクエリ文が生成される.

##テストプロセス...



まず,テスト用javaコードを記述し,ubuntuサーバのtimezone環境変数をテストした.

1.tzselect設定方法

$ sudo tzselect

Asia/Seoulに変更しても、javaに見えるtimezoneUTCであることが確認できます.
しかし、dateコマンドを入力すると?

今はKST時間です.そのため,環境変数が正しく変更され,困難に直面していると勘違いされている.

2.ln-sf/usr/share/zoneinfo/ASIA/Seoul/etc/localtimeの設定方法

$ sudo ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime

同様に、javaUTCとされている.

3.timedatectl set-timezone「Asia/seoul」の設定方法

$ sudo timedatectl set-timezone 'Asia/Seoul'

困難な部分


先日TimestampDatetimeの違いを学習した場合、最大の違いはtimezoneの反映の有無である.timestampは、格納されているデータ自体にtimezoneの情報が含まれていると考え、テストを行ったところ不適切な点が多すぎることに気づき、しばらくうろうろしていました.これは間違った考えです.
DBは、timestamp型のカラムデータを単純に格納する場合にのみ、クエリ入力の文字列値をUTC形式に変換して格納し、検索時に格納したUTC形式のデータを呼び出しポイントのDB timezone時間に戻す.
そのため、1枚の表に世界中の人の投稿データと記入時間を保存し、国ごとに適切な時間で表示することは不可能で、timestamp列しかありません.

たとえば、タイムスタンプによって作成されたサービスを適用できます。


  • データベースは1つ、timezoneUTCに設定されています.

  • テーブルを国ごとに分けて、한국에서 쓴 글을 모아둔 테이블미국에서 쓴 글을 모아둔 테이블...それぞれの国が文章を書く時間を貯める.
  • サーバからDBに接続するときに、接続ごとにtimezoneが個別に設定されている場合、テーブルに格納されている書き込み時間は国によって提供されます.
    最終的には、クエリ文を渡してtimestamp列にデータを入れる場合、'2022-04-12 22:15:00'列に時間を入れるか、クエリ文でnow()を呼び出し、データベース・サーバ自体が設定したtimezoneを使用して時間を追加するかに注意する必要があります.
    前者については、java段において各国timezoneに該当する現在時刻を生成してクエリ文に入れるだけで、きれいに処理することができる.
    後者の場合、now()を使用する場合は、データベース・サーバのtimezoneの設定に注意し、クエリ文に入る時間誤差が時差に合致するように処理を追加する必要があります.下の形のようです.
    insert into task (..., created_at) values (... ,CONVERT_TZ(now(),'+00:00','+09:00'));
    最終的には、グローバルに提供する必要があるサービスを作成する際にtimestamp形式を採用する場合、
  • 한국에 사는 A일본에 사는 Bが同時に文章を書くと、미국에 사는 Cが2つの文章を読んでも1분 전 작성된 글 입니다.と簡単に表記することができます.

  • 関連項目:
  • https://velog.io/@taelee/mysql%EC%97%90%EC%84%9C-9%EC%8B%9C%EA%B0%84-%EC%B0%A8%EC%9D%B4%EB%82%A0%EB%95%8CGCP
  • https://offbyone.tistory.com/318
  • https://www.eversql.com/mysql-datetime-vs-timestamp-column-types-which-one-i-should-use/