gpt4 book ai didi

mysql Convert_tz 在 where 子句中不起作用

转载 作者:行者123 更新时间:2023-11-29 18:29:57 25 4
gpt4 key购买 nike

我有一个 datetime 字段,并尝试使用 CONVERT_TZ 来查找 BETWEEN 日期。这是一个仅选择的示例:

SELECT (DATE_FORMAT(CONVERT_TZ(`created_at`,'+00:00','+05:00'), ' %Y-%m-%d')) FROM `pages`

这工作正常并返回结果。但是,当我尝试在应该返回结果的 WHERE 子句中使用它时:

SELECT 
*
FROM
`pages`
WHERE
(DATE_FORMAT(CONVERT_TZ(`created_at`, '+00:00', '+05:00'),
'%Y-%m-%d')) BETWEEN '2017-05-01' AND '2017-05-30'

这不会返回任何内容。但是在日期之间,有很多记录应该在这些日期之间验证。

最佳答案

我现在手边没有MySQL。话虽如此,我只是想提供一些快速提示来帮助您:

1) DATE_FORMAT returns a string ,并且您正在比较 WHERE 子句中的字符串。从您的声誉来看,我绝对确信您知道在某些情况下将数字(或其他数字类型)与字符串进行比较并不是最明智的事情:-)。

2)如果您想比较考虑时区的日期时间,您最终应该使用指定时区的常量(在您的情况下,硬编码的下端和上端的间隔有问题)。至少,这对于其他人来说是一致且易于理解的。

3) 请注意 TIMESTAMP field in MySQL converts data being inserted to UTC, taking the current time zone into account, and does the opposite process with data being read, while a DATETIME field does not do that (你没有提到涉及的字段类型)。这可能会导致 TIMESTAMP 字段出现意外结果。

因此,我从未使用过 TIMESTAMP 字段(我正在执行时区转换,这通常与区域设置转换相关,至少在后端代码或客户端代码中如此)数据库软件之外)。因此,如果比较 TIMESTAMP 字段,我不知道 MySQL 的行为如何。它是先从字段中取出值,从而将其从 UTC 转换为当前时区,然后进行比较,还是根据字段中存储的原始 (UTC) 数据进行比较?

最后一点,您的 SELECT 语句当然也会以字符串形式返回日期时间,但在这种情况下,您不会注意到,因为您只是查看它们,而不是执行操作与它们进行计算(或比较)。

关于mysql Convert_tz 在 where 子句中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45775896/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com