【问题标题】:Date with time in JSON_TABLE doesn't save timeJSON_TABLE 中带时间的日期不会节省时间
【发布时间】:2021-12-05 12:58:59
【问题描述】:

我有这段代码,它给定一个 JSON 数组将它插入一个表中:

INSERT INTO log (
   "uuid",
   "date",
   "msg",
   "level"
)
   WITH t ( log ) AS (
      SELECT
         JSON_QUERY('[{"uuid": "20000000-0000-0000-0000-000000000000", "date": "2021-10-18T13:49:15+01:00", "msg":"aaaa", "level": "debug" },
                  {"uuid": "20000000-0000-0000-0000-000000000000", "date": "2021-10-18T13:49:15+01:00", "msg":"bbbb", "level": "debug" }]'
         , '$')
      FROM
         dual
   )
   SELECT
      "uuid",
      "date",
      "msg",
      "level"
   FROM
      t
      CROSS JOIN
         JSON_TABLE ( log, '$'
            COLUMNS (
               NESTED PATH '$[*]'
                  COLUMNS (
                     "uuid" VARCHAR2 ( 36 ) PATH '$.uuid',
                     "date" DATE PATH '$.date',
                     "msg" VARCHAR2 ( 1024 ) PATH '$.msg',
                     "level" VARCHAR2 ( 5 ) PATH '$.level'
                  )
            )
         )

这只是将日期(2021-10-18)保存到数据库中,而不是时间。如何保存日期和时间?

【问题讨论】:

  • 日期存储为比特包。时间是一直保存的,但是要显示正确的nls_date_format
  • @RobertoHernandez 虽然是这样,但db<>fiddle 并没有发生这种情况。
  • @RobertoHernandez @MTO 解决方案对我有用,奇怪的是它适用于timestamp 但不适用于date,因为日期也支持时间!
  • @user5507535,我用date 发布了一个适合我的解决方案
  • @MTO,我为date 列发布了一个解决方案,尽管我认为你的时间戳更干净。

标签: sql json oracle datetime oracle12c


【解决方案1】:

使用TIMESTAMPTIMESTAMP WITH TIME ZONE

INSERT INTO log ( "uuid", "date", "msg", "level" )
  WITH t ( log ) AS (
    SELECT JSON_QUERY(
             '[{"uuid": "20000000-0000-0000-0000-000000000000", "date": "2021-10-18T13:49:15+01:00", "msg":"aaaa", "level": "debug" },
             {"uuid": "20000000-0000-0000-0000-000000000000", "date": "2021-10-18T13:49:15+01:00", "msg":"bbbb", "level": "debug" }]',
             '$'
           )
    FROM   dual
  )
  SELECT "uuid",
         "date" AT TIME ZONE 'UTC',
         "msg",
         "level"
  FROM   t
         CROSS JOIN JSON_TABLE(
           log,
           '$[*]'
           COLUMNS (
             "uuid" VARCHAR2 ( 36 ) PATH '$.uuid',
             "date" TIMESTAMP WITH TIME ZONE PATH '$.date',
             "msg" VARCHAR2 ( 1024 ) PATH '$.msg',
             "level" VARCHAR2 ( 5 ) PATH '$.level'
           )
         )

db小提琴here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-04
    • 2018-02-07
    • 2018-10-01
    相关资源
    最近更新 更多