时间戳列

时间:2015-10-14 16:14:58

标签: mysql datetime

我有一个带有自动更新列的数据库表,该列需要采用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表格,因为该表格在使用时会达到数千行。)

  • 我可以做些什么来进行比较?
  • BETWEEN子句如何处理其他AND,是否适合括在括号中(为清晰起见)
  • 是否有更有效/合适的方法来比较 SELECT * FROM `check_login` WHERE `last_action` BETWEEN date_sub(CURDATE() , INTERVAL -1 DAY ) AND CURDATE() 列日期?

1 个答案:

答案 0 :(得分:0)

似乎DATE_SUB()减法所以我不需要在SQL的INTERVAL <value> DAY部分执行 -1 ,但是, INTERVAL确实接受负值但总体上是减去负数,因此+1天间隔。

我原先认为DATE_SUB代表替换,因为价值部分中的负值允许 - 对我来说 - 意味着不需要添加数据功能也是如此。

我浪费了半天阅读并试图弄清楚这种逻辑是如何运作的。