Transform Timestamp Without Time Zone to a simple date in PostgreSQL - postgresql

Suppose I have a column that has the datatype Timestamp without Time Zone and looks like this:
Sun Jan 01 1933 00:00:00 GMT+0000 (Coordinated Universal Time)
I want to change it to a simple date like this 01/01/1933.
I have tried the following, but there is no change in the output:
SELECT timestamp_date::date as new_date,
DATE(timestamp_date) as also_date
FROM my_schema.my_table;
What am I doing wrong here?

you can use the function to_char
to_char(timestamp_date, 'DD/MM/YYYY');
Or you can play with DATESTYLE configuration parameters, but use to_char always as possible, to avoid the change of configuration

Related

CAST datetime to date misalignment in RedShift

I need to covert a DATETIME field to DATE in order to join two datasets. No biggy, CAST(DATETIME) as DATE. However, the following is happening:
Datetime
Date
2022-12-02T22:00:00
2022-12-03
2022-12-02T08:00:00
2022-12-02
Clearly something is going on with the interpretation of the times. The DATETIME is on GMT while my system is on EST. My guess is that CAST is reading the datetime as the system's time zone and converting it to GMT on more time. Does anyone have any thoughts on what is happening and how to work around this?
I have tried CAST, CONVERT, TRUNC, AT TIME ZONE... All of them still gives the same result. The result I am searching for is the following:
Datetime
Date
2022-12-02T22:00:00
2022-12-02
2022-12-02T08:00:00
2022-12-02
Thanks!
This is due to your default timezone.
You can change for the current session like so:
SET timezone TO 'UTC';
or equivalently:
SET timezone TO 'GMT';
To change session back to default timezone:
set timezone to default;
https://docs.aws.amazon.com/redshift/latest/dg/r_timezone_config.html

Set the time default to 00:00:00 in DB2

I have a DateTime column (activation_dt) in DB2 table and I want to add 1 day to the date part and my output should be "date 00:00:00".
For example:
How it is - 5/9/2001 03:00:00
how it should be - 5/10/2001 00:00:00
I tried using Concat function but is not working. Date part I am doing as "date(activation_dt +1 day) as new_dt"
Please help how should I achieve this is DB2.
You could cast it to a DATE, then TIMESTAMP. Here is the invers, try out the individual parts.
values date(timestamp(current date))
BTW: What is CURRENT TIMEZONE?
Try this
VALUES date_trunc('DAY', CURRENT TIMESTAMP + 1 DAY)
it will always return the next day 00:00:00 - use activation_dt instead of current timestamp

Postgres SQL Date conversion

I have a field stored as timestamp without time zone which looks like this 2017-12-26 06:56:54.958. When I convert it like this:
to_char(date_field, 'DD/MM/YYYY hh24:mm:ss')
I end up with 26/12/2017 06:12:54. Does anybody know why? And if so, is there a way around this. As you can see, 44 minutes are removed from the date giving a time of 06:12 rather than 06:56.
I have tried to convert to UTC and GMT but I have had no luck. Any help would be greatly appreciated.
Try
to_char(date_field, 'DD/MM/YYYY HH24:MI:SS')
MI is the pattern for minutes. MM is for months, and the case is irrelevant.

indexing timestamptz for specific timezone

My console is PST.
Database server and times stored are GMT.
I'm having to run queries like so:
SELECT x,y,z
FROM tbl_msg
WHERE (msg_datetime AT TIME ZONE 'BST') BETWEEN '2016-11-21'::date and '2016-11-22'::date;
Indexing 101 says that performing this operation on msg_datetime will now avoid the index and this is what I'm seeing.
So I need advice with an indexing solution for this.
Can I index this timezone? or alter this query so that it queries these times in BST, converted to GMT?
You should have msg_datetime column of type timestamp with time zone (or shorter alias timestamptz) with normal index.
Then, to get data for these 2 days, you should:
set timezone 'Europe/London'; -- once, on connection start
SELECT x,y,z
FROM tbl_msg
WHERE
msg_datetime>='2016-11-21 00:00:00'
and
msg_datetime<'2016-11-23 00:00:00';
You should not use ordinary timestamp, as it stores literal date and hour without information about which timezone it actually meant. A timestamp with time zone type will automatically convert your client's configured time to internal representation (which is in UTC) and back. You can also express timestamptz from non-default timezone using for example '2016-11-23 00:00:00 Asia/Tokyo'.
Also you should not use BST - because you'd need to use GMT on winter and remember when to use which. You should use 'Europe/London' or other "city" timezones (list), which are right both in summer and in winter.

Postgresql not converting timezone correctly

I am building an application that needs to handle different timezones, including timezones with daylight savings time. I am storing all the dates/times using Postgressql's timestamp with timezone data type, and all are stored in the UTC timezone (I modified the timezone entry in postgresql.conf).
Here is an example table that I have created:
CREATE TABLE category_city
(
category_city_id serial NOT NULL,
appt_start_time timestamp(0) with time zone,
appt_end_time timestamp(0) with time zone,
appt_days_of_week character varying,
CONSTRAINT category_city_pkey PRIMARY KEY (category_city_id )
);
I have been testing some conversions using the 'America\Edmonton' timezone. Currently, this timezone is 6 hours behind UTC. I have a timestamp in this table that has the value 1970-01-01 15:00:00+00.
Now I perform this query:
SELECT appt_start_time at time zone 'America/Edmonton' as start
FROM category_city
This should give me the timestamp 1970-01-01 09:00:00+00, but instead it gives me the timestamp 1970-01-01 08:00:00+00, an offset of -7. which is the correct offset when not in DST, but is obviously not correct right now (DST is in effect).
I must be missing something because I'm sure I'm not the only one that needs to handle different timezones with DST.
The time on my server is correct, this is the output of the date command on Ubuntu:
Wed Apr 30 17:11:59 MDT 2014
Can anyone see something that I am overlooking, or has any experienced something similar and found a way to workaround it? Any help would be appreciated!
At 1970-01-01 09:00:00+00 the time at the timezone 'America/Edmonton' was 1970-01-01 08:00:00 regardless of when you ask. If you want the time at a specific timezone you need to make it explicit:
select '1970-01-01 15:00:00+00' at time zone 'MST' as start;
start
---------------------
1970-01-01 08:00:00
select '1970-01-01 15:00:00+00' at time zone 'MDT' as start;
start
---------------------
1970-01-01 09:00:00
I guess it is easy to see above why that time at the MDT timezone will always be the same.