【问题标题】:Convert date from 'yyyy-dd-mm' to 'yyyy-mm-dd' using mysql query使用mysql查询将日期从'yyyy-dd-mm'转换为'yyyy-mm-dd'
【发布时间】:2012-09-06 18:11:23
【问题描述】:

我正在研究一个具有“yyyy-dd-mm hh:mm”格式的日期字段的数据库,我使用 STR_TO_DATE 将字段更改为“yyyy-mm-dd hh:mm”,但它返回了一个错误。

查询:

UPDATE transaction 
SET time_creation = STR_TO_DATE(time_creation, '%Y-%m-%d %H:%i');

错误:

日期时间值不正确:函数 str_to_date 的“2005-08-06 15:57:00”

我也对以下查询进行了检查:

SELECT 
   time_creation, 
   STR_TO_DATE(time_creation,'%Y-%m-%d %H:%i') AS DATE_FORMATTED 
FROM transaction;

并在 DATE_FORMATTED 列中为日期值获取 NULL,例如 '2007-22-11 15:32' 但对 '2007-09-11 13:12' 工作得很好。我不明白到底发生了什么。任何帮助表示赞赏.. 谢谢。

【问题讨论】:

  • 您是否将日期存储在字符串列中?
  • transaction_date列为varchar类型。
  • 为什么?在日期/日期时间列中存储日期和时间。

标签: mysql database


【解决方案1】:

你有

STR_TO_DATE(time_creation,'%Y-%m-%d %H:%i')

你给 '2007-22-11 15:32' 这意味着 'yyyy-dd-*mm* hh:mm'。

Sql 正在尝试解析包含数字 22 作为月份的日期...

路过

SELECT STR_TO_DATE('2005-08-06 15:57:00', '%Y-%m-%d %H:%i');

在我的 mysql 服务器上运行良好。

【讨论】:

  • 我现有的字段是yyyy-dd-mm hh:mm格式,'2007-22-11 15:32'是列中的现有记录。 .我想将其转换为 yyyy-mm-dd hh:mm
  • 因此,首先您可以尝试使用 STR_TO_DATE(strInYouFormat, '%Y-%d-%m %H:%i') 将其转换为 DateTime,然后再以任何格式重新转换为 str喜欢
【解决方案2】:

首先,您需要与我们共享表定义。听起来 time_creation 字段的列类型是 VARCHAR 而不是 DATETIME。所以你真的不应该尝试将结果存储回同一个字段。您希望将其保存到有效的 DATETIME 字段中,以便内在列类型正确。

其次,听起来您的某些值存储为 YYYY-DD-MM,而另一些则存储为 YYYY-MM-DD。是这样吗?如果是,您将需要更多逻辑来区分已经正确的值和不正确的值。但是,如果它们混合在一起,您就会有点麻烦,因为您怎么知道正确的解释 2012-01-03 的方法?

编辑:

创建一个新的 DATETIME 字段(例如,我只使用 new_time_creation)并像这样更新:

UPDATE transaction SET new_time_creation = STR_TO_DATE(time_creation, '%Y-%d-%m %H:%i');

【讨论】:

  • 在数据库中 transaction_time 确实是一个 varchar 类型的字段。但是所有的数据都是相同的格式,即 yyyy-dd-mm hh:mm。那么我应该创建另一个临时 DATETIME 列,使用 transaction_time 更新新列然后格式化它吗?
  • 是的,我已经更新了示例。只需创建一个新列并将 UPDATE 中的字符串转换为新字段即可。
  • 是的,它奏效了。我没有创建一个新的临时列,而是使用STR_TO_DTAE(time_creation, '%Y-%d-%m %H:%i') 更新了现有的列,然后将其转换为STR_TO_DTAE(time_creation, '%Y-%m-%md %H:%i')
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 2016-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多