Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MySql search time stamp based on timezone offset

I have created a sample table with same scenario as my original one. Table name "records" in database "test"

database timezone is set to 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');


I have to make two queries using time conversion using CONVERT_TZ (mysql conversion function )

I need two queries : 1. fetch records between date "today" and "today - 30 days back" 2. fetch records for given date like "2017-09-14"

I have tried below queries

  1. records between date :
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'), INTERVAL 30 DAY) AND CONVERT_TZ('2017-09-20 11:48:13','+00:00','-7:0') 
GROUP BY DATE(time_created) ORDER BY ID DESC;

result : 
18  motion  2017-09-19 09:42:11
15  motion  2017-09-14 00:07:09
1   motion  2017-09-13 16:20:41

  1. records for given date :
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
result:
0 records

like image 633
Harjeevan Singh Avatar asked Sep 22 '17 19:09

Harjeevan Singh


People also ask

Does MySQL timestamp have timezone?

MySQL converts TIMESTAMP values from the current time zone to UTC for storage, and back from UTC to the current time zone for retrieval. (This does not occur for other types such as DATETIME .) By default, the current time zone for each connection is the server's time.

How do I get current time zone in MySQL?

The current global and session time zone values can be retrieved like this: SELECT @@GLOBAL. time_zone, @@SESSION.

What is difference between datetime and timestamp in MySQL?

Learn MySQL from scratch for Data Science and Analytics Range − Datetime data type supports a date along with time in the range between 1000-01-01 00:00:00 and 9999-12-31 23:59:59. But timestamp data type supports a date along with time in the range between '1970-01-01 00:00:01' to '2038-01-19 08:44:07'.

Is MySQL timezone aware?

MySQL by default will use the system time zone internally but it's possible to define a different time zone for the MySQL server globally or even per transaction. When you insert a date, it is not possible to define the time zone along with the date string in MySQL.


1 Answers

For the first, assuming your system is running at 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;

If NOW() is the current time zone

   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;

--- EDITED 201/09/25 ---

For the second, It's really important to know which Timezone you want to compare with.

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

Will put the date to the day before or 2017-09-13 (we have moved the comparison to the other side of the equation, so we have to change the order

changing the >= to = and just use 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;

The simplest comparison will be against UTC and the formula will be

   SELECT *
   FROM test.records
   WHERE name LIKE '%motion%' AND
     DATE(time_created) = '2017-09-14'
   GROUP BY DATE(time_created) ORDER BY ID DESC;
like image 144
Jacques Amar Avatar answered Nov 15 '22 00:11

Jacques Amar