created: 2023-08-28T01:28:21.800Z

BigQuery で TIMESTAMP, DATETIME のパースやタイムゾーンの指定についてまとめ

毎回コンソールに行って SELECT して確認しながら実装していたのでありそうなやつをメモ。

SELECT 
  -- TIMESTAMP はだいたいの形式は通る
  TIMESTAMP("2020-01-01 00:00:00"),
  TIMESTAMP("2020-01-01 00:00:00.000000 UTC"),
  TIMESTAMP("2020-01-01T00:00:00+00:00"),
  TIMESTAMP("2020-01-01T00:00:00Z"),
  TIMESTAMP("2020-01-01T00:00:00+09:00"),  --> UTC にしてくれる '2019-12-31 15:00:00 UTC'

  -- DATETIME型もだいたい大丈夫だけど、どのタイムゾーンかの情報をつけてあげる必要がある
  DATETIME("2020-01-01 00:00:00", "Asia/Tokyo"),  --> '2020-01-01T09:00:00'
  DATETIME("2020-01-01 00:00:00Z", "Asia/Tokyo"),
  DATETIME("2020-01-01T00:00:00Z", "Asia/Tokyo"),
  DATETIME("2020-01-01T00:00:00+00:00", "Asia/Tokyo"),  --> '2020-01-01T09:00:00'
  DATETIME("2020-01-01T00:00:00+00:00", "UTC"),  --> '2020-01-01T00:00:00'

  -- この形式だとタイムゾーンを指示しなくても DATETIME にしてくれる
  DATETIME("2020-01-01 00:00:00"),

  -- DATETIME でもタイムゾーンを指定しないとダメな形式
  -- DATETIME("2020-01-01T00:00:00Z"),  `Invalid datetime string`
  -- DATETIME("2020-01-01T00:00:00+00:00"), `Invalid datetime string`

  -- RFC 2822 形式 は頑張らないとパースしてくれない `%b` とかほとんど使わない
  -- TIMESTAMP("Aug 2023 15:30:00 +0000"),
  PARSE_TIMESTAMP('%b %Y %H:%M:%S %z', 'Aug 2023 15:30:00 +0000'),

  -- unixtime は `TIMESTAMP_SECONDS` をつかう
  TIMESTAMP_SECONDS(1630156200),

参考

サイバーセキュリティの教科書
[ad] サイバーセキュリティの教科書
Thomas Kranz, Smoky (単行本(ソフトカバー))