【问题标题】:What datatype should I use for "2020-04-11T19:54:00.0000000Z" in a MySQL SQL database?MySQL SQL 数据库中的“2020-04-11T19:54:00.0000000Z”应该使用什么数据类型?
【发布时间】:2020-07-25 09:54:21
【问题描述】:

2020-04-11T19:54:00.0000000Z 是什么时间格式?是否应该在 SQL 数据库中输入 DATEDATETIMETIMESTAMPTIMEYEAR

【问题讨论】:

  • 看起来像一些 ISO 8601 变体。您使用的是什么 DBMS?标记它。
  • 有问题的时间数据格式是 API 结果的一部分
  • 您想知道使用什么数据类型,不是吗?对于那个问题,它来自哪里并不有趣,但它应该存储在哪个 DBMS 中(数据类型,特别是日期/时间类型因 DBMS 而异)。您现在标记了 phpMyAdmin。但这只是一个客户端,而不是 DBMS。我假设 DBMS 是 MySQL。我正在为你更改标签。如果假设是错误的,请纠正它。
  • 谢谢粘位。我也会改写问题的标题

标签: mysql sql date datetime timestamp


【解决方案1】:

这是ISO-8601。格式包括日期、可能精确到秒的时间和时区信息。

基本上你应该使用 DATETIME,或者转换为 UNSIGNED INT,这取决于你喜欢什么。

魔鬼在细节中。如果您收到的所有值都以 Z 结尾,那么您可以假设您收到的日期时间为 UTC。只需使用 DATETIME 并注意您的 MySQL 服务器设置为 UTC 时区。

您是否需要存储时区名称以供以后检索?在这种情况下,您需要将输入值解析为两个字段。一个字段将日期时间保持为 UTC 格式,第二个字段用于存储时区值(MySQL 的日期时间字段类型不存储时区值)。还要注意将输入值转换为 UTC。如果您使用 MySQL 8.0.19 或更高版本,it can do that for you

请注意将您的 MySQL 服务器时区变量设置为 UTC。

【讨论】:

  • 注意 TIMESTAMPUNSIGNED INT 目前存在 Y2038 问题,如果您走这条路,请考虑 UNSIGNED BIGINT。请记住,如果您使用整数类型进行日期查询,则您正在回复隐式转换。
  • 很高兴提到@danblack。事实上,MySQL 8 中 mysql 的 select from_unixtime() 函数根本不接受 > 2147483647 的参数。所以使用 UNSIGNED INT 没有什么意义。 MySQL 可能会在未来的版本中解决这个问题,以及更改 TIMESTAMP 字段的大小。这是我几年后会担心的技术债务。除非@Mike Pistachio 迫切需要存储远在未来的时间戳,否则他会更喜欢使用 TIMESTAMP/INT 方式。
猜你喜欢
  • 2020-07-16
  • 1970-01-01
  • 2017-05-01
  • 2019-07-04
  • 2011-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-04
相关资源
最近更新 更多