【问题标题】:MySQL STR_TO_DATE seems to fail when day has a "0"当日为“0”时,MySQL STR_TO_DATE 似乎失败
【发布时间】:2018-08-08 08:57:48
【问题描述】:

我的数据库中有一系列日期为字符串格式。

我正在尝试使用以下命令将这些转换为日期:

SELECT STR_TO_DATE(Date_Scanned, '%d/%m/%Y')FROM urls WHERE Date_Scanned 
BETWEEN "01/02/2018" AND "05/04/2018"

当日期包含 0 时,我的问题似乎发生了,例如以下命令返回所有所需的日期:

SELECT STR_TO_DATE(Date_Scanned, '%d/%m/%Y')FROM urls WHERE Date_Scanned 
BETWEEN "01/02/2018" AND "15/04/2018"

但是,此命令返回零结果:

SELECT STR_TO_DATE(Date_Scanned, '%d/%m/%Y')FROM urls WHERE Date_Scanned 
BETWEEN "01/02/2018" AND "05/04/2018"

【问题讨论】:

  • SELECT STR_TO_DATE("05/04/2018", '%d/%m/%Y') 工作正常,那么 date_scanned 是什么样的。你的意思是你有像'00/02/2018'这样的日期吗?
  • Date_Scanned 也有附加到字符串的时间,例如:19/02/2018 11:38:32

标签: mysql sql database string date


【解决方案1】:

我相信您的代码没有错误,而是返回空行。原因是因为您传递的参数被评估为字符串而不是日期。您的WHERE 子句过滤字符串中的Date_Scanned 列。

如果您想根据 real 日期数据类型过滤列,您应该在WHERE 子句中使用STR_TO_DATE(),而不是在SELECT 子句中。

SELECT STR_TO_DATE(Date_Scanned, '%d/%m/%Y')
FROM urls 
WHERE STR_TO_DATE(Date_Scanned, '%d/%m/%Y') BETWEEN '2018-02-01' AND '2018-04-05'

但是,根据您的评论,您想保留所需的格式,因此您必须转换列和值。 但为什么要让它更复杂呢?

WHERE STR_TO_DATE(Date_Scanned, '%d/%m/%Y') 
      BETWEEN STR_TO_DATE('01/02/2018', '%d/%m/%Y') 
              AND STR_TO_DATE('05/04/2018', '%d/%m/%Y')

【讨论】:

  • 如果我使用您在中间提供的日期格式('2018-02-01'),这确实有效。但是,它不适用于我想要的日期格式('02/03/2018')
  • 然后将列和值都转换为日期。
  • 我设法通过更改代码中其他地方的拆分函数来解决问题!非常感谢您的帮助!
猜你喜欢
  • 2018-04-17
  • 1970-01-01
  • 2014-12-01
  • 2011-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-05
相关资源
最近更新 更多