【问题标题】:MySql search time stamp based on timezone offsetMySql根据时区偏移量搜索时间戳
【发布时间】:2018-03-04 10:57:22
【问题描述】:

我创建了一个示例表,其场景与我的原始表相同。 数据库“test”中的表名“records”

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

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

我必须使用 CONVERT_TZ (mysql conversion function) 使用时间转换进行两次查询

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

我尝试过以下查询

  1. 日期之间的记录:
SELECT * FROM test.records WHERE name LIKE '%motion%' AND CONVERT_TZ(time_created ,'+00:00','-7:0') BETWEEN 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(time_created) 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') as new_format_time FROM test.records WHERE name LIKE '%motion%' AND DATE(CONVERT_TZ(time_created,'+00:00','-7:0')) = '2017-09-14' ORDER BY ID DESC 结果: 0 条记录

【问题讨论】:

  • SELECT * FROM test.records WHERE name LIKE '%motion%' AND CONVERT_TZ(time_created ,'+00:00','-7:0') BETWEEN DATE_SUB(CONVERT_TZ('2017-09) -20 11:48:13' ,'+00:00','-7:0'), 间隔 30 天) AND CONVERT_TZ('2017-09-20 11:48:13' ,'+00:00' ,'-7:0') GROUP BY DATE(time_created) ORDER BY ID DESC; --- 更新了第一个查询

标签: mysql timestamp convert-tz


【解决方案1】:

首先,假设您的系统在 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;

如果 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;

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

其次,知道要与哪个时区进行比较非常重要。

select DATE(CONVERT_TZ('2017-09-14 00:07:25','+00:00', '-07:00'));

将日期放在前一天或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;

最简单的比较是针对 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;

【讨论】:

  • 雅克·阿马尔,感谢您的回复。对于第二个查询,我需要获取日期“2017-09-14”的记录,结果显示为 0
  • 对不起,我没有看我的文字,忘了你输入日期!已编辑
  • Jacques Amar 再次感谢您深入了解我仍然有相同的问题 0 记录。您是否在系统上创建了相同的数据?
  • Jacques Amar,我已经更新了第一个查询中出现错误的问题。我的 MySQL 版本是否可能与 CONVERT_TZ 有问题
  • 没有我能想到的错误。但是请注意,日期现在已经过时,并且在 30 天前检查不会给出任何结果。您需要更新记录中的日期以与 30 天进行比较,因为我们使用 NOW() 作为日期
猜你喜欢
  • 1970-01-01
  • 2011-08-04
  • 2021-07-17
  • 2018-09-11
  • 1970-01-01
  • 1970-01-01
  • 2019-06-25
  • 1970-01-01
  • 2017-01-06
相关资源
最近更新 更多