Files
email-tracker/external/duckdb/test/sql/function/timestamp/test_strptime.test
2025-10-24 19:21:19 -05:00

690 lines
14 KiB
SQL

# 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)
----