I have a column added_at
of type timestamp without time zone
. I want it's default value to be the current date-time but without time zone. The function now()
returns a timezone as well.
How do I solve that problem?
There is no time zone information being stored in a timestamptz , but instead it is converted to UTC for storage. I'd say, always use timestamptz when the timestamps in question denote absolute time. That's all what timestamptz means.
PostgreSQL stores the timestamptz in UTC value.
DATETIME is a date/time that does not store timezone.
The PostgreSQL now function returns the current date and time with the time zone.
SELECT now()::timestamp;
The cast converts the timestamptz
returned by now()
to the corresponding timestamp
in your time zone - defined by the timezone
setting of the session. That's also how the standard SQL function LOCALTIMESTAMP
is implemented in Postgres.
If you don't operate in multiple time zones, that works just fine. Else switch to timestamptz
for added_at
. The difference?
BTW, this does exactly the same, just more noisy and expensive:
SELECT now() AT TIME ZONE current_setting('timezone');
Well you can do something like:
SELECT now() AT TIME ZONE current_setting('TimeZone'); SELECT now() AT TIME ZONE 'Europe/Paris'; SELECT now() AT TIME ZONE 'UTC';
Not sure how that makes any sense for a column "added_at". You almost always want an absolute timestamp (timestamp with time zone) not a floating one.
Edit responding to points below:
Yes, should use timestamp with time zone (absolute time) unless you have a good reason not to.
The client timezone is given by SHOW TimeZone
or current_setting(...)
as shown above.
Do take some time to skim the manuals - they cover all this quite well.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With