# name: test/sql/function/timestamp/test_strptime.test # description: Test strptime function # group: [timestamp] statement ok PRAGMA enable_verification query I SELECT strptime('21 June, 2018', '%d %B, %Y') ---- 2018-06-21 00:00:00 query I SELECT strptime('21/10/2018', '%d/%m/%Y') ---- 2018-10-21 00:00:00 query I SELECT strptime('2018-20-10', '%Y-%d-%m') ---- 2018-10-20 00:00:00 query I SELECT strptime('20182010', '%Y%d%m') ---- 2018-10-20 00:00:00 query I SELECT strptime('Mon 30, June 2003, 12:03:10 AM', '%a %d, %B %Y, %I:%M:%S %p') ---- 2003-06-30 00:03:10 query I SELECT strptime('Mon 30, June 2003, 12:03:10 PM', '%a %d, %B %Y, %I:%M:%S %p') ---- 2003-06-30 12:03:10 query I SELECT strptime('Mon 30, December 2003, 7:3:5 PM', '%a %d, %B %Y, %I:%M:%S %p') ---- 2003-12-30 19:03:05 query I SELECT strptime('Tuesday 30, December 2003, 7:3:5 PM', '%A %d, %B %Y, %I:%M:%S %p') ---- 2003-12-30 19:03:05 query I SELECT strptime('Mon 30, December 30, 7:3:5 PM', '%a %d, %B %y, %I:%M:%S %p') ---- 2030-12-30 19:03:05 # for strptime there is no difference between %- and % query I SELECT strptime('Mon 30, June 2003, 12:03:10 AM', '%a %-d, %B %Y, %-I:%-M:%-S %p') ---- 2003-06-30 00:03:10 # lowercase also works query I SELECT strptime('mon', '%a') ---- 1900-01-01 00:00:00 query I SELECT strptime('tuesday', '%A') ---- 1900-01-01 00:00:00 query I SELECT strptime('jun', '%b') ---- 1900-06-01 00:00:00 # First Monday of Monday weeks is Jan 1 query I SELECT strptime('1', '%W') ---- 1900-01-01 00:00:00 # First Sunday of Sunday weeks is Jan 7 query I SELECT strptime('1', '%U') ---- 1900-01-07 00:00:00 query II SELECT strptime('30', '%U'), strftime('1900-07-29'::DATE, '%U') ---- 1900-07-29 00:00:00 30 # Default ISO year is 1900, which starts on a Monday query I SELECT strptime('1', '%V') ---- 1900-01-01 00:00:00 query II SELECT strptime('30', '%W'), strftime('1900-07-23'::DATE, '%W') ---- 1900-07-23 00:00:00 30 query II SELECT strptime('30', '%V'), strftime('1900-07-23'::DATE, '%V') ---- 1900-07-23 00:00:00 30 # Ignored query I SELECT strptime('6', '%w') ---- 1900-01-01 00:00:00 query I SELECT strptime('6', '%u') ---- 1900-01-01 00:00:00 # Thursday after 1st Sunday query II SELECT strptime('1-4', '%U-%w'), strftime('1900-01-11'::DATE, '%U-%w') ---- 1900-01-11 00:00:00 01-4 query II SELECT strptime('2-4', '%V-%u'), strftime('1900-01-11'::DATE, '%V-%u') ---- 1900-01-11 00:00:00 02-4 # Thursday after 1st Monday query II SELECT strptime('1-4', '%W-%w'), strftime('1900-01-04'::DATE, '%W-%w') ---- 1900-01-04 00:00:00 01-4 query II SELECT strptime('1-4', '%V-%u'), strftime('1900-01-04'::DATE, '%V-%u') ---- 1900-01-04 00:00:00 01-4 # day of year query II SELECT strptime('30', '%j'), strftime('1900-01-30'::DATE, '%-j') ---- 1900-01-30 00:00:00 30 query I select strptime('100 2024', '%j %Y'); ---- 2024-04-09 00:00:00 query I select strptime('2024 100', '%Y %j'); ---- 2024-04-09 00:00:00 # day of year AND month query I SELECT strptime('1992-01-30 30', '%Y-%m-%d %j') ---- 1992-01-30 00:00:00 # Year-Sunday Week-Weekday query II SELECT strptime('2021-19-4', '%Y-%U-%w'), strftime('2021-05-13'::DATE, '%Y-%U-%w') ---- 2021-05-13 00:00:00 2021-19-4 # Year-Monday Week-Weekday query II SELECT strptime('2021-19-4', '%Y-%W-%w'), strftime('2021-05-13'::DATE, '%Y-%U-%w') ---- 2021-05-13 00:00:00 2021-19-4 # Year-ISO Week-Weekday query II SELECT strptime('2021-19-4', '%G-%V-%u'), strftime('2021-05-13'::DATE, '%G-%V-%u') ---- 2021-05-13 00:00:00 2021-19-4 # Year, Sunday Week 0, Friday query II SELECT strptime('2021-0-5', '%Y-%U-%w'), strftime('2021-01-01'::DATE, '%Y-%U-%w') ---- 2021-01-01 00:00:00 2021-00-5 # Year-ISO Week-Weekday query II SELECT strptime('2021-19-4', '%G-%V-%u'), strftime('2021-05-13'::DATE, '%G-%V-%u') ---- 2021-05-13 00:00:00 2021-19-4 # Year-ISO, Week 1, Friday query II SELECT strptime('2021-1-5', '%G-%V-%u'), strftime('2021-01-08'::DATE, '%G-%V-%u') ---- 2021-01-08 00:00:00 2021-01-5 # Year, Monday Week 0, Friday query II SELECT strptime('2021-0-5', '%Y-%W-%w'), strftime('2021-01-01'::DATE, '%Y-%W-%w') ---- 2021-01-01 00:00:00 2021-00-5 # Year-Sunday Week-Weekday Mismatch should defer to the day query I SELECT strptime('2021-05-12 19-4', '%Y-%m-%d %U-%w') ---- 2021-05-12 00:00:00 # Year-Monday Week-Weekday Mismatch should defer to the day query I SELECT strptime('2021-05-12 19-4', '%Y-%m-%d %W-%w') ---- 2021-05-12 00:00:00 # Year-ISO Week-Weekday Mismatch should defer to the day query I SELECT strptime('2021-05-12 19-4', '%Y-%m-%d %V-%u') ---- 2021-05-12 00:00:00 # Round trip Sunday weeks query III SELECT * FROM ( SELECT dt, strftime(dt, '%Y-%U-%w') AS ft, strptime(strftime(dt, '%Y-%U-%w'), '%Y-%U-%w') AS rt FROM (SELECT '2021-01-01'::DATE + (INTERVAL (d) DAY) AS dt FROM range(365) tbl(d)) days ) diffs WHERE rt <> dt ---- # Round trip Monday weeks query III SELECT * FROM ( SELECT dt, strftime(dt, '%Y-%W-%w') AS ft, strptime(strftime(dt, '%Y-%W-%w'), '%Y-%W-%w') AS rt FROM (SELECT '2021-01-01'::DATE + (INTERVAL (d) DAY) AS dt FROM range(365) tbl(d)) days ) diffs WHERE rt <> dt ---- # Round trip ISO weeks query III SELECT * FROM ( SELECT dt, strftime(dt, '%G-%V-%u') AS ft, strptime(strftime(dt, '%G-%V-%u'), '%G-%V-%u') AS rt FROM (SELECT '2021-01-01'::DATE + (INTERVAL (d) DAY) AS dt FROM range(365) tbl(d)) days ) diffs WHERE rt <> dt ---- # empty specifier and string statement error SELECT strptime('', '') ---- statement error SELECT strptime(NULL, '') ---- query I SELECT strptime('', NULL) ---- NULL # Spaces match multiple spaces (Issue #3418) query I SELECT strptime('Jun 30 2003 2:03:10AM', '%b %d %Y %-I:%M:%S%p'); ---- 2003-06-30 02:03:10 # Parse nanoseconds query I select strptime('2020-12-31 21:25:58.745232159', '%Y-%m-%d %H:%M:%S.%n'); ---- 2020-12-31 21:25:58.745232159 # Rounding of ns query I select strptime('2020-12-31 21:25:58.745232951', '%Y-%m-%d %H:%M:%S.%n'); ---- 2020-12-31 21:25:58.745232951 query I select strptime('2020-12-31 21:25:58.745232', '%Y-%m-%d %H:%M:%S.%f'); ---- 2020-12-31 21:25:58.745232 query I select strptime('2020-12-31 21:25:58.745232', '%Y-%m-%d %H:%M:%S.%f'); ---- 2020-12-31 21:25:58.745232 # UTC offset - produces TIMESTAMPTZ query I select strptime('2020-12-31 21:25:58.745232+00', '%Y-%m-%d %H:%M:%S.%f%z'); ---- 2020-12-31 21:25:58.745232+00 query I select strptime('2020-12-31 21:25:58.745232+0000', '%Y-%m-%d %H:%M:%S.%f%z'); ---- 2020-12-31 21:25:58.745232+00 query I select strptime('2020-12-31 21:25:58.745232+02', '%Y-%m-%d %H:%M:%S.%f%z'); ---- 2020-12-31 19:25:58.745232+00 query I select strptime('2020-12-31 21:25:58.745232-02', '%Y-%m-%d %H:%M:%S.%f%z'); ---- 2020-12-31 23:25:58.745232+00 query I select strptime('2020-12-31 21:25:58.745232+0215', '%Y-%m-%d %H:%M:%S.%f%z'); ---- 2020-12-31 19:10:58.745232+00 query I select strptime('2020-12-31 21:25:58.745232-0215', '%Y-%m-%d %H:%M:%S.%f%z'); ---- 2020-12-31 23:40:58.745232+00 # on the boundaries query I select strptime('2020-12-31 03:25:58.745232+04', '%Y-%m-%d %H:%M:%S.%f%z'); ---- 2020-12-30 23:25:58.745232+00 query I select strptime('2020-12-30 23:25:58.745232-04', '%Y-%m-%d %H:%M:%S.%f%z'); ---- 2020-12-31 03:25:58.745232+00 # Right side padding of fractional seconds query I select strptime('2024-11-28 23:59:00.3', '%Y-%m-%d %H:%M:%S.%g'); ---- 2024-11-28 23:59:00.3 query I select strptime('2024-11-28 23:59:00.312', '%Y-%m-%d %H:%M:%S.%f'); ---- 2024-11-28 23:59:00.312 query I select strptime('2024-11-28 23:59:00.312457', '%Y-%m-%d %H:%M:%S.%n'); ---- 2024-11-28 23:59:00.312457 # infinities should always parse query I select strptime('infinity', '%m/%d/%Y'); ---- infinity query I select strptime('-infinity', '%m/%d/%Y'); ---- -infinity query I select strptime('epoch', '%m/%d/%Y'); ---- 1970-01-01 00:00:00 # Don't swallow non-spaces query I SELECT strptime('Mon Oct 17 2022 22:00:00 GMT+0000 (GMT)', '%a %b %d %Y %X GMT%z (%Z)') as fixed; ---- 2022-10-17 22:00:00+00 query I SELECT strptime('Mon Oct 17 2022 22:00:00 GMT+0000 (GMT', '%a %b %d %Y %X GMT%z (%Z') as working; ---- 2022-10-17 22:00:00+00 # # Multiple patterns # query I SELECT strptime('10/28/1910', ['%d-%m-%Y', '%m-%d-%Y', '%d/%m/%Y', '%m/%d/%Y']) ---- 1910-10-28 00:00:00 # Report mismatch for first pattern statement error SELECT strptime('10.28.1910', ['%d-%m-%Y', '%m-%d-%Y', '%d/%m/%Y', '%m/%d/%Y']) ---- Error: Literal does not match, expected / statement error SELECT strptime('Mon Oct 17 2022 22:00:00 GMT+0000 (GMT)', '%a %b %d %Y %X GMT%z (%Z') as broken; ---- # incorrect usage statement error select strptime('2020-12-31 21:25:58.745232+0', '%Y-%m-%d %H:%M:%S.%f%z'); ---- statement error select strptime('2020-12-31 21:25:58.745232+0X', '%Y-%m-%d %H:%M:%S.%f%z'); ---- statement error select strptime('2020-12-31 21:25:58.745232+X0', '%Y-%m-%d %H:%M:%S.%f%z'); ---- statement error select strptime('2020-12-31 21:25:58.745232+000', '%Y-%m-%d %H:%M:%S.%f%z'); ---- statement error select strptime('2020-12-31 21:25:58.745232X00', '%Y-%m-%d %H:%M:%S.%f%z'); ---- # different errors # month out of range statement error SELECT strptime('2018-20-10', '%Y-%m-%d') ---- # day out of range statement error SELECT strptime('2018-10-100', '%Y-%m-%d') ---- # year without century out of range statement error SELECT strptime('969-10-10', '%y-%m-%d') ---- # literal part does not match statement error SELECT strptime('2000/10/10', '%Y-%m-%d') ---- # incorrect date statement error SELECT strptime('2001-02-30', '%Y-%m-%d') ---- # incorrect date statement error SELECT strptime('2000-10-hello', '%Y-%m-%d') ---- # incorrect hour statement error SELECT strptime('2000-10-01 24:00:00', '%Y-%m-%d %H:%M:%S') ---- # incorrect hour with 12 hour clock statement error SELECT strptime('2000-10-01 00:00:00 AM', '%Y-%m-%d %I:%M:%S %p') ---- statement error SELECT strptime('2000-10-01 13:00:00 AM', '%Y-%m-%d %I:%M:%S %p') ---- # incorrect minute statement error SELECT strptime('2000-10-01 23:60:00', '%Y-%m-%d %H:%M:%S') ---- # incorrect seconds statement error SELECT strptime('2000-10-01 23:59:60', '%Y-%m-%d %H:%M:%S') ---- # incorrect microseconds statement error SELECT strptime('2000-10-01 23:59:59.10000000', '%Y-%m-%d %H:%M:%S.%f') ---- # huge number statement error SELECT strptime('2000-10-01 23:59:59.1000000000000000000000000000', '%Y-%m-%d %H:%M:%S.%f') ---- # empty string statement error SELECT strptime('', '%Y-%m-%d %H:%M:%S.%f') ---- # empty string with am/pm statement error SELECT strptime('', '%p') ---- statement error SELECT strptime('a', '%p') ---- # incorrect am/pm statement error SELECT strptime('mp', '%p') ---- statement error SELECT strptime('pp', '%p') ---- statement error SELECT strptime('zm', '%p') ---- # incorrect abbreviated weekday name statement error SELECT strptime('moa', '%a') ---- # incorrect weekday name statement error SELECT strptime('moaday', '%A') ---- statement error SELECT strptime('mondayy', '%A') ---- # incorrect abbreviated month name statement error SELECT strptime('juk', '%b') ---- # incorrect weekday name statement error SELECT strptime('juke', '%B') ---- statement error SELECT strptime('junee', '%B') ---- # day of year out of range statement error SELECT strptime('500', '%j') ---- statement error SELECT strptime('500', '%-j') ---- statement error SELECT strptime('0', '%j') ---- statement error SELECT strptime('0', '%-j') ---- # week numbers out of range statement error SELECT strptime('60', '%U') ---- statement error SELECT strptime('60', '%W') ---- statement error SELECT strptime('60', '%V') ---- ISO week offset out of range, expected a value between 1 and 53 # weekday out of range statement error SELECT strptime('9', '%w') ---- statement error SELECT strptime('9', '%u') ---- ISO weekday offset out of range, expected a value between 1 and 7 # Multiple offset types statement error SELECT strptime('20 19', '%U %W') ---- statement error SELECT strptime('20 19', '%U %V') ---- Incompatible ISO week offset specified statement error SELECT strptime('20 2021', '%U %G') ---- statement error SELECT strptime('20 19', '%U %j') ---- statement error SELECT strptime('20 19', '%W %U') ---- Multiple week offsets specified statement error SELECT strptime('20 19', '%W %V') ---- Incompatible ISO week offset specified statement error SELECT strptime('20 2021', '%W %G') ---- Incompatible ISO year offset specified statement error SELECT strptime('20 19', '%W %j') ---- statement error SELECT strptime('20 19', '%V %U') ---- Multiple week offsets specified statement error SELECT strptime('20 19', '%V %W') ---- Multiple week offsets specified statement error SELECT strptime('20 19', '%V %j') ---- Multiple year offsets specified statement error SELECT strptime('2021 19', '%G %U') ---- Multiple week offsets specified statement error SELECT strptime('2021 19', '%G %W') ---- Multiple week offsets specified statement error SELECT strptime('2021 19', '%G %j') ---- Multiple year offsets specified # Years override ISO offsets query I SELECT strptime('2021 1950', '%G %Y') ---- 1950-01-01 00:00:00 query I SELECT strptime('2021 1950', '%Y %G') ---- 2021-01-01 00:00:00 query I SELECT strptime('20 1950', '%V %Y') ---- 1950-01-01 00:00:00 statement error SELECT strptime('2021 19', '%Y %V') ---- ISO week offsets are incompatible with non-ISO year specifiers. Use '%G' instead # AM/PM out of range statement error SELECT strptime('Mon 30, December 30, 20:3:5 PM', '%a %d, %B %y, %H:%M:%S %p') ---- # unrecognized specifier statement error SELECT strptime('21/10/2018', '%-q/%m/%Y') ---- # microseconds out of range statement error SELECT strptime('9999999', '%f') ---- # millisecond out of range statement error SELECT strptime('9999', '%g') ---- statement error SELECT strptime('2000/10/10', random()::varchar) ----