【问题标题】:CONCAT() and DATE_FORMAT() gives different result in mysql for date rangeCONCAT() 和 DATE_FORMAT() 在 mysql 中针对日期范围给出不同的结果
【发布时间】:2017-06-01 21:38:55
【问题描述】:

我遇到了麻烦,当我使用 CONCAT('2017-01-15', ' 00:00:00') 时,它给出的结果与我在 MySQL 中使用 DATE_FORMAT('2017-01-15', ' %Y-%m-%d 00:00:00') 的日期范围时不同。请问有什么想法吗?

例如我的查询是

SELECT SUM(payments) as pays 
FROM   table 
WHERE  employee_id = 25 
AND    `date` >= DATE_FORMAT('2017-05-16', '%Y-%m-%d 00:00:00') 
AND    `date` <= DATE_FORMAT('2017-05-31', '%Y-%m-%d 23:59:59') 
GROUP BY employee_id 
ORDER BY id DESC

并与 CONCAT

SELECT SUM(payments) as pays 
FROM   table 
WHERE  employee_id = 25 
AND    `date` >= CONCAT('2017-05-16', ' 00:00:00') 
AND    `date` <= CONCAT('2017-05-31', ' 23:59:59') 
GROUP BY employee_id 
ORDER BY id DESC

两者都给出不同的结果..

【问题讨论】:

  • “日期”是文本字段吗?
  • 没有日期是 DATETIME 字段
  • 可能是不同的时区?也许您正在从您的应用程序传递值,该应用程序使用与 MySQL 服务器不同的时区,并且当服务器使用 date_format 创建日期时间时,它在 MySQL 服务器的时区中?您应该比较(并可能在此处提供)您的 concat 和 date_format 函数的输出。
  • 不,它不是时区问题,我很确定它.. 它的其他东西.. 脚本和 mysql 都在使用相同时区的同一台服务器上

标签: mysql date-format concat


【解决方案1】:

我刚刚注意到您在我复制粘贴的格式字符串中有前导空格。请仔细检查您的实际查询。

[以下忽略]

这可能是一些奇怪的转换问题,似乎 DATE_FORMAT(在我正在测试的服务器中)包含一个前导空格。

如果你有兴趣,这是我用来追踪这种奇怪的查询:

SELECT @t0 := '2017-01-15' AS t0, @tN := '2018-01-15' AS tN
, @df0 := DATE_FORMAT(@t0, ' %Y-%m-%d 00:00:00') AS df0, @dfN := DATE_FORMAT(@tN, ' %Y-%m-%d 00:00:00') AS dfN
, @ct0 := CONCAT(@t0, ' 00:00:00') AS ct0, @ctN := CONCAT(@tN, ' 23:59:59') AS ctN
, @df0 = @ct0 AS eq0, @dfN = @ctN AS eqN
, CAST(@ct0 AS DATETIME) = CAST(@df0 AS DATETIME) AS castsEqual0
, @ct0 = CAST(@df0 AS DATETIME) AS castDF0Equal
, CAST(@ct0 AS DATETIME) = @df0 AS castCT0Equal
, @n := CAST(now() AS DATETIME) AS n
, @n > @ct0 AS `n>ct0`, @n > @df0 AS `n>df0`
, @n < @ctN AS `n<ctN`, @n < @dfN AS `n<dfN`
, @n < CAST(@dfN AS DATETIME) AS `n<castDFN`
, CAST(@n AS CHAR) < @dfN AS `castN<dfN`
, LENGTH(CAST(@n AS CHAR)), LENGTH(@dfN)
, CONCAT('[', @dfN, ']')
;

【讨论】:

  • 前导空格在哪里?
  • 在格式字符串中。 ' %Y-%m-%d 00:00:00' 应该是 '%Y-%m-%d 00:00:00'。在您的示例中看起来是正确的,但您在问题中给出的初始版本有它。
  • 我实际上是按日期分组,我认为日期有问题
【解决方案2】:

感谢 Guyz 的回复,实际上我在 23:23:59 遇到了问题 :) 它必须是 23:59:59 :) 我没有注意到它.. 谢谢 - 问题解决了

【讨论】:

    猜你喜欢
    • 2016-06-02
    • 1970-01-01
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多