我有一个带有自动更新列的数据库表,该列需要采用TIMESTAMP格式,每次更新行时,都会以YYYY-MM-DD HH:mm:ss
格式保存日期。
在读取语句时,日期比较(可能非常)处理器繁重,首选方法似乎是使用MySQL BETWEEN
语句来检查并返回过去24小时内发生的更新。
参考:https://stackoverflow.com/a/14104364/3536236
我的SQL
我删除了一些占用此问题范围之外空间的详细信息,例如某些列
-- Generation Time: Oct 14, 2015 at 04:54 PM
-- Server version: 5.5.45-cll
-- PHP Version: 5.4.31
--
-- Table structure for table `check_log`
--
CREATE TABLE IF NOT EXISTS `check_log` (
`table_id` int(8) NOT NULL AUTO_INCREMENT,
`last_action` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`ip_addr` varchar(60) NOT NULL,
`submit_fail` varchar(1) NOT NULL,
PRIMARY KEY (`fail_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=14 ;
--
-- Dumping data for table `check_log`
--
INSERT INTO `check_log` (`table_id`, `last_action`, `ip_addr`, `submit_fail`) VALUES
(2, '2015-10-14 14:08:30', '92.99.252.185', 'N'),
(3, '2015-10-14 14:09:23', '92.99.252.185', 'N'),
(4, '2015-10-14 14:09:25', '92.99.252.185', 'N'),
(5, '2015-10-14 14:09:38', '92.99.252.185', 'N'),
(6, '2015-10-14 14:14:22', '92.99.252.185', 'N'),
(7, '2015-10-14 14:17:13', '92.99.252.185', 'N'),
(8, '2015-10-14 14:20:51', '92.99.252.185', 'N'),
(9, '2015-10-14 14:20:52', '92.99.252.185', 'N'),
(10, '2015-10-14 14:50:34', '92.99.252.185', 'N'),
(11, '2015-10-14 15:29:07', '92.99.252.185', 'N'),
(12, '2015-10-14 15:31:04', '92.99.252.185', 'N'),
(13, '2015-10-14 15:32:00', '92.99.252.185', 'N');
我的查询
现在,我的查询想要返回符合过去24小时内更新的条件的所有行。所以:
SELECT * FROM `check_log` WHERE `ip_addr` = '92.99.252.185' AND
(`last_action` BETWEEN date_sub(CURDATE() , INTERVAL -1 DAY ) AND CURDATE())
AND `submit_fail` = 'N'
我以这种形式编写了查询,因为我想探索BETWEEN ... AND ...
如何在同一个查询中处理其他 ANDS ,因此为了我自己的清晰度,我将BETWEEN语句括在括号中{ {1}}。
我为此查询尝试了一系列略有不同的语法,包括:
()
和纯日期检查:
SELECT * FROM `check_login` WHERE `ip_addr` = '92.99.252.185' AND
(DATE_FORMAT(`last_action`, '%Y-%m-%d') BETWEEN date_sub(CURDATE() , INTERVAL -1 DAY ) AND CURDATE())
每次MySQL返回Zero Rows(不是错误)但找到零行。 我已经查看并比较了至少十几个类似的答案,关于日期的比较,我有点不知道我怎么没有得到返回的行,我期待我的查询。
(理想情况下,我希望使用BETWEEN表格,因为该表格在使用时会达到数千行。)
SELECT * FROM `check_login` WHERE
`last_action` BETWEEN date_sub(CURDATE() , INTERVAL -1 DAY ) AND CURDATE()
列日期?答案 0 :(得分:0)
似乎DATE_SUB()
是减法所以我不需要在SQL的INTERVAL <value> DAY
部分执行 -1 ,但是, INTERVAL确实接受负值但总体上是减去负数,因此+1天间隔。
我原先认为DATE_SUB
代表替换,因为价值部分中的负值允许 - 对我来说 - 意味着不需要添加数据功能也是如此。
我浪费了半天阅读并试图弄清楚这种逻辑是如何运作的。