基于时区偏移量的MySQL搜索时间戳

Har*_*ngh 8 mysql timestamp convert-tz

我创建了一个样本表,其场景与原始场景相同。数据库“测试”中的表名称“记录”

数据库时区设置为UTC(SET time_zone =“ +00:00”;)

`records`(`id`,`name`,`time_created`)

(1,'motion','2017-09-13 16:20:41'),
(2,'motion','2017-09-13 16:20:57'),
(3,'motion','2017-09-13 16:21:24'),
(4,'motion','2017-09-13 16:21:40'),
(5,'motion','2017-09-13 16:26:38'),
(6,'motion','2017-09-13 17:09:00'),
(7,'motion','2017-09-13 17:09:16'),
(8,'motion','2017-09-13 22:14:37'),
(9,'motion','2017-09-13 22:23:53'),
(10,'motion','2017-09-13 22:24:08'),
(11,'motion','2017-09-13 22:24:24'),
(12,'motion','2017-09-13 23:45:17'),
(13,'motion','2017-09-13 23:45:36'),
(14,'motion','2017-09-13 23:45:54'),
(15,'motion','2017-09-14 00:07:09'),
(16,'motion','2017-09-14 00:07:24'),
(17,'motion','2017-09-14 00:07:42'),
(18,'motion','2017-09-19 09:42:11'),
(19,'motion','2017-09-19 09:42:27'),
(20,'motion','2017-09-19 09:42:44'),
(21,'motion','2017-09-19 11:21:08'),
(22,'motion','2017-09-19 11:21:23'),
(23,'motion','2017-09-19 11:21:38'),
(24,'motion','2017-09-19 11:21:54'),
(25,'motion','2017-09-19 11:48:13'),
(26,'motion','2017-09-13 16:20:41'),
(27,'motion','2017-09-13 16:20:57'),
(28,'motion','2017-09-13 16:21:24'),
(29,'motion','2017-09-13 16:21:40'),
(30,'motion','2017-09-13 16:26:38'),
(31,'motion','2017-09-13 17:09:00'),
(32,'motion','2017-09-13 17:09:16'),
(33,'motion','2017-09-13 22:14:37'),
(34,'motion','2017-09-13 22:23:53'),
(35,'motion','2017-09-13 22:24:08'),
(36,'motion','2017-09-13 22:24:24'),
(37,'motion','2017-09-13 23:45:17'),
(38,'motion','2017-09-13 23:45:36'),
(39,'motion','2017-09-13 23:45:54'),
(40,'motion','2017-09-14 00:07:09'),
(41,'motion','2017-09-14 00:07:24'),
(42,'motion','2017-09-14 00:07:42'),
(43,'motion','2017-09-19 09:42:11'),
(44,'motion','2017-09-19 09:42:27'),
(45,'motion','2017-09-19 09:42:44'),
(46,'motion','2017-09-19 11:21:08'),
(47,'motion','2017-09-19 11:21:23'),
(48,'motion','2017-09-19 11:21:38'),
(49,'motion','2017-09-19 11:21:54'),
(50,'motion','2017-09-19 11:48:13');


我必须使用CONVERT_TZ(mysql转换函数)使用时间转换进行两个查询

我需要两个查询:1.提取日期“ today”和“ today-30 days back”之间的记录2.提取给定日期的记录,例如“ 2017-09-14”

我已经尝试过以下查询

  1. 日期之间的记录:
SELECT * FROM test.records记录名称,例如“%motion%” 
AND CONVERT_TZ(time_created,'+ 00:00','-7:0')DATE_SUB(CONVERT_TZ('2017-09-20 11:48:13','+ 00:00','-7:0' ),间隔30天)和CONVERT_TZ('2017-09-20 11:48:13','+ 00:00','-7:0') 
GROUP BY DATE(创建时间)ORDER BY ID DESC;

结果: 
18运动2017-09-19 09:42:11
15运动2017-09-14 00:07:09
1动2017-09-13 16:20:41

  1. 给定日期的记录:
SELECT name,id,CONVERT_TZ(time_created,'+ 00:00','-7:0')as time_created,
DATE_FORMAT(CONVERT_TZ(time_created,'+ 00:00','-7:0'),'%h:%i:%s%p')作为new_format_time 
FROM test.records,其中的名称类似于'%motion%' 
AND DATE(CONVERT_TZ(time_created,'+ 00:00','-7:0'))='2017-09-14'按ID排序
结果:
0条记录

Jac*_*mar 2

首先,假设您的系统在 UTC 运行

   SELECT * FROM test.records
   WHERE name LIKE '%motion%' AND
      time_created >= DATE_SUB(CONVERT_TZ(NOW(),'+00:00','-7:0') , INTERVAL 30 DAY)
   GROUP BY DATE(time_created) ORDER BY ID DESC;
Run Code Online (Sandbox Code Playgroud)

如果 NOW() 是当前时区

   SELECT * FROM test.records
   WHERE name LIKE '%motion%' AND
      CONVERT_TZ(time_created,'+00:00','-7:0') >= DATE_SUB(NOW(), INTERVAL 30 DAY)
   GROUP BY DATE(time_created) ORDER BY ID DESC;
Run Code Online (Sandbox Code Playgroud)

--- 201/09/25 编辑 ---

其次,了解您要与哪个时区进行比较非常重要。

select DATE(CONVERT_TZ('2017-09-14 00:07:25','+00:00', '-07:00'));
Run Code Online (Sandbox Code Playgroud)

将把日期放到前一天或2017-09-13(我们已经将比较移到等式的另一边,所以我们必须改变顺序

更改为>==仅使用DATE()

   SELECT *
   FROM test.records
   WHERE name LIKE '%motion%' AND
     DATE(CONVERT_TZ(time_created,'-7:0', '+00:00')) = '2017-09-14'
   GROUP BY DATE(time_created) ORDER BY ID DESC;
Run Code Online (Sandbox Code Playgroud)

最简单的比较是与 UTC 进行比较,公式为

   SELECT *
   FROM test.records
   WHERE name LIKE '%motion%' AND
     DATE(time_created) = '2017-09-14'
   GROUP BY DATE(time_created) ORDER BY ID DESC;
Run Code Online (Sandbox Code Playgroud)