我正在尝试为MySQL查询构建一个动态。用户可以选择他们想要多少小时或多少天前的数据。我希望数据落在特定的小时或几天前。
这是我现在使用
的代码,它不起作用:$condition['dates'] = 'Specific';
$condition['date_operand'] = 'Hour(s) ago';
$condition['date_value'] = '3';
if ($conditions['dates'] == 'Specific' && !empty($conditions['date_value'])) {
if ($conditions['date_operand'] == 'Hour(s) ago') {
$where[] = "date_format(from_unixtime(l.date_updated), '%Y-%m-%d %H') = date_format(now() - interval ".$conditions['date_value']." hour, '%Y-%m-%d %H')";
}
else if ($conditions['date_operand'] == 'Day(s) ago') {
$where[] = "date_format(from_unixtime(l.date_updated), '%Y-%m-%d') = date_format(now() - interval ".$conditions['date_value']." day, '%Y-%m-%d')";
}
}
它似乎没有任何工作。l.date_updated
是 unix 时间戳。你可以看到我想要实现的目标,它只是不起作用。
更新
这是示例中不起作用的MySQL where语句:
SELECT * FROM mytable l
WHERE DATE_FORMAT(FROM_UNIXTIME(l.date_updated), '%Y-%m-%d %H') = DATE_FORMAT(NOW() - INTERVAL 3 HOUR, '%Y-%m-%d %H')
它不会导致错误,它只是没有选择我想要的东西。
最后更新
我的查询实际上很好。看来我的PHP代码正在连接到一个多年没有更新的开发数据库。这就是为什么当我选择 3 天前它返回零行的原因。
所以,请一点尊重,因为我是迪翁,白痴之主。
在我看来,您想选择date_updated
值在某个时间范围内的行。 例如,我认为您的意思是,如果NOW()
是2017-04-03 17:55:22
,您希望所有记录的时间戳都在2017-04-03 14:00:00
和2017-04-03 14:59:59.99999
之间(含)。
下面介绍了如何以可优化优化的方式执行此操作:一种可以在date_updated
列上使用索引的方法。
此表达式将NOW()
截断到整点顶部:17:55 到 17:00:
DATE_FORMAT(NOW(), '%Y-%m-%d %H:00:00')
这备份了三个小时。
DATE_FORMAT(NOW(), '%Y-%m-%d %H:00:00') - INTERVAL 3 HOUR
时间戳范围的开头为:
UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%Y-%m-%d %H:00:00') - INTERVAL 3 HOUR)
那么,时间戳范围的末尾是
UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%Y-%m-%d %H:00:00') - INTERVAL 2 HOUR)
因此,这个WHERE
条款可以解决问题。
WHERE l.date_updated >= UNIX_TIMESTAMP(DATE_FORMAT(NOW(),'%Y-%m-%d %H:00:00')-INTERVAL 3 HOUR)
AND l.date_updated) < UNIX_TIMESTAMP(DATE_FORMAT(NOW(),'%Y-%m-%d %H:00:00')-INTERVAL 2 HOUR)
请注意时间范围结束时的<
,而不是<=
。
这里有一些时区的事情发生。Unix 时间戳总是(或应该)相对于 UTC 进行记录。UNIX_TIMESTAMP()
函数始终从本地时间转换为 UTC,而NOW()
函数始终在本地时间工作,因此这一切都应该正常工作。 但是,如果您仍然得到错误的行或没有行,您可能会调查所有这些时间戳垃圾。
请注意,如果您列具有TIMESTAMP
数据类型而不是INT
数据类型,您的时间精度将是相同的,您的生活会更轻松。
您可以使用TO_SECONDS: https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_to-seconds
... where TO_SECONDS(l.date_updated) >= TO_SECONDS(NOW()-INTERVAL 3 HOUR)