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
Related
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';
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.
Is there is any possibility in database, What ever time i am given which should store as GMT time stamp. If it so, Please share me.
For PostgreSQL, your table should have a column of type timestamp with time zone (timestamptz for short) like this:
CREATE TABLE tbl (id serial, ts timestamptz);
If what you want to store (let's call it my_ts) is ...
a local timestamp without time zone, i.e. it agrees with the current setting of timezone in your client:
Insert as is, everything is saved as UTC automatically internally:
INSERT INTO tbl (ts) VALUES my_ts'
a timestamp with time zone:
Insert as is, everything is saved as UTC automatically internally:
INSERT INTO tbl (ts) VALUES my_ts;
a timestamp without time zone but from another time zone:
Say, you get timestamp without time zone values from the Olympic Games in London, but your client thinks you are at a different time zone. Transform the timestamp with the AT TIME ZONE construct:
INSERT INTO tbl (ts) VALUES my_ts AT TIME ZONE 'Europe/London';
If you use the time zone name (instead of a time zone abbreviation, BST in this case), DST (daylight saving time) rules are applied automatically. Details in this related question.
More about timestamp handling in PostgreSQL in this related answer.
Now, if you want to display tbl.ts as UTC (~ GMT) timestamp without time zone, regardless of your current time zone, retrieve the values like this:
SELECT ts AT TIME ZONE 'UTC' FROM tbl;
Note that AT TIME ZONE has a different effect when applied to timestamptz than with timestamp! Read the manual carefully.
http://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.
Times in timestamp with time zone (and the old-style timestamp, but you shouldn't generally use that) are always stored in UTC ("GMT") in PostgreSQL. They're converted to and from UTC for display. If you want them to be treated as UTC for input and output:
SET timezone = 'UTC'
in each session, or set the param at the database or user level. Your app must then send all timestamps qualified with a time zone if they're in a TZ other than UTC; you've told the system that "local time" is UTC.
The AT TIME ZONE construct can be useful if you want to explicitly convert timestamps to a time zone other than the default, eg:
regress=# SELECT TIMESTAMP '2012-01-01 00:00:00 UTC' AT TIME ZONE '+08:00';
timezone
------------------------
2012-01-01 16:00:00+08
(1 row)
The keyword you are looking for is UTC instead of GMT ("For most common purposes, UTC is synonymous with GMT, but GMT is no longer precisely defined by the scientific community.", wikipedia).
For MySQL, you can use the CONVERT_TZ() function (please note the warning in the manual about named time zones, it can break your queries if it's not properly set up).
Just a word of caution: there is no 100% reliable way to work with timezone conversion between MySQL and your application (see my blog post about mysql time zone conversions to learn in detail about why this is). It's better to pass your datetime strings to MySQL in UTC directly (e.g. by doing the conversion in the application itself). You almost always end up storing datetimes in a DATETIME field using UTC formatted date strings if you need reliability.
Let's say I have 2 TIMESTAMP fields/columns, event and stamp. For event field, when we insert, I want to set time zone so that event will use user specified time zone. However, I don't want stamp to use that time zone. I want stamp to use whatever default time zone the server is using.
SET time_zone = <UTC offset>;
does not work since it will affect both event and stamp where we only want event to be affected by the time zone.
Is there a way to set time zone for specific columns during insert?
MySQL doesn't bother about timezones when you insert a date.
I would recommend storing the date/time in GMT (+00:00) and have another field that stores the timezone used (e.g. "Europe/Amsterdam").
Edit
I'm not entirely sure you would need the used timezone though, since you can format a GMT time in any way you'd like inside your scripts / apps.
SET time_zone = <user timezone>;
INSERT ... SET event = CURRENT_TIMESTAMP(), stamp = UTC_TIMESTAMP(), ...
or read more at http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html
According to mysqltutorial
The values of the MySQL TIMESTAMP columns depend on connection’s time
zone. When insert values for MySQL TIMESTAMP columns, they are
converted to Universal Coordinated Time (UTC) from connection’s time
zone. When you select the value, the server converts it back from UTC
to the connection’s time zone so you have the same value that you
inserted.
Where does it get this info. from, the time the user sets his OS to or from some other method?
Javascript also has a way to do timezones but is more involved: onlineaspect
To specify connection-specific time you need to perform
SET time_zone = TZ;
Where TZ can be either numerical offset like +11:00 or name of timezone Asia/Vladivostok (for the latter you need to import timezones description. Ask your DBA to do so)
the example there is wrong, i just tested it. it returns the previously inserted timestamp, regardless of the timezone. mysql will always insert the time you specify, without modifying it. if you need timezone adjustment, you have to tell mysql explicit to do so; otherwise all times are assumed to be "local server time".