【问题标题】:MySQL query returns wrong result count between a date rangeMySQL 查询在日期范围之间返回错误的结果计数
【发布时间】:2015-06-11 04:48:11
【问题描述】:

我创建了一个返回日期范围之间结果的查询,但是之前的开发人员通过将日期保存为 MySQL 中的 varchar(10) 以及两种格式(Y-m-dd-m-Y )。

我的问题是,当我从 01-June-201511-June-2015 的日期之间选择结果时,它给了我 18 June 2015 的结果。

但是,当我选择从 01-june-201411-June-2015 的日期之间的结果时,它给了我 13 结果June 2015必须是18结果。

任务:获取某个日期范围内的新访客总数,但日期不在访客表中,所以我从访客表中获取他的第一次访问日期这就是我使用 MIN() 函数的原因

MySQL 查询是:

SELECT min(visits.id), t.id, t.first_name,
    visits.date_check_in
FROM `visitor` `t`
    JOIN `visit` `visits` ON visits.visitor = t.id
WHERE 
  ((STR_TO_DATE(visits.date_check_in, '%d-%m-%Y') BETWEEN
    STR_TO_DATE('11-06-2014', '%d-%m-%Y') AND STR_TO_DATE('11-06-2015',
    '%d-%m-%Y')) 
OR (STR_TO_DATE(visits.date_check_in, '%Y-%m-%d') BETWEEN
    STR_TO_DATE('2014-06-11', '%Y-%m-%d') AND STR_TO_DATE('2015-06-11',
    '%Y-%m-%d')) ) 
AND (t.is_deleted = 0) 
AND (visits.is_deleted = 0)
AND (visits.visit_status != 2)
GROUP BY `t`.`id`

请帮助我我做错了什么。我花了大约 4 天的时间思考和做不同的事情,但被卡住了。 希望尽快收到您的来信,谢谢。

【问题讨论】:

  • 我建议您通过将日期格式更改为 MySQL 日期格式来更正表格。您可以编写 PHP 脚本来使用该表的主键来更新日期。这样它就会解决这种意想不到的结果。
  • 亲爱的,它是一个大的网络仪表板,这些日期已在大约 6 到 7 个地方用于插入、更新和报告,这需要更多的努力来纠正这些地方。
  • 如果您使用聚合函数,您必须对所有选定的列进行分组。在 mysql 中它不需要,但是你会得到意想不到的结果
  • 不能对所有列进行分组

标签: mysql date


【解决方案1】:

您需要做的就是找出日期格式是否不是Y-m-d。如果格式为d-m-Y,则将其改为Y-m-d,然后进行比较,如:

WHERE
    IF(SUBSTRING(visits.date_check_in, 5, 1) = '-', 
        visits.date_check_in, 
        STR_TO_DATE(visits.date_check_in, '%d-%m-%Y')
    ) BETWEEN '2014-06-11' AND '2015-06-11'

【讨论】:

    猜你喜欢
    • 2016-09-26
    • 2020-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    相关资源
    最近更新 更多