Reputation: 25
Gives this error when trying to convert this date format in snowflake.
SELECT TO_TIMESTAMP('5/9/2022 11:09')
Timestamp '5/9/2022 11:09' is not recognized
Upvotes: 0
Views: 3276
Reputation: 26078
SELECT column1, TO_TIMESTAMP(column1, 'mm/dd/yyyy hh:mi') as ts
FROM VALUES
('5/9/2022 11:09'),
('5/12/2022 12:09'),
('5/24/2022 23:09');
COLUMN1 | TS |
---|---|
5/9/2022 11:09 | 2022-05-09 11:09:00.000 |
5/12/2022 12:09 | 2022-05-12 12:09:00.000 |
5/24/2022 23:09 | 2022-05-24 23:09:00.000 |
so you "this is for a large data set" does not make sense..
do you mean you data set has mixed formatted data?
at which point the TRY_ functions can be used, to try things in rank order:
SELECT
column1
,TRY_TO_TIMESTAMP(column1, 'mm/dd/yyyy hh:mi') as ts_a
,TRY_TO_TIMESTAMP(column1, 'mm/dd/yyyy') as ts_b
,TRY_TO_TIMESTAMP(column1, 'mm/dd/yyyy hh:mi:ss.ff6') as ts_c
,coalesce(ts_a, ts_b, ts_c) as ts
FROM VALUES
('5/9/2022 11:09'),
('5/12/2022'),
('5/24/2022 23:09'),
('5/24/2022 23:09:59.99999');
COLUMN1 | TS_A | TS_B | TS_C | TS |
---|---|---|---|---|
5/9/2022 11:09 | 2022-05-09 11:09:00.000 | null | null | 2022-05-09 11:09:00.000 |
5/12/2022 | null | 2022-05-12 00:00:00.000 | null | 2022-05-12 00:00:00.000 |
5/24/2022 23:09 | 2022-05-24 23:09:00.000 | null | null | 2022-05-24 23:09:00.000 |
5/24/2022 23:09:59.99999 | null | null | 2022-05-24 23:09:59.999 | 2022-05-24 23:09:59.999 |
and that can be merge into a single command to clean that up:
SELECT
column1
,coalesce(TRY_TO_TIMESTAMP(column1, 'mm/dd/yyyy hh:mi'), TRY_TO_TIMESTAMP(column1, 'mm/dd/yyyy'), TRY_TO_TIMESTAMP(column1, 'mm/dd/yyyy hh:mi:ss.ff6')) as ts
FROM VALUES
('5/9/2022 11:09'),
('5/12/2022'),
('5/24/2022 23:09'),
('5/24/2022 23:09:59.99999');
COLUMN1 | TS |
---|---|
5/9/2022 11:09 | 2022-05-09 11:09:00.000 |
5/12/2022 | 2022-05-12 00:00:00.000 |
5/24/2022 23:09 | 2022-05-24 23:09:00.000 |
5/24/2022 23:09:59.99999 | 2022-05-24 23:09:59.999 |
Upvotes: 1
Reputation: 95082
You are using an arbitrary timestamp format hoping the DBMS will guess what it means. I must admit I can't. Is this May 9 or September 5?
You may be lucky that the DBMS accepts this format and even guesses right. But instead if relying on luck, you should give the DBMS the information it needs, i.e. the format. Or better still use a timestamp literal right away:
SELECT TIMESTAMP '2022-05-09 11:09:00'
Upvotes: 1
Reputation: 11076
You need to provide a format string:
SELECT TO_TIMESTAMP('5/9/2022 11:09', 'DD/MM/YYYY HH:MI');
-- Or if US based date format:
SELECT TO_TIMESTAMP('5/9/2022 11:09', 'MM/DD/YYYY HH:MI');
This is required because 5/9/2022 is ambiguous. In Europe it's September 5. In the US it's May 9.
Upvotes: 3
Reputation: 550
Previous MySQL versions allowed for the use of a "relaxed" date expression. This means that you could use any delimiters at all for the date parts, e.g. 2004@04@16
, 2022=09=17
, 1968.04.22
, were all considered to be valid.
But as of MySQL 8.0.29, this is no longer allowed. You now have to use a -
(hyphen) as the delimiter.
You can read the reference manual for more information
Upvotes: 0
Reputation: 183
Please execute the query including seconds like below
SELECT TO_TIMESTAMP('5/9/2022 11:09:00');
Upvotes: 0