【问题标题】:Convert a timezone value to datetime and insert将时区值转换为日期时间并插入
【发布时间】:2022-01-05 18:37:29
【问题描述】:

我在将字段插入数据库时​​遇到问题,类型转换会保留时区

UPDATE order o
SET o.data_envio = CONVERT( '2022-01-05T14:47:00-03:00', DATETIME );

1292 - 截断不正确的日期时间值:'2022-01-05T14:47:00-03:00'

【问题讨论】:

  • 您确定 o.data_envio 的类型为“DATETIME”吗?

标签: mysql mariadb


【解决方案1】:

你想用STR_TO_DATE()函数转换时间戳:

https://mariadb.com/kb/en/str_to_date/

像这样:

   UPDATE order o
   SET o.data_envio = STR_TO_DATE( '2022-01-05T14:47:00-03:00', '%Y-%m-%dT%H:%i:%s')

这里唯一的缺点是您会丢失时区信息。

【讨论】:

  • 在严格模式下,最后的偏移量会使这个失败,就像转换一样“截断不正确的日期时间值”。如果他们想忽略偏移量,他们必须使用 '%Y-%m-%dT%H:%i:%s%.%#:%#' fiddle 格式明确地做到这一点
【解决方案2】:

这需要mysql 8;它不适用于 5.7 或更早版本,或任何版本的 mariadb(至少 10.7.1)。

相反,您可以这样做:

SET o.data_envio = convert_tz('2022-01-05T14:47:00','-03:00','+00:00')

注意第一个参数不能有偏移量;它必须作为第二个参数提供。如果你必须在你的 sql 中删除它,而不是你的代码,并且你的日期总是格式正确(没有丢失 - 或 :,每个部分总是两位数,除了四位代表年份),你可以这样做:

UPDATE `order` o SET o.data_envio = CONVERT_TZ(
    SUBSTRING('2022-01-05T14:47:00-03:00' FROM 1 FOR 19),
    SUBSTRING('2022-01-05T14:47:00-03:00' FROM 20),
    '+00:00'
)

【讨论】:

  • UPDATE vendas v SET v.data_envio = convert_tz('2018-01-30T12:00:00-03:00', '-03:00', '+00:00' ) WHEREv. id_venda = 525816 错误更新 vendas v set v.data_envio = convert_tz('2018-01-30T12:00:00-03:00','-03:00','+00:00') 其中 v.id_venda = 525816 > 1292 - 截断不正确的日期时间值:'2018-01-30T12:00:00-03:00' > 时间:0,036 秒
  • @ElvisReis 是的,你不能在日期时间上有偏移量,你必须把它作为 convert_tz 的第二个参数。总是-03:00吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-08
  • 2021-05-02
  • 1970-01-01
  • 1970-01-01
  • 2018-06-05
  • 2019-05-21
相关资源
最近更新 更多