每天早上定时执行语句
SELECT * FROM table_a WHERE 'create_time' > DATE_SUB(CURDATE(), INTERVAL 1 DAY) AND'create_time' < CURDATE()
create_time 格式 2008-12-29 16:25:46
得到的结果总是前天的,比如 2016-3-26 查询执行,得到的是 2016-3-24 那天的结果
尝试解决:以前是0点执行,发现结果不对后,以为是数据库时间未到,改为一点执行,还是得到 前天的结果
环境:centos 6.3, mysql 5.5.8 使用tornado的 torndb 的Connection 的实例执行
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
根据您的描述,您希望每天早上定时执行以下SQL语句:
SELECT * FROM table_a
WHERE 'create_time' > DATE_SUB(CURDATE(), INTERVAL 1 DAY)
AND 'create_time' < CURDATE();
但查询结果总是返回前天的数据(例如,2016-3-26 查询时,返回的是 2016-3-24 的数据)。即使将执行时间从凌晨0点调整为凌晨1点,问题依然存在。
结合知识库中的资料,我们可以推测问题可能与以下几个方面有关: 1. CURDATE()
函数的行为:CURDATE()
返回的是当前日期的零点时间(即 YYYY-MM-DD 00:00:00
),而不包含时间部分。这可能导致查询条件的时间范围不符合预期。 2. 数据库时区设置:如果数据库服务器的时区与应用程序的时区不一致,可能会导致时间计算偏差。 3. 定时任务执行时间的影响:即使调整了执行时间,但如果查询逻辑本身存在问题,仍然无法得到正确结果。
为了避免因 CURDATE()
的零点时间特性导致的问题,建议使用 NOW()
或 GETDATE()
函数来动态获取当前时间,并结合 DATE_SUB
函数调整时间范围。修改后的查询如下:
SELECT * FROM table_a
WHERE create_time > DATE_SUB(NOW(), INTERVAL 1 DAY)
AND create_time < NOW();
解释: - NOW()
返回当前的完整时间戳(包括日期和时间),例如 2023-10-01 12:34:56
。 - DATE_SUB(NOW(), INTERVAL 1 DAY)
计算出一天前的时间戳,例如 2023-09-30 12:34:56
。 - 这样可以确保查询的时间范围是动态的,且不会因为零点时间而遗漏数据。
如果数据库服务器的时区与应用程序的时区不一致,可能会导致时间计算偏差。请确认以下几点: - 数据库服务器的时区是否与应用程序一致。 - 如果不一致,可以通过以下命令临时设置 MySQL 的时区:
SET time_zone = '+08:00';
或者在 MySQL 配置文件中永久设置时区(my.cnf
文件):
[mysqld]
default-time-zone = '+08:00'
注意:修改配置文件后需要重启 MySQL 服务。
根据知识库中的资料,pg_cron
插件的定时任务默认使用 GMT 时间。虽然您使用的是 MySQL,但仍需注意定时任务的执行时间是否与预期一致。
建议将定时任务的执行时间调整为本地时间,并确保任务调度工具(如 cron
或 pg_cron
)的时间设置正确。例如,使用 crontab
设置每天早上 1 点执行任务:
0 1 * * * mysql -u<username> -p<password> -e "SELECT * FROM table_a WHERE create_time > DATE_SUB(NOW(), INTERVAL 1 DAY) AND create_time < NOW();"
在修改查询逻辑和时区设置后,建议手动执行以下步骤验证结果: 1. 手动运行修改后的 SQL 查询,检查返回结果是否符合预期。 2. 确认 create_time
字段的格式是否为 DATETIME
类型。如果不是,请将其转换为 DATETIME
类型后再进行查询。
通过以上步骤,您可以解决查询结果总是返回前天数据的问题。关键点包括: 1. 使用 NOW()
替代 CURDATE()
,确保时间范围动态且准确。 2. 检查并统一数据库和应用程序的时区设置。 3. 确保定时任务的执行时间与预期一致。
如果问题仍未解决,请提供更多上下文信息(如 create_time
字段的具体格式、数据库时区设置等),以便进一步排查。