MYSQL SELECT returns timestamp with timezone calculation - mysql

I have a TIMESTAMP field in my table.
When I insert a new row with a timestamp value, the value is saved correctly. but when I'm making a SELECT request (via sequelize), I get the timestamps formatted to -2 hours (the difference from my timezone and the UTC timezone)
is there a way to force the SQL to always return the UTC timezone?

From the documentation
https://dev.mysql.com/doc/refman/5.5/en/datetime.html
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. The
time zone can be set on a per-connection basis.
So the reason you get the time difference when you retrieve is because MySQL converts it to your server's time upon retrieval.
From the documentation again:
https://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html
The initial global server time zone value can be specified explicitly
at startup with the --default-time-zone option on the command line, or
you can use the following line in an option file:
default-time-zone='timezone'
If you have the SUPER privilege, you can set the global server time
zone value at runtime with this statement:
SET GLOBAL time_zone = timezone;
So if you want to change your MySql's server timezone to UTC you should use:
In my.ini file (restart needed)
default-time-zone = '+00:00'
Runtime
(If you want to set the timezone per connection just ommit GLOBAL)
SET GLOBAL time_zone = '+00:00';

Related

Mysql data insert issue in timestamp type

Using DBeaver we are trying to execute the following query.
UPDATE listing SET ScheduledTime='2019-01-09 15:14:51.0', Status='SCHEDULED' where ID=108
after successful execution, we can see the ScheduledTime column as '2019-01-09 20:44:51' in DB. Why there is a time mismatch and how we can solve it? Assistance in this matter is greatly appreciated.
You use different timezone setting when you store and when you view the data. As mysql documentation on timestamp says:
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. The time zone can be set on a per-connection basis.
Mysql documentation describes how to view and set timezone here

Save date in America Pacific timezone format in MySQL

I'm trying to save date in the America Pacific timezone format. I execute before querying the following query
SET time_zone='-09:00'
but when I close the connection and reopen it then the date seems in the local format. Do you know why?
Per MySQL Documentation on Time Zone Support
SET time_zone = timezone; is a per connection setting and so when connection resets, it's resets to default value.
Per-connection time zones. Each client that connects has its own time
zone setting, given by the session time_zone variable. Initially, the
session variable takes its value from the global time_zone variable,
but the client can change its own time zone with this statement:
mysql> SET time_zone = timezone;
If you want to set it globally then you can either
Change the configuration file (.cnf file) to reflect the change
(OR)
If you have SUPER privilege then you can set the global server time zone value at runtime with the command below
SET GLOBAL time_zone = timezone;
You'll need to edit your my.cnf and reboot to set it permanently.
essentially you'll want to add this line to /etc/my.cnf
default_time_zone='-09:00'
See these articles for more details.
How do I set the time zone of MySQL?
http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_time_zone

mysql time_zone not used?

I'm trying to insert or update entries in a table, to Athens timezone. I'm using a shared hosting so I can't set global server timezone.
When I run this multiple query:
SET time_zone="Europe/Athens";
SELECT NOW();
I get the desired Athens time, but when I run something like:
SET time_zone="Europe/Athens";
UPDATE `db`.`tbl` SET `the_time` = NOW() , `foo` = '1' WHERE `tbl`.`id` = 100;
the time set the updated entry is still the server's time!
Why is this happening and how can I fix this?
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. The time zone can be set on a per-connection basis. As long as the time zone setting remains constant, you get back the same value you store. If you store a TIMESTAMP value, and then change the time zone and retrieve the value, the retrieved value is different from the value you stored. This occurs because the same time zone was not used for conversion in both directions. The current time zone is available as the value of the time_zone system variable.
http://dev.mysql.com/doc/refman/5.6/en/datetime.html

MySQL timezone discrepancy on Update tale

I'm working on a shared hosting so I don't have access to mysql configuration files.
The default timezone on that system is 'America/New_York' but I need to use UTC -5:00 for my databases.
Everytime I perform a query the timezone is set to UTC -5:00 like this:
SET time_zone='-5:00';
If I want the current time, SELECT NOW() returns the correct time and date, but when updating a table mysql uses the SYSTEM time and not the set timezone
UPDATE administradores SET ultimo_acceso=NOW() WHERE id=1
Why does those values are different? Shouldn't be the same time in both queries since I'm overriding the timezone?
I also tried with INSERT statement and that works fine.
If the ultimo_acceso field is of type TIMESTAMP, then the value is actually being stored as UTC and then converted back to the current time zone when you select the value back out. So you need to set the time zone again in the select statement.
If you are using a DATETIME data type, then the value you set should be persisted without conversion and you will get back exactly what you store - regardless of the timezone setting at time of select.
See the MySQL docs on this subject.
Note that DATETIME, DATE, and TIME fields will always return the exact time you placed into them, regardless of the value of the time_zone variable.
TIMESTAMP fields will automatically convert their values to the timezone specified by the time_zone variable.

Changing CURRENT_TIMESTAMP value based on timezone in MySQL

I want to migrate our mysql server from shared hosting to local server.
Current server is in MST time zone and the values for the CURRENT_TIMESTAMP in databsse is stored as -7:00 GMT.
Now I want to move complete application on dedicated server in India. Also want to convert the date values stored in -7:00 GMT to +5:30 GMT.
I can accomplish this task of updating the dates by writing script to update the time, however I would like to know if is there any way I can do this from database itself (at time of import or while exporting itself)
mysql version 5.0.96-log. I am not getting option export timestamp in UTC.
When using mysqldump, set the flag: --tz-utc to force all timestamps to be exported as UTC. ( http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_tz-utc ). Note here --tz-utc is enabled by default. So you should have to do nothing: but test first :)
If just working with timestamps on the server you don't have to do anything to convert them, from the documentation on TIMESTAMP post MySQL 4.1 ( http://dev.mysql.com/doc/refman/4.1/en/timestamp.html ):
"values still are stored in UTC, but are converted from the current
time zone for storage, and converted back to the current time zone for
retrieval. As long as the time zone setting remains constant, you
get back the same value you store. If you store a TIMESTAMP value, and
then change the time zone and retrieve the value, the retrieved value
is different from the value you stored."
This is easy to test:
Save a timestamp to your table
Change the server's timezone
Retrieve it: the return value should reflect the new timezone.
So another option is you could just have both the servers set to the same timezone while doing the export / import, than set them back to the correct timezone(s) after it is complete, but note with MySQLDump this should not be necessary.
General syntax
SELECT DATE_ADD(<column_name>, INTERVAL HOUR);
for changing to UTC to MST
SELECT DATE_ADD(NOW(), INTERVAL 7 HOUR);