【问题标题】:MySQL date_format and date rangesMySQL date_format 和日期范围
【发布时间】:2016-06-02 22:50:56
【问题描述】:

我正在尝试生成一个 MySQL 查询,该查询将显示特定日期范围之间的记录。

为了迎合以英国为主的用户群,我必须以日-月-年的方式格式化日期。

因此,我将日期存储如下:

$timestamp = date("d-m-Y H:i:s");

现在我正在尝试运行 MySQL 查询以返回设定日期范围内的结果。 对于这个特定的查询来说,一天中的时间并不是什么大问题。

我想出了以下似乎没有产生任何结果的方法。

SELECT * FROM table WHERE DATE_FORMAT(`timestamp`, '%d-%m-%Y %H:%i:%s') BETWEEN '01-01-2015 00:00:00' AND '31-12-2015 23:59:00'

我已确保 date_format 的内容与 php date() 变量的相同值匹配,但它仍然不显示任何内容!

可能值得注意的是,时间戳列设置为varchar(255) 类型。

有什么想法可以实现吗?

【问题讨论】:

  • timestamp列的数据是什么格式的?是 NOW()unixtime 之类的吗?你能举个例子吗?

标签: php mysql date


【解决方案1】:

选择正确的百分比!。使用%m 而不是%c%m 是零填充的(根据您的需要,即01 - 12),而%c 不是(即1 - 12)。

详情请见here


更新:

抱歉,上述内容不正确,因为您将日期存储为字符串。我回答得太快了。

问题是您正在比较字符串。所以“14-02-2017”在“24-12-2015”之前。因此,您还必须将字符串转换为 date_time 值:

str_to_date(`timestamp`, '%d-%m-%Y %H:%i:%s')

然后你必须将它与给定的值进行比较,转换为 date_time 类型:

... where str_to_date(`timestamp`, '%d-%m-%Y %H:%i:%s') 
  between str_to_date('01-01-2015 00:00:00', '%d-%m-%Y %H:%i:%s')
      and str_to_date('31-12-2015 23:59:00', '%d-%m-%Y %H:%i:%s');

但是,我强烈建议您将日期存储在 DATE_TIME 列中,并且仅在 INSERT(使用 STR_TO_DATE)和 SELECT(使用 DATE_FORMAT)期间转换它们。

【讨论】:

  • 抱歉,我实际上使用的是%m,而是在“旧”版本中复制。使用%m 仍然不会返回任何行。
  • 是的,我明白了。我的回答是错误的,因为您将日期存储为字符串,对吗?稍等一下,我会解决的。
  • 是的,我存储为字符串。谢谢
  • 抱歉不断更新。使用:SELECT STR_TO_DATE(timestamp, '%d-%m-%Y %H:%i:%s') FROM table 为我将字符串转换为日期。
  • @Codingmedic 是的,是的。这就是我更新的答案所依赖的:将所有三个看起来像日期的字符串转换为真实日期,并让 MySQL 比较它们。
【解决方案2】:

用这个替换你的:

SELECT * FROM table WHERE DATE_FORMAT(FROM_UNIXTIME(timestamp), '%d-%m-%Y %h:%i:%s') 
BETWEEN '01-01-2015 00:00:00' AND '31-12-2015 23:59:00'

【讨论】:

  • 可悲的是,它也返回 0 个结果。
  • 可以提供表结构和demo数据
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-28
相关资源
最近更新 更多