should be it

This commit is contained in:
2025-10-24 19:21:19 -05:00
parent a4b23fc57c
commit f09560c7b1
14047 changed files with 3161551 additions and 1 deletions

View File

@@ -0,0 +1,182 @@
# name: test/sql/function/timestamp/age.test
# description: Test age function
# group: [timestamp]
# age without second timestamp compares to NOW()
statement ok
SELECT AGE(TIMESTAMP '1957-06-13') t
query T
SELECT AGE(TIMESTAMP '2001-04-10', TIMESTAMP '1957-06-13');
----
43 years 9 months 27 days
query T
SELECT age(TIMESTAMP '2014-04-25', TIMESTAMP '2014-04-17');
----
8 days
query T
SELECT age(TIMESTAMP '2014-04-25', TIMESTAMP '2014-01-01');
----
3 months 24 days
query T
SELECT age(TIMESTAMP '2019-06-11', TIMESTAMP '2019-06-11');
----
00:00:00
query T
SELECT age(TIMESTAMP '2019-06-11', TIMESTAMP '2019-06-11')::VARCHAR;
----
00:00:00
query T
SELECT age(timestamp '2019-06-11 12:00:00', timestamp '2019-07-11 11:00:00');
----
-29 days -23:00:00
statement ok
CREATE TABLE timestamp(t1 TIMESTAMP, t2 TIMESTAMP)
statement ok
INSERT INTO timestamp VALUES('2001-04-10', '1957-06-13')
statement ok
INSERT INTO timestamp VALUES('2014-04-25', '2014-04-17')
statement ok
INSERT INTO timestamp VALUES('2014-04-25','2014-01-01')
statement ok
INSERT INTO timestamp VALUES('2019-06-11', '2019-06-11')
statement ok
INSERT INTO timestamp VALUES(NULL, '2019-06-11')
statement ok
INSERT INTO timestamp VALUES('2019-06-11', NULL)
statement ok
INSERT INTO timestamp VALUES(NULL, NULL)
query T
SELECT AGE(t1, TIMESTAMP '1957-06-13') FROM timestamp;
----
43 years 9 months 27 days
56 years 10 months 12 days
56 years 10 months 12 days
61 years 11 months 28 days
NULL
61 years 11 months 28 days
NULL
query T
SELECT AGE(TIMESTAMP '2001-04-10', t2) FROM timestamp;
----
43 years 9 months 27 days
-13 years -7 days
-12 years -8 months -21 days
-18 years -2 months -1 day
-18 years -2 months -1 day
NULL
NULL
query T
SELECT AGE(t1, t2) FROM timestamp;
----
43 years 9 months 27 days
8 days
3 months 24 days
00:00:00
NULL
NULL
NULL
query T
SELECT t1 - t2 FROM timestamp;
----
16007 days
8 days
114 days
00:00:00
NULL
NULL
NULL
query T
SELECT AGE(t1, t2) FROM timestamp WHERE t1 > '2001-12-12';
----
8 days
3 months 24 days
00:00:00
NULL
query T
SELECT AGE(NULL, NULL);
----
NULL
query T
SELECT AGE(TIMESTAMP '1957-06-13', NULL);
----
NULL
query T
SELECT AGE(NULL, TIMESTAMP '1957-06-13');
----
NULL
# date can also be used with AGE
# hopefully the clock is not off by more than a century
query T
SELECT INTERVAL '1' DAY < AGE(DATE '1900-06-13');
----
1
query T
SELECT AGE(DATE '1900-01-01', DATE '1950-01-01');
----
-50 years
query I
select age(timestamp '1992-01-01 01:01:02.400', timestamp '1992-01-01 01:01:02.200');
----
00:00:00.2
query I
select age(timestamp '1992-01-01 01:01:02.200', timestamp '1992-01-01 01:01:02.400');
----
-00:00:00.2
query I
select age(timestamp '1992-01-01 01:01:01.400', timestamp '1992-01-01 01:01:02.200');
----
-00:00:00.8
#
# Infinities
#
foreach lspecial infinity -infinity
# Unary
query I
SELECT AGE('${lspecial}'::TIMESTAMP);
----
NULL
foreach rspecial infinity -infinity 2004-01-31T12:00:00.000050-08
query I
SELECT AGE('${lspecial}'::TIMESTAMP, '${rspecial}'::TIMESTAMP);
----
NULL
query I
SELECT AGE('${rspecial}'::TIMESTAMP, '${lspecial}'::TIMESTAMP);
----
NULL
endloop
endloop

View File

@@ -0,0 +1,69 @@
# name: test/sql/function/timestamp/current_time.test
# description: Test current_time/current_date/etc
# group: [timestamp]
require icu
statement ok
SET Calendar='gregorian';
statement ok
SELECT CAST(CURRENT_TIME AS STRING), CAST(CURRENT_DATE AS STRING), CAST(CURRENT_TIMESTAMP AS STRING), CAST(NOW() AS STRING)
query I
SELECT typeof(CURRENT_TIME);
----
TIME WITH TIME ZONE
query I
SELECT typeof(CURRENT_DATE);
----
DATE
query I
SELECT typeof(CURRENT_TIMESTAMP);
----
TIMESTAMP WITH TIME ZONE
query I
SELECT typeof(get_current_time());
----
TIME WITH TIME ZONE
foreach func today current_date
query I
SELECT typeof(${func}());
----
DATE
endloop
foreach func now get_current_timestamp transaction_timestamp
query I
SELECT typeof(${func}());
----
TIMESTAMP WITH TIME ZONE
endloop
statement ok
SELECT CURRENT_TIME AS TIME
statement ok
SELECT CURRENT_TIME + interval (1) second AS TIME
# No DST, so offset never changes
statement ok
SET TimeZone='Pacific/Honolulu';
query I
select current_timestamp;
----
<REGEX>:[-0-9:\. ]+-10
query I
select current_time;
----
<REGEX>:[0-9:\.]+-10

View File

@@ -0,0 +1,36 @@
# name: test/sql/function/timestamp/current_timestamp.test
# description: Test current_time/current_date/etc
# group: [timestamp]
require icu
# Normalise the testing locale
statement ok
SET Calendar = 'gregorian';
statement ok
SET TimeZone = 'America/Chihuahua';
statement ok
PRAGMA enable_verification
# get the millennium of the current date
# FIXME: this needs to be updated in 982 years
query I
SELECT EXTRACT(MILLENNIUM FROM NOW())
----
3
query I
SELECT SUFFIX(CURRENT_TIMESTAMP::VARCHAR, '-06');
----
True
foreach func now get_current_timestamp transaction_timestamp
query I
SELECT SUFFIX(${func}()::VARCHAR, '-06');
----
True
endloop

View File

@@ -0,0 +1,388 @@
# name: test/sql/function/timestamp/date_diff.test_slow
# description: Test the DATEDIFF function
# group: [timestamp]
statement ok
PRAGMA enable_verification
#
# DATE
#
statement ok
CREATE TABLE date1 AS
SELECT '2005-12-31'::DATE AS startdate, '2006-01-01'::DATE AS enddate;
foreach datepart year quarter month day dayofyear julian
query I
SELECT DATEDIFF('${datepart}', startdate, enddate) FROM date1
----
1
endloop
foreach datepart decade century millennium week yearweek
query I
SELECT DATEDIFF('${datepart}', startdate, enddate) FROM date1
----
0
endloop
query I
SELECT DATEDIFF('hour', startdate, enddate) FROM date1
----
24
query I
SELECT DATEDIFF('minute', startdate, enddate) FROM date1
----
1440
query I
SELECT DATEDIFF('second', startdate, enddate) FROM date1
----
86400
query I
SELECT DATEDIFF('millisecond', startdate, enddate) FROM date1
----
86400000
query I
SELECT DATEDIFF('microsecond', startdate, enddate) FROM date1
----
86400000000
# Note this is 0 not 1!
query I
SELECT DATEDIFF('isoyear', startdate, enddate) FROM date1
----
0
# Negation
foreach datepart year quarter month day dayofyear hour minute second millisecond microsecond decade century millennium week yearweek isoyear julian
query I
SELECT DATEDIFF('${datepart}', startdate, enddate) + DATEDIFF('${datepart}', enddate, startdate) FROM date1
----
0
endloop
# Table
foreach datepart year month day hour minute second millisecond microsecond
query I
SELECT DATEDIFF('${datepart}', startdate, startdate + INTERVAL 1 ${datepart})
FROM (SELECT '2021-07-30'::DATE + INTERVAL (d) DAY AS startdate FROM range(0, 5) tbl(d)) days
----
1
1
1
1
1
endloop
statement error
SELECT datediff('microseconds',DATE '4151706-4-6',DATE '-5559461-6-26');
----
query I
SELECT datediff('isodow',DATE '4765396-11-24',DATE '-4389735-12-13');
----
-3343842916
#
# TIMESTAMP
#
statement ok
CREATE TABLE datetime1 AS
SELECT '2005-12-31 23:59:59.9999999'::TIMESTAMP AS startdate, '2006-01-01 00:00:00.0000000'::TIMESTAMP AS enddate;
foreach datepart year quarter month day dayofyear hour minute second millisecond microsecond julian
query I
SELECT DATEDIFF('${datepart}', startdate, enddate) FROM datetime1
----
1
endloop
foreach datepart decade century millennium week yearweek isoyear
query I
SELECT DATEDIFF('${datepart}', startdate, enddate) FROM datetime1
----
0
endloop
# Negation
foreach datepart year quarter month day dayofyear hour minute second millisecond microsecond decade century millennium week yearweek isoyear julian
query I
SELECT DATEDIFF('${datepart}', startdate, enddate) + DATEDIFF('${datepart}', enddate, startdate) FROM datetime1
----
0
endloop
# Table
foreach datepart year month day hour minute second millisecond microsecond
query I
SELECT DATEDIFF('${datepart}', startdate, startdate + INTERVAL 1 ${datepart})
FROM (SELECT '2021-07-30'::TIMESTAMP + INTERVAL (d) DAY AS startdate FROM range(0, 5) tbl(d)) days
----
1
1
1
1
1
endloop
#
# TIME
#
statement ok
CREATE TABLE time1 AS
SELECT '23:59:59.9999999'::TIME AS enddate, '00:00:00.0000000'::TIME AS startdate;
foreach datepart year quarter month day dayofyear decade century millennium week yearweek isoyear julian
statement error
SELECT DATEDIFF('${datepart}', startdate, enddate) FROM time1
----
endloop
query I
SELECT DATEDIFF('hour' , startdate, enddate) FROM time1
----
23
query I
SELECT DATEDIFF('minute' , startdate, enddate) FROM time1
----
1439
query I
SELECT DATEDIFF('second' , startdate, enddate) FROM time1
----
86399
query I
SELECT DATEDIFF('millisecond' , startdate, enddate) FROM time1
----
86399999
query I
SELECT DATEDIFF('microsecond' , startdate, enddate) FROM time1
----
86399999999
# MS-SQL Weeks are just days // 7. No Mondays involved...
query I
SELECT date_diff('WEEK', '2023-01-22'::date, '2024-09-13'::date) AS column;
----
85
query I
SELECT date_diff('WEEK', '2023-01-22 05:30:00'::timestamp, '2024-09-13 05:30:00'::timestamp) AS column;
----
85
# Negation
foreach datepart hour minute second millisecond microsecond
query I
SELECT DATEDIFF('${datepart}', startdate, enddate) + DATEDIFF('${datepart}', enddate, startdate) FROM time1
----
0
endloop
# Table
foreach datepart hour minute second millisecond microsecond
query I
SELECT DATEDIFF('${datepart}', startdate, startdate + INTERVAL 1 ${datepart})
FROM (SELECT '12:52:07.123456'::TIME + INTERVAL (d) HOUR AS startdate FROM range(0, 5) tbl(d)) times
----
1
1
1
1
1
endloop
#
# NULLs
#
foreach datepart year quarter month day dayofyear hour minute second millisecond microsecond decade century millennium week yearweek isoyear julian
foreach tbl date1 datetime1 time1
query I
SELECT DATEDIFF('${datepart}', NULL::TIMESTAMP, NULL::TIMESTAMP) FROM ${tbl}
----
NULL
query I
SELECT DATEDIFF('${datepart}', NULL, enddate) FROM ${tbl}
----
NULL
query I
SELECT DATEDIFF('${datepart}', startdate, NULL) FROM ${tbl}
----
NULL
endloop
endloop
foreach tbl date1 datetime1 time1
query I
SELECT DATEDIFF(NULL, startdate, enddate) FROM ${tbl}
----
NULL
endloop
# Table
foreach datepart year month day hour minute second millisecond microsecond isoyear julian
query I
SELECT DATEDIFF('${datepart}', startdate, NULL)
FROM (SELECT '2021-07-30'::TIMESTAMP + INTERVAL (d) DAY AS startdate FROM range(0, 5) tbl(d)) days
----
NULL
NULL
NULL
NULL
NULL
query I
SELECT DATEDIFF('${datepart}', NULL, startdate)
FROM (SELECT '2021-07-30'::TIMESTAMP + INTERVAL (d) DAY AS startdate FROM range(0, 5) tbl(d)) days
----
NULL
NULL
NULL
NULL
NULL
query I
SELECT DATEDIFF('${datepart}', NULL::TIMESTAMP, NULL)
FROM (SELECT '2021-07-30'::TIMESTAMP + INTERVAL (d) DAY AS startdate FROM range(0, 5) tbl(d)) days
----
NULL
NULL
NULL
NULL
NULL
endloop
query I
SELECT DATEDIFF(NULL, startdate, startdate + INTERVAL 1 HOUR)
FROM (SELECT '2021-07-30'::TIMESTAMP + INTERVAL (d) DAY AS startdate FROM range(0, 5) tbl(d)) days
----
NULL
NULL
NULL
NULL
NULL
#
# Infinities
#
foreach specifier year isoyear julian month day decade century millennium quarter week microseconds milliseconds second minute hour
foreach ltype DATE TIMESTAMP
foreach rtype DATE TIMESTAMP
foreach lspecial infinity -infinity
foreach rspecial infinity -infinity
query I
SELECT DATE_SUB('${specifier}', '${lspecial}'::${ltype}, '${rspecial}'::${rtype});
----
NULL
endloop
endloop
endloop
endloop
endloop
#
# Errors
#
# Issue #5239: Overflow
statement error
SELECT datediff('microseconds',TIMESTAMP '276858-10-21 9:36:33',TIMESTAMP '-222154-6-30 5:19:49');----
----
#
# VARCHAR
#
statement ok
CREATE TABLE parts (datepart VARCHAR);
statement ok
INSERT into parts VALUES(NULL);
foreach datepart year quarter month day dayofyear hour minute second millisecond microsecond decade century millennium week yearweek isoyear julian
statement ok
INSERT into parts VALUES('${datepart}');
endloop
query II
SELECT datepart, DATEDIFF(datepart, '2005-12-31 23:59:59.9999999'::TIMESTAMP, '2006-01-01 00:00:00.0000000'::TIMESTAMP)
FROM parts;
----
NULL NULL
year 1
quarter 1
month 1
day 1
dayofyear 1
hour 1
minute 1
second 1
millisecond 1
microsecond 1
decade 0
century 0
millennium 0
week 0
yearweek 0
isoyear 0
julian 1
statement ok
INSERT into parts VALUES('duck');
statement error
SELECT datepart, DATEDIFF(datepart, '2005-12-31 23:59:59.9999999'::TIMESTAMP, '2006-01-01 00:00:00.0000000'::TIMESTAMP)
FROM parts;
----

View File

@@ -0,0 +1,614 @@
# name: test/sql/function/timestamp/date_sub.test_slow
# description: Test the DATESUB function
# group: [timestamp]
statement ok
PRAGMA enable_verification
#
# DATE
#
statement ok
CREATE TABLE date1 AS
SELECT '2004-01-31'::DATE AS startdate, '2004-02-29'::DATE AS enddate;
# Ragged months
query I
select DATESUB('month', '2004-01-31'::DATE, '2004-02-29'::DATE);
----
1
query I
select DATESUB('month', '2004-01-29'::DATE, '2004-02-29'::DATE);
----
1
query I
select DATESUB('quarter', '2004-01-31'::DATE, '2004-04-30'::DATE);
----
1
query I
select DATESUB('year', '2004-02-29'::DATE, '2005-02-28'::DATE);
----
1
query I
select DATESUB('isoyear', '2004-02-29'::DATE, '2005-02-28'::DATE);
----
1
query I
select DATESUB('decade', '1994-02-28'::DATE, '2004-02-29'::DATE);
----
1
query I
select DATESUB('century', '1904-02-29'::DATE, '2005-02-28'::DATE);
----
1
query I
select DATESUB('millennium', '1004-02-29'::DATE, '2004-02-29'::DATE);
----
1
# Sub-month
foreach datepart day doy dow isodow julian
query I
select DATESUB('${datepart}', '2004-01-31'::DATE, '2004-02-29'::DATE);
----
29
endloop
foreach datepart week yearweek
query I
select DATESUB('${datepart}', '2004-01-31'::DATE, '2004-02-29'::DATE);
----
4
endloop
query I
select DATESUB('hour', '2004-01-31'::DATE, '2004-02-01'::DATE);
----
24
query I
select DATESUB('minute', '2004-02-29'::DATE, '2004-03-01'::DATE);
----
1440
query I
select DATESUB('second', '2004-02-29'::DATE, '2004-03-01'::DATE);
----
86400
query I
select DATESUB('millisecond', '2004-02-29'::DATE, '2004-03-01'::DATE);
----
86400000
query I
select DATESUB('microsecond', '2004-02-29'::DATE, '2004-03-01'::DATE);
----
86400000000
# Negation
foreach datepart year quarter month day dayofyear hour minute second millisecond microsecond decade century millennium week yearweek isoyear
query I
SELECT DATESUB('${datepart}', startdate, enddate) + DATESUB('${datepart}', enddate, startdate) FROM date1
----
0
endloop
# Table
foreach datepart year month day hour minute second millisecond microsecond
query I
SELECT DATESUB('${datepart}', startdate, startdate + INTERVAL 1 ${datepart})
FROM (SELECT '2021-07-30'::DATE + INTERVAL (d) DAY AS startdate FROM range(0, 5) tbl(d)) days
----
1
1
1
1
1
endloop
#
# TIMESTAMP
#
statement ok
CREATE TABLE datetime1 AS
SELECT '2004-01-31 12:00:00'::TIMESTAMP AS startdate, '2004-02-29 13:05:00'::TIMESTAMP AS enddate;
# Ragged months
query I
select DATESUB('month', '2004-01-31 12:00:00'::TIMESTAMP, '2004-02-29 13:00:00'::TIMESTAMP);
----
1
query I
select DATESUB('month', '2004-01-29 12:00:00'::TIMESTAMP, '2004-02-29 13:00:00'::TIMESTAMP);
----
1
query I
select DATESUB('month', '2004-02-29 12:00:00'::TIMESTAMP, '2004-03-31 13:00:00'::TIMESTAMP);
----
1
query I
select DATESUB('month', '2004-02-29 13:00:00'::TIMESTAMP, '2004-03-31 12:00:00'::TIMESTAMP);
----
1
query I
select DATESUB('quarter', '2004-01-31 12:00:00'::TIMESTAMP, '2004-04-30 13:00:00'::TIMESTAMP);
----
1
query I
select DATESUB('year', '2004-02-29 12:00:00'::TIMESTAMP, '2005-02-28 13:00:00'::TIMESTAMP);
----
1
query I
select DATESUB('isoyear', '2004-02-29 12:00:00'::TIMESTAMP, '2005-02-28 13:00:00'::TIMESTAMP);
----
1
query I
select DATESUB('decade', '1994-02-28 12:00:00'::TIMESTAMP, '2004-02-29 13:00:00'::TIMESTAMP);
----
1
query I
select DATESUB('century', '1904-02-29 12:00:00'::TIMESTAMP, '2005-02-28 13:00:00'::TIMESTAMP);
----
1
# Ragged incomplete months
query I
select DATESUB('month', '2004-01-31 13:00:00'::TIMESTAMP, '2004-02-29 12:00:00'::TIMESTAMP);
----
0
query I
select DATESUB('month', '2004-01-29 13:00:00'::TIMESTAMP, '2004-02-29 12:00:00'::TIMESTAMP);
----
0
query I
select DATESUB('quarter', '2004-01-31 13:00:00'::TIMESTAMP, '2004-04-30 12:00:00'::TIMESTAMP);
----
0
query I
select DATESUB('year', '2004-02-29 13:00:00'::TIMESTAMP, '2005-02-28 12:00:00'::TIMESTAMP);
----
0
query I
select DATESUB('isoyear', '2004-02-29 13:00:00'::TIMESTAMP, '2005-02-28 12:00:00'::TIMESTAMP);
----
0
query I
select DATESUB('decade', '1992-02-29 13:00:00'::TIMESTAMP, '2002-02-28 12:00:00'::TIMESTAMP);
----
0
query I
select DATESUB('century', '1904-02-29 13:00:00'::TIMESTAMP, '2004-02-28 12:00:00'::TIMESTAMP);
----
0
query I
select DATESUB('millennium', '1004-02-29 12:00:00'::TIMESTAMP, '2004-02-28 13:00:00'::TIMESTAMP);
----
0
# Sub-month
foreach datepart day doy dow isodow julian
query I
select DATESUB('${datepart}', '2004-01-31 12:00:00'::TIMESTAMP, '2004-02-29 13:00:00'::TIMESTAMP);
----
29
query I
select DATESUB('${datepart}', '2004-01-31 13:00:00'::TIMESTAMP, '2004-02-29 12:00:00'::TIMESTAMP);
----
28
endloop
foreach datepart week yearweek
query I
select DATESUB('${datepart}', '2004-01-31 12:00:00'::TIMESTAMP, '2004-02-28 13:00:00'::TIMESTAMP);
----
4
query I
select DATESUB('${datepart}', '2004-01-31 13:00:00'::TIMESTAMP, '2004-02-28 12:00:00'::TIMESTAMP);
----
3
endloop
query I
select DATESUB('hour', '2004-01-31 12:00:00'::TIMESTAMP, '2004-02-01 13:05:00'::TIMESTAMP);
----
25
query I
select DATESUB('hour', '2004-01-31 12:00:00'::TIMESTAMP, '2004-02-01 12:00:00'::TIMESTAMP);
----
24
query I
select DATESUB('hour', '2004-01-31 13:00:00'::TIMESTAMP, '2004-02-01 12:05:00'::TIMESTAMP);
----
23
query I
select DATESUB('minute', '2004-01-31 12:00:00'::TIMESTAMP, '2004-02-01 13:05:00'::TIMESTAMP);
----
1505
query I
select DATESUB('minute', '2004-01-31 12:00:00'::TIMESTAMP, '2004-02-01 12:00:00'::TIMESTAMP);
----
1440
query I
select DATESUB('minute', '2004-01-31 13:00:00'::TIMESTAMP, '2004-02-01 12:05:00'::TIMESTAMP);
----
1385
query I
select DATESUB('second', '2004-01-31 12:00:00'::TIMESTAMP, '2004-02-01 12:00:05'::TIMESTAMP);
----
86405
query I
select DATESUB('second', '2004-01-31 12:00:00'::TIMESTAMP, '2004-02-01 12:00:00'::TIMESTAMP);
----
86400
query I
select DATESUB('second', '2004-01-31 12:00:05'::TIMESTAMP, '2004-02-01 12:00:00'::TIMESTAMP);
----
86395
query I
select DATESUB('millisecond', '2004-01-31 12:00:00'::TIMESTAMP, '2004-02-01 12:00:00.050'::TIMESTAMP);
----
86400050
query I
select DATESUB('millisecond', '2004-01-31 12:00:00'::TIMESTAMP, '2004-02-01 12:00:00'::TIMESTAMP);
----
86400000
query I
select DATESUB('millisecond', '2004-01-31 12:00:00.050'::TIMESTAMP, '2004-02-01 12:00:00'::TIMESTAMP);
----
86399950
query I
select DATESUB('microsecond', '2004-01-31 12:00:00'::TIMESTAMP, '2004-02-01 12:00:00.000050'::TIMESTAMP);
----
86400000050
query I
select DATESUB('microsecond', '2004-01-31 12:00:00'::TIMESTAMP, '2004-02-01 12:00:00'::TIMESTAMP);
----
86400000000
query I
select DATESUB('microsecond', '2004-01-31 12:00:00.000050'::TIMESTAMP, '2004-02-01 12:00:00'::TIMESTAMP);
----
86399999950
# Negation
foreach datepart year quarter month day dayofyear hour minute second millisecond microsecond decade century millennium week yearweek isoyear
query I
SELECT DATESUB('${datepart}', startdate, enddate) + DATESUB('${datepart}', enddate, startdate) FROM datetime1
----
0
endloop
# Table
foreach datepart year month day hour minute second millisecond microsecond
query I
SELECT DATESUB('${datepart}', startdate, startdate + INTERVAL 1 ${datepart})
FROM (SELECT '2021-07-30'::TIMESTAMP + INTERVAL (d) DAY AS startdate FROM range(0, 5) tbl(d)) days
----
1
1
1
1
1
endloop
# Overflow
statement error
SELECT datesub('week',TIMESTAMP '-214169-1-18 21:29:6',TIMESTAMP '93495-11-19 13:3:22');
----
statement error
SELECT datesub('dayofyear',TIMESTAMP '-109502-12-4 20:26:13',TIMESTAMP '252823-4-6 9:56:28');
----
statement error
SELECT datesub('epoch',TIMESTAMP '153520-4-1 20:33:43',TIMESTAMP '-269898-3-29 12:9:14');
----
#
# TIME
#
statement ok
CREATE TABLE time1 AS
SELECT '12:00:00'::TIME AS enddate, '13:35:47.123456'::TIME AS startdate;
query I
select DATESUB('hour', '12:00:00'::TIME, '13:05:00'::TIME);
----
1
query I
select DATESUB('hour', '12:00:00'::TIME, '12:05:00'::TIME);
----
0
query I
select DATESUB('hour', '13:00:00'::TIME, '12:05:00'::TIME);
----
0
query I
select DATESUB('minute', '12:00:00'::TIME, '13:05:00'::TIME);
----
65
query I
select DATESUB('minute', '12:00:00'::TIME, '13:00:00'::TIME);
----
60
query I
select DATESUB('minute', '13:00:00'::TIME, '12:05:00'::TIME);
----
-55
query I
select DATESUB('second', '12:00:00'::TIME, '12:00:05'::TIME);
----
5
query I
select DATESUB('second', '12:00:00'::TIME, '12:00:00'::TIME);
----
0
query I
select DATESUB('second', '12:00:05'::TIME, '12:00:00'::TIME);
----
-5
query I
select DATESUB('millisecond', '12:00:00'::TIME, '12:00:00.050'::TIME);
----
50
query I
select DATESUB('millisecond', '12:00:00'::TIME, '12:00:00'::TIME);
----
0
query I
select DATESUB('millisecond', '12:00:00.050'::TIME, '12:00:00'::TIME);
----
-50
query I
select DATESUB('microsecond', '12:00:00'::TIME, '12:00:00.000050'::TIME);
----
50
query I
select DATESUB('microsecond', '12:00:00'::TIME, '12:00:00'::TIME);
----
0
query I
select DATESUB('microsecond', '12:00:00.000050'::TIME, '12:00:00'::TIME);
----
-50
foreach datepart year month day decade century millennium quarter week
statement error
select DATESUB('${datepart}', '12:00:00.000050'::TIME, '12:00:00'::TIME)
----
endloop
# Negation
foreach datepart 'hour' 'minute' 'second' 'millisecond' 'microsecond'
query I
SELECT DATESUB(${datepart}, startdate, enddate) + DATESUB(${datepart}, enddate, startdate) FROM time1
----
0
endloop
# Table
foreach datepart hour minute second millisecond microsecond
query I
SELECT DATESUB('${datepart}', startdate, startdate + INTERVAL 1 ${datepart})
FROM (SELECT '12:52:07.123456'::TIME + INTERVAL (d) HOUR AS startdate FROM range(0, 5) tbl(d)) times
----
1
1
1
1
1
endloop
#
# NULLs
#
foreach datepart year quarter month day dayofyear hour minute second millisecond microsecond decade century millennium week yearweek
foreach tbl date1 datetime1 time1
query I
SELECT DATESUB('${datepart}', NULL::TIMESTAMP, NULL::TIMESTAMP) FROM ${tbl}
----
NULL
query I
SELECT DATESUB('${datepart}', NULL, enddate) FROM ${tbl}
----
NULL
query I
SELECT DATESUB('${datepart}', startdate, NULL) FROM ${tbl}
----
NULL
endloop
endloop
foreach tbl date1 datetime1 time1
query I
SELECT DATESUB(NULL, startdate, enddate) FROM ${tbl}
----
NULL
endloop
#
# Infinities
#
foreach specifier year isoyear month day decade century millennium quarter week microseconds milliseconds second minute hour
foreach ltype DATE TIMESTAMP
foreach rtype DATE TIMESTAMP
foreach lspecial infinity -infinity
foreach rspecial infinity -infinity
query I
SELECT DATE_SUB('${specifier}', '${lspecial}'::${ltype}, '${rspecial}'::${rtype});
----
NULL
endloop
endloop
endloop
endloop
endloop
#
# VARCHAR
#
statement ok
CREATE TABLE parts (datepart VARCHAR);
statement ok
INSERT into parts VALUES(NULL);
foreach datepart year quarter month day dayofyear hour minute second millisecond microsecond decade century millennium week yearweek isoyear
statement ok
INSERT into parts VALUES('${datepart}');
endloop
query II
SELECT datepart, DATESUB(datepart, '2004-01-31 12:00:00'::TIMESTAMP, '2004-02-29 13:05:47.123456'::TIMESTAMP)
FROM parts;
----
NULL NULL
year 0
quarter 0
month 1
day 29
dayofyear 29
hour 697
minute 41825
second 2509547
millisecond 2509547123
microsecond 2509547123456
decade 0
century 0
millennium 0
week 4
yearweek 4
isoyear 0
foreach ltype DATE TIMESTAMP
foreach rtype DATE TIMESTAMP
foreach lspecial infinity -infinity
foreach rspecial infinity -infinity
query I
SELECT DATE_SUB(datepart, '${lspecial}'::${ltype}, '${rspecial}'::${rtype}) AS sub
FROM parts
WHERE sub IS NOT NULL
----
endloop
endloop
endloop
endloop
statement ok
INSERT into parts VALUES('duck');
statement error
SELECT datepart, DATESUB(datepart, '2004-01-31 12:00:00'::TIMESTAMP, '2004-02-29 13:05:47.123456'::TIMESTAMP)
FROM parts;
----

View File

@@ -0,0 +1,56 @@
# name: test/sql/function/timestamp/epoch.test
# description: Test epoch_ms function
# group: [timestamp]
query TTTTTT
SELECT
make_timestamp(0) as epoch1,
make_timestamp(1574802684123 * 1000) as epoch2,
make_timestamp(-291044928000 * 1000) as epoch3,
make_timestamp(-291081600000 * 1000) as epoch4,
make_timestamp(-291081600001 * 1000) as epoch5,
make_timestamp(-290995201000 * 1000) as epoch6
----
1970-01-01 00:00:00
2019-11-26 21:11:24.123
1960-10-11 10:11:12
1960-10-11 00:00:00
1960-10-10 23:59:59.999
1960-10-11 23:59:59
# MS version for replacing epoch_ms(bigint)
query TTTTTT
SELECT
make_timestamp_ms(0) as epoch1,
make_timestamp_ms(1574802684123) as epoch2,
make_timestamp_ms(-291044928000) as epoch3,
make_timestamp_ms(-291081600000) as epoch4,
make_timestamp_ms(-291081600001) as epoch5,
make_timestamp_ms(-290995201000) as epoch6
----
1970-01-01 00:00:00
2019-11-26 21:11:24.123
1960-10-11 10:11:12
1960-10-11 00:00:00
1960-10-10 23:59:59.999
1960-10-11 23:59:59
query IIII
SELECT to_timestamp(0), to_timestamp(1), to_timestamp(1574802684), to_timestamp(-1)
----
1970-01-01 00:00:00+00
1970-01-01 00:00:01+00
2019-11-26 21:11:24+00
1969-12-31 23:59:59+00
# Frational seconds in UTC
query I
SELECT to_timestamp(1284352323.5);
----
2010-09-13 04:32:03.5+00
# Coverage
statement error
SELECT to_timestamp(1284352323::DOUBLE * 100000000);
----
Conversion Error: Epoch seconds out of range for TIMESTAMP WITH TIME ZONE

View File

@@ -0,0 +1,315 @@
# name: test/sql/function/timestamp/make_date.test
# description: Test the MAKE_DATE/TIME/TIMESTAMP functions
# group: [timestamp]
statement ok
PRAGMA enable_verification
#
# Dates
#
statement ok
CREATE TABLE IF NOT EXISTS dates (d date);
statement ok
INSERT INTO dates VALUES
(NULL),
('-99999-01-01'),
('-1993-08-14'),
('1992-01-01 (BC)'),
('-1992-01-01'),
('0044-03-15 (BC)'),
('0000-01-01'),
('0020-01-01'),
('1992-01-01'),
('1992-01-20'),
('1992-02-01'),
('1992-02-02'),
('1992-02-12'),
('1992-02-20'),
('1992-03-03'),
('1992-03-20'),
('1992-04-20'),
('1992-05-05'),
('1992-05-20'),
('1992-06-20'),
('1992-07-20'),
('1992-08-20'),
('1992-09-20'),
('1992-10-20'),
('1992-11-20'),
('1992-12-02'),
('1992-12-20'),
('1993-03-20'),
('1993-03-03'),
('1994-05-05'),
('1993-08-14'),
('2000-12-31'),
('2000-02-12'),
('2001-01-01'),
('2007-01-01'),
('2008-01-01'),
('2008-01-02'),
('2008-02-01'),
('2020-08-09'),
('2020-08-10'),
('2020-09-27'),
('99999-01-01')
query I
SELECT d
FROM (SELECT d, make_date(year(d), month(d), day(d)) md FROM dates) tbl
WHERE md IS DISTINCT FROM d;
----
query I
SELECT d
FROM (SELECT d, make_date(date_part(['year', 'month', 'day'], d)) md FROM dates) tbl
WHERE md IS DISTINCT FROM d;
----
# Null parts
query I
SELECT md
FROM (SELECT make_date(NULL, month(d), day(d)) md FROM dates) t
WHERE md IS NOT NULL
----
query I
SELECT md
FROM (SELECT make_date(year(d), NULL, day(d)) md FROM dates) t
WHERE md IS NOT NULL
----
query I
SELECT md
FROM (SELECT make_date(year(d), month(d), NULL) md FROM dates) t
WHERE md IS NOT NULL
----
# round trip
query I
SELECT *
FROM dates
WHERE d <> make_date((d - date '1970-01-01')::INT)
----
# Constants
query IIII
SELECT
make_date(2021, 12, 30),
make_date(NULL, 12, 30),
make_date(2021, NULL, 30),
make_date(2021, 12, NULL)
;
----
2021-12-30 NULL NULL NULL
#
# Timestamps
#
statement ok
CREATE TABLE timestamps(ts TIMESTAMP)
statement ok
INSERT INTO timestamps VALUES
('1001-03-15 (BC) 20:38:40'),
('0044-03-15 (BC) 20:38:40'),
('1962-07-31 12:20:48.123456'),
('1969-01-01 01:03:20.45432'),
('1992-01-01 01:01:01.400'),
('1992-01-01 01:01:02.200'),
('1992-01-01 01:01:02.400'),
('1993-08-14 08:22:33.42'),
('2001-04-20 14:42:11.0'),
('2001-04-20 14:42:11.123'),
('2004-01-31 12:00:00.000050'),
('2004-01-31 12:00:00.050'),
('2004-02-01 12:00:00.000050'),
('2004-02-01 12:00:00.050'),
('2004-02-29 13:05:47.123456'),
('2008-01-01 00:00:01.5'),
('2008-01-01 00:00:01.594'),
('2008-01-01 00:00:01.794'),
('2008-01-01 00:00:01.88926'),
('2008-01-01 00:00:01.894'),
('2008-01-01 00:00:01.98926'),
('2008-01-01 00:00:01.99926'),
('2008-01-01 00:00:11.1'),
('2019-01-06 04:03:02.123456'),
('2019-01-06 04:03:02.5'),
('2020-01-01 00:00:01.88926'),
('2020-12-31 21:25:58.745232'),
('2021-04-15 14:55:17.915'),
('2021-04-15 14:55:17.915000'),
('2021-05-02 12:11:49.5'),
('2021-12-01 13:54:48.123456'),
('1993-08-14 08:22:33'),
(NULL)
;
query II
SELECT ts, mts
FROM (SELECT ts, make_timestamp(year(ts), month(ts), day(ts), hour(ts), minute(ts), microsecond(ts) / 1000000.0) mts
FROM timestamps) t
WHERE mts IS DISTINCT FROM ts;
----
# Null parts
query I
SELECT md
FROM (
SELECT make_timestamp(NULL, month(ts), day(ts), hour(ts), minute(ts), microsecond(ts) / 1000000.0) md
FROM timestamps) t
WHERE md IS NOT NULL
----
query I
SELECT md
FROM (
SELECT make_timestamp(year(ts), NULL, day(ts), hour(ts), minute(ts), microsecond(ts) / 1000000.0) md
FROM timestamps) t
WHERE md IS NOT NULL
----
query I
SELECT md
FROM (
SELECT make_timestamp(year(ts), month(ts), NULL, hour(ts), minute(ts), microsecond(ts) / 1000000.0) md
FROM timestamps) t
WHERE md IS NOT NULL
----
query I
SELECT md
FROM (
SELECT make_timestamp(year(ts), month(ts), day(ts), NULL, minute(ts), microsecond(ts) / 1000000.0) md
FROM timestamps) t
WHERE md IS NOT NULL
----
query I
SELECT md
FROM (
SELECT make_timestamp(year(ts), month(ts), day(ts), hour(ts), NULL, microsecond(ts) / 1000000.0) md
FROM timestamps) t
WHERE md IS NOT NULL
----
query I
SELECT md
FROM (
SELECT make_timestamp(year(ts), month(ts), day(ts), hour(ts), minute(ts), NULL) md
FROM timestamps) t
WHERE md IS NOT NULL
----
# Constants
query IIIIIII
SELECT
make_timestamp(2021, 12, 30, 12, 41, 46.123456),
make_timestamp(NULL, 12, 30, 12, 41, 46.123456),
make_timestamp(2021, NULL, 30, 12, 41, 46.123456),
make_timestamp(2021, 12, NULL, 12, 41, 46.123456),
make_timestamp(2021, 12, 30, NULL, 41, 46.123456),
make_timestamp(2021, 12, 30, 12, NULL, 46.123456),
make_timestamp(2021, 12, 30, 12, 41, NULL)
;
----
2021-12-30 12:41:46.123456 NULL NULL NULL NULL NULL NULL
# From microseconds
query II
SELECT make_timestamp(0), make_timestamp(1684509234845000);
----
1970-01-01 00:00:00 2023-05-19 15:13:54.845
statement error
SELECT make_timestamp(9223372036854775807); -- Infinity
----
Conversion Error: Timestamp microseconds out of range
# From nanoseconds
query II
SELECT make_timestamp_ns(0), make_timestamp_ns(1684509234845000123);
----
1970-01-01 00:00:00 2023-05-19 15:13:54.845000123
# Maximum value for make_timestamp_ns().
query I
SELECT make_timestamp_ns(9223372036854775806);
----
2262-04-11 23:47:16.854775806
statement error
SELECT make_timestamp_ns(9223372036854775807); -- Infinity
----
Conversion Error: Timestamp microseconds out of range
#
# Times
#
statement ok
CREATE TABLE times(t TIME)
statement ok
INSERT INTO times VALUES
(NULL),
('00:00:01'),
('00:01:20'),
('01:00:00'),
('02:30:01'),
('06:30:00'),
('12:00:30.1234'),
('12:20:48.123456'),
('12:11:49.5'),
('14:55:17.915000'),
('21:15:22'),
('20:08:10.001'),
('20:08:10.33'),
('20:08:10.998'),
('21:25:58.745232')
;
query II
SELECT t, mt
FROM (SELECT t, make_time(hour(t), minute(t), microsecond(t) / 1000000.0) mt
FROM times) tbl
WHERE mt IS DISTINCT FROM t;
----
# Null parts
query I
SELECT md
FROM (SELECT make_time(NULL, minute(d), microsecond(d) / 1000000.0) md FROM dates) t
WHERE md IS NOT NULL
----
query I
SELECT md
FROM (SELECT make_time(hour(d), NULL, microsecond(d) / 1000000.0) md FROM dates) t
WHERE md IS NOT NULL
----
query I
SELECT md
FROM (SELECT make_time(hour(d), minute(d), NULL) md FROM dates) t
WHERE md IS NOT NULL
----
# Constants
query IIII
SELECT
make_time(12, 41, 46.123456),
make_time(NULL, 41, 46.123456),
make_time(12, NULL, 46.123456),
make_time(12, 41, NULL)
;
----
12:41:46.123456 NULL NULL NULL
# Overflow
statement error
SELECT make_timestamp(294247, 1, 10, 4, 0, 54.775807);
----
Conversion Error: Date and time not in timestamp range

View File

@@ -0,0 +1,66 @@
# name: test/sql/function/timestamp/test_date_diff_epoch.test
# description: Test equal period timestamp diffs across the Unix epoch
# group: [timestamp]
statement ok
PRAGMA enable_verification
query III
SELECT
start_ts,
end_ts,
DATEDIFF('day', start_ts, end_ts) AS dd_hour
FROM VALUES (
'1970-01-03 12:12:12'::TIMESTAMP,
'1969-12-25 05:05:05'::TIMESTAMP
) x(start_ts, end_ts);
----
1970-01-03 12:12:12 1969-12-25 05:05:05 -9
query III
SELECT
start_ts,
end_ts,
DATEDIFF('hour', start_ts, end_ts) AS dd_hour
FROM VALUES (
'1970-01-01 12:12:12'::TIMESTAMP,
'1969-12-31 05:05:05'::TIMESTAMP
) x(start_ts, end_ts);
----
1970-01-01 12:12:12 1969-12-31 05:05:05 -31
query III
SELECT
start_ts,
end_ts,
DATEDIFF('minute', start_ts, end_ts) AS dd_minute
FROM VALUES (
'1970-01-01 00:12:12'::TIMESTAMP,
'1969-12-31 23:05:05'::TIMESTAMP
) x(start_ts, end_ts);
----
1970-01-01 00:12:12 1969-12-31 23:05:05 -67
query III
SELECT
start_ts,
end_ts,
DATEDIFF('second', start_ts, end_ts) AS dd_second
FROM VALUES (
'1970-01-01 00:00:12.456'::TIMESTAMP,
'1969-12-31 23:59:05.123'::TIMESTAMP
) x(start_ts, end_ts);
----
1970-01-01 00:00:12.456 1969-12-31 23:59:05.123 -67
query III
SELECT
start_ts,
end_ts,
DATEDIFF('millisecond', start_ts, end_ts) AS dd_second
FROM VALUES (
'1970-01-01 00:00:12.456789'::TIMESTAMP,
'1969-12-31 23:59:05.123456'::TIMESTAMP
) x(start_ts, end_ts);
----
1970-01-01 00:00:12.456789 1969-12-31 23:59:05.123456 -67333

View File

@@ -0,0 +1,959 @@
# name: test/sql/function/timestamp/test_date_part.test
# description: Test the DATE_PART function for TIMESTAMPs
# group: [timestamp]
statement ok
SET default_null_order='nulls_first';
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE timestamps(ts TIMESTAMP)
statement ok
INSERT INTO timestamps VALUES
('-infinity'),
('1962-07-31 12:20:48.123456'),
('1969-01-01 01:03:20.45432'),
('1992-01-01 01:01:01.400'),
('1992-01-01 01:01:02.200'),
('1992-01-01 01:01:02.400'),
('1993-08-14 08:22:33'),
('1993-08-14 08:22:33.42'),
('2001-04-20 14:42:11.0'),
('2001-04-20 14:42:11.123'),
('2004-01-31 12:00:00.000050'),
('2004-01-31 12:00:00.050'),
('2004-02-01 12:00:00.000050'),
('2004-02-01 12:00:00.050'),
('2004-02-29 13:05:47.123456'),
('2008-01-01 00:00:01.5'),
('2008-01-01 00:00:01.594'),
('2008-01-01 00:00:01.794'),
('2008-01-01 00:00:01.88926'),
('2008-01-01 00:00:01.894'),
('2008-01-01 00:00:01.98926'),
('2008-01-01 00:00:01.99926'),
('2008-01-01 00:00:11.1'),
('2019-01-06 04:03:02.123456'),
('2019-01-06 04:03:02.5'),
('2020-01-01 00:00:01.88926'),
('2020-12-31 21:25:58.745232'),
('2021-04-15 14:55:17.915'),
('2021-04-15 14:55:17.915000'),
('2021-05-02 12:11:49.5'),
('2021-12-01 13:54:48.123456'),
('2022-01-01 00:00:41'),
('infinity'),
(NULL)
# Century and millennia rules
statement ok
CREATE TABLE millennia AS SELECT * FROM (VALUES
('1001-03-15 (BC) 20:38:40'::TIMESTAMP),
('0044-03-15 (BC) 20:38:40'::TIMESTAMP),
('0998-02-16 20:38:40'::TIMESTAMP),
('1998-02-16 20:38:40'::TIMESTAMP),
('2001-02-16 20:38:40'::TIMESTAMP)
) tbl(ts);
query II
SELECT ts, DATE_PART('millennium', ts) FROM millennia;
----
1001-03-15 (BC) 20:38:40 -2
0044-03-15 (BC) 20:38:40 -1
0998-02-16 20:38:40 1
1998-02-16 20:38:40 2
2001-02-16 20:38:40 3
query II
SELECT ts, DATE_PART('century', ts) FROM millennia;
----
1001-03-15 (BC) 20:38:40 -11
0044-03-15 (BC) 20:38:40 -1
0998-02-16 20:38:40 10
1998-02-16 20:38:40 20
2001-02-16 20:38:40 21
# ISO Year
query II
SELECT DATE_PART('isoyear', ts), ts
FROM timestamps
ORDER BY 2;
----
NULL NULL
NULL -infinity
1962 1962-07-31 12:20:48.123456
1969 1969-01-01 01:03:20.45432
1992 1992-01-01 01:01:01.4
1992 1992-01-01 01:01:02.2
1992 1992-01-01 01:01:02.4
1993 1993-08-14 08:22:33
1993 1993-08-14 08:22:33.42
2001 2001-04-20 14:42:11
2001 2001-04-20 14:42:11.123
2004 2004-01-31 12:00:00.00005
2004 2004-01-31 12:00:00.05
2004 2004-02-01 12:00:00.00005
2004 2004-02-01 12:00:00.05
2004 2004-02-29 13:05:47.123456
2008 2008-01-01 00:00:01.5
2008 2008-01-01 00:00:01.594
2008 2008-01-01 00:00:01.794
2008 2008-01-01 00:00:01.88926
2008 2008-01-01 00:00:01.894
2008 2008-01-01 00:00:01.98926
2008 2008-01-01 00:00:01.99926
2008 2008-01-01 00:00:11.1
2019 2019-01-06 04:03:02.123456
2019 2019-01-06 04:03:02.5
2020 2020-01-01 00:00:01.88926
2020 2020-12-31 21:25:58.745232
2021 2021-04-15 14:55:17.915
2021 2021-04-15 14:55:17.915
2021 2021-05-02 12:11:49.5
2021 2021-12-01 13:54:48.123456
2021 2022-01-01 00:00:41
NULL infinity
# 2022-01-03 is the first day of ISO-2022
query II
SELECT DATE_PART('isoyear', ts), ts
FROM generate_series('2021-12-26'::TIMESTAMP, '2022-01-12'::TIMESTAMP, INTERVAL 1 DAY) tbl(ts);
----
2021 2021-12-26 00:00:00
2021 2021-12-27 00:00:00
2021 2021-12-28 00:00:00
2021 2021-12-29 00:00:00
2021 2021-12-30 00:00:00
2021 2021-12-31 00:00:00
2021 2022-01-01 00:00:00
2021 2022-01-02 00:00:00
2022 2022-01-03 00:00:00
2022 2022-01-04 00:00:00
2022 2022-01-05 00:00:00
2022 2022-01-06 00:00:00
2022 2022-01-07 00:00:00
2022 2022-01-08 00:00:00
2022 2022-01-09 00:00:00
2022 2022-01-10 00:00:00
2022 2022-01-11 00:00:00
2022 2022-01-12 00:00:00
# Julian Days
query II
SELECT DATE_PART('julian', ts), ts
FROM timestamps
ORDER BY 2;
----
NULL NULL
NULL -infinity
2437877.5144458734 1962-07-31 12:20:48.123456
2440223.0439867396 1969-01-01 01:03:20.45432
2448623.042377315 1992-01-01 01:01:01.4
2448623.042386574 1992-01-01 01:01:02.2
2448623.042388889 1992-01-01 01:01:02.4
2449214.3489930555 1993-08-14 08:22:33
2449214.3489979166 1993-08-14 08:22:33.42
2452020.612627315 2001-04-20 14:42:11
2452020.6126287384 2001-04-20 14:42:11.123
2453036.5000000005 2004-01-31 12:00:00.00005
2453036.500000579 2004-01-31 12:00:00.05
2453037.5000000005 2004-02-01 12:00:00.00005
2453037.500000579 2004-02-01 12:00:00.05
2453065.5456842994 2004-02-29 13:05:47.123456
2454467.0000173612 2008-01-01 00:00:01.5
2454467.000018449 2008-01-01 00:00:01.594
2454467.000020764 2008-01-01 00:00:01.794
2454467.0000218665 2008-01-01 00:00:01.88926
2454467.0000219215 2008-01-01 00:00:01.894
2454467.0000230237 2008-01-01 00:00:01.98926
2454467.0000231396 2008-01-01 00:00:01.99926
2454467.000128472 2008-01-01 00:00:11.1
2458490.168774577 2019-01-06 04:03:02.123456
2458490.168778935 2019-01-06 04:03:02.5
2458850.0000218665 2020-01-01 00:00:01.88926
2459215.893041033 2020-12-31 21:25:58.745232
2459320.621735127 2021-04-15 14:55:17.915
2459320.621735127 2021-04-15 14:55:17.915
2459337.5082118055 2021-05-02 12:11:49.5
2459550.579723651 2021-12-01 13:54:48.123456
2459581.0004745373 2022-01-01 00:00:41
NULL infinity
# Correctness: Compare date_part to named function
foreach partcode era millennium century decade year quarter month day hour minute second millisecond microsecond week weekday isodow dayofyear yearweek isoyear epoch timezone timezone_hour timezone_minute julian
query III
SELECT ts, DATE_PART('${partcode}', ts) AS p, ${partcode}(ts) AS f
FROM timestamps
WHERE p <> f
----
endloop
# Cast injection for DOUBLE types
foreach tstype TIMESTAMP TIMESTAMP_S TIMESTAMP_MS TIMESTAMP_NS
query I
SELECT EXTRACT(EPOCH FROM ${tstype} '1992-09-20 11:30:00.0');
----
716988600.0
query I
SELECT EXTRACT(JULIAN FROM ${tstype} '1992-09-20 00:00:00.0');
----
2448886.0
endloop
#
# Structs
#
# Correctness: Compare struct values with scalar values
foreach partcode era millennium century decade year quarter month day hour minute second millisecond microsecond week weekday isodow doy yearweek isoyear epoch timezone timezone_hour timezone_minute
query III
SELECT ts, DATE_PART('${partcode}', ts) AS p, DATE_PART(['${partcode}'], ts) AS s
FROM timestamps
WHERE p <> s['${partcode}'];
----
endloop
# Date parts
query II
SELECT ts::DATE AS d, DATE_PART(['year', 'month', 'day'], ts) AS parts
FROM timestamps
ORDER BY 1;
----
NULL NULL
-infinity {'year': NULL, 'month': NULL, 'day': NULL}
1962-07-31 {'year': 1962, 'month': 7, 'day': 31}
1969-01-01 {'year': 1969, 'month': 1, 'day': 1}
1992-01-01 {'year': 1992, 'month': 1, 'day': 1}
1992-01-01 {'year': 1992, 'month': 1, 'day': 1}
1992-01-01 {'year': 1992, 'month': 1, 'day': 1}
1993-08-14 {'year': 1993, 'month': 8, 'day': 14}
1993-08-14 {'year': 1993, 'month': 8, 'day': 14}
2001-04-20 {'year': 2001, 'month': 4, 'day': 20}
2001-04-20 {'year': 2001, 'month': 4, 'day': 20}
2004-01-31 {'year': 2004, 'month': 1, 'day': 31}
2004-01-31 {'year': 2004, 'month': 1, 'day': 31}
2004-02-01 {'year': 2004, 'month': 2, 'day': 1}
2004-02-01 {'year': 2004, 'month': 2, 'day': 1}
2004-02-29 {'year': 2004, 'month': 2, 'day': 29}
2008-01-01 {'year': 2008, 'month': 1, 'day': 1}
2008-01-01 {'year': 2008, 'month': 1, 'day': 1}
2008-01-01 {'year': 2008, 'month': 1, 'day': 1}
2008-01-01 {'year': 2008, 'month': 1, 'day': 1}
2008-01-01 {'year': 2008, 'month': 1, 'day': 1}
2008-01-01 {'year': 2008, 'month': 1, 'day': 1}
2008-01-01 {'year': 2008, 'month': 1, 'day': 1}
2008-01-01 {'year': 2008, 'month': 1, 'day': 1}
2019-01-06 {'year': 2019, 'month': 1, 'day': 6}
2019-01-06 {'year': 2019, 'month': 1, 'day': 6}
2020-01-01 {'year': 2020, 'month': 1, 'day': 1}
2020-12-31 {'year': 2020, 'month': 12, 'day': 31}
2021-04-15 {'year': 2021, 'month': 4, 'day': 15}
2021-04-15 {'year': 2021, 'month': 4, 'day': 15}
2021-05-02 {'year': 2021, 'month': 5, 'day': 2}
2021-12-01 {'year': 2021, 'month': 12, 'day': 1}
2022-01-01 {'year': 2022, 'month': 1, 'day': 1}
infinity {'year': NULL, 'month': NULL, 'day': NULL}
query II
SELECT ts::DATE AS d, DATE_PART(['year', 'month', 'day'], ts) AS parts
FROM millennia
ORDER BY 1;
----
1001-03-15 (BC) {'year': -1000, 'month': 3, 'day': 15}
0044-03-15 (BC) {'year': -43, 'month': 3, 'day': 15}
0998-02-16 {'year': 998, 'month': 2, 'day': 16}
1998-02-16 {'year': 1998, 'month': 2, 'day': 16}
2001-02-16 {'year': 2001, 'month': 2, 'day': 16}
# Year parts
query II
SELECT ts::DATE AS d, DATE_PART(['era', 'millennium', 'century', 'decade', 'quarter'], ts) AS parts
FROM timestamps
ORDER BY 1;
----
NULL NULL
-infinity {'era': NULL, 'millennium': NULL, 'century': NULL, 'decade': NULL, 'quarter': NULL}
1962-07-31 {'era': 1, 'millennium': 2, 'century': 20, 'decade': 196, 'quarter': 3}
1969-01-01 {'era': 1, 'millennium': 2, 'century': 20, 'decade': 196, 'quarter': 1}
1992-01-01 {'era': 1, 'millennium': 2, 'century': 20, 'decade': 199, 'quarter': 1}
1992-01-01 {'era': 1, 'millennium': 2, 'century': 20, 'decade': 199, 'quarter': 1}
1992-01-01 {'era': 1, 'millennium': 2, 'century': 20, 'decade': 199, 'quarter': 1}
1993-08-14 {'era': 1, 'millennium': 2, 'century': 20, 'decade': 199, 'quarter': 3}
1993-08-14 {'era': 1, 'millennium': 2, 'century': 20, 'decade': 199, 'quarter': 3}
2001-04-20 {'era': 1, 'millennium': 3, 'century': 21, 'decade': 200, 'quarter': 2}
2001-04-20 {'era': 1, 'millennium': 3, 'century': 21, 'decade': 200, 'quarter': 2}
2004-01-31 {'era': 1, 'millennium': 3, 'century': 21, 'decade': 200, 'quarter': 1}
2004-01-31 {'era': 1, 'millennium': 3, 'century': 21, 'decade': 200, 'quarter': 1}
2004-02-01 {'era': 1, 'millennium': 3, 'century': 21, 'decade': 200, 'quarter': 1}
2004-02-01 {'era': 1, 'millennium': 3, 'century': 21, 'decade': 200, 'quarter': 1}
2004-02-29 {'era': 1, 'millennium': 3, 'century': 21, 'decade': 200, 'quarter': 1}
2008-01-01 {'era': 1, 'millennium': 3, 'century': 21, 'decade': 200, 'quarter': 1}
2008-01-01 {'era': 1, 'millennium': 3, 'century': 21, 'decade': 200, 'quarter': 1}
2008-01-01 {'era': 1, 'millennium': 3, 'century': 21, 'decade': 200, 'quarter': 1}
2008-01-01 {'era': 1, 'millennium': 3, 'century': 21, 'decade': 200, 'quarter': 1}
2008-01-01 {'era': 1, 'millennium': 3, 'century': 21, 'decade': 200, 'quarter': 1}
2008-01-01 {'era': 1, 'millennium': 3, 'century': 21, 'decade': 200, 'quarter': 1}
2008-01-01 {'era': 1, 'millennium': 3, 'century': 21, 'decade': 200, 'quarter': 1}
2008-01-01 {'era': 1, 'millennium': 3, 'century': 21, 'decade': 200, 'quarter': 1}
2019-01-06 {'era': 1, 'millennium': 3, 'century': 21, 'decade': 201, 'quarter': 1}
2019-01-06 {'era': 1, 'millennium': 3, 'century': 21, 'decade': 201, 'quarter': 1}
2020-01-01 {'era': 1, 'millennium': 3, 'century': 21, 'decade': 202, 'quarter': 1}
2020-12-31 {'era': 1, 'millennium': 3, 'century': 21, 'decade': 202, 'quarter': 4}
2021-04-15 {'era': 1, 'millennium': 3, 'century': 21, 'decade': 202, 'quarter': 2}
2021-04-15 {'era': 1, 'millennium': 3, 'century': 21, 'decade': 202, 'quarter': 2}
2021-05-02 {'era': 1, 'millennium': 3, 'century': 21, 'decade': 202, 'quarter': 2}
2021-12-01 {'era': 1, 'millennium': 3, 'century': 21, 'decade': 202, 'quarter': 4}
2022-01-01 {'era': 1, 'millennium': 3, 'century': 21, 'decade': 202, 'quarter': 1}
infinity {'era': NULL, 'millennium': NULL, 'century': NULL, 'decade': NULL, 'quarter': NULL}
query II
SELECT ts::DATE AS d, DATE_PART(['era', 'millennium', 'century', 'decade', 'quarter'], ts) AS parts
FROM millennia
ORDER BY 1;
----
1001-03-15 (BC) {'era': 0, 'millennium': -2, 'century': -11, 'decade': -100, 'quarter': 1}
0044-03-15 (BC) {'era': 0, 'millennium': -1, 'century': -1, 'decade': -4, 'quarter': 1}
0998-02-16 {'era': 1, 'millennium': 1, 'century': 10, 'decade': 99, 'quarter': 1}
1998-02-16 {'era': 1, 'millennium': 2, 'century': 20, 'decade': 199, 'quarter': 1}
2001-02-16 {'era': 1, 'millennium': 3, 'century': 21, 'decade': 200, 'quarter': 1}
# Day parts
query II
SELECT ts::DATE AS d, DATE_PART(['weekday', 'isodow','doy', 'julian'], ts) AS parts
FROM timestamps
ORDER BY ts;
----
NULL NULL
-infinity {'weekday': NULL, 'isodow': NULL, 'doy': NULL, 'julian': NULL}
1962-07-31 {'weekday': 2, 'isodow': 2, 'doy': 212, 'julian': 2437877.5144458734}
1969-01-01 {'weekday': 3, 'isodow': 3, 'doy': 1, 'julian': 2440223.0439867396}
1992-01-01 {'weekday': 3, 'isodow': 3, 'doy': 1, 'julian': 2448623.042377315}
1992-01-01 {'weekday': 3, 'isodow': 3, 'doy': 1, 'julian': 2448623.042386574}
1992-01-01 {'weekday': 3, 'isodow': 3, 'doy': 1, 'julian': 2448623.042388889}
1993-08-14 {'weekday': 6, 'isodow': 6, 'doy': 226, 'julian': 2449214.3489930555}
1993-08-14 {'weekday': 6, 'isodow': 6, 'doy': 226, 'julian': 2449214.3489979166}
2001-04-20 {'weekday': 5, 'isodow': 5, 'doy': 110, 'julian': 2452020.612627315}
2001-04-20 {'weekday': 5, 'isodow': 5, 'doy': 110, 'julian': 2452020.6126287384}
2004-01-31 {'weekday': 6, 'isodow': 6, 'doy': 31, 'julian': 2453036.5000000005}
2004-01-31 {'weekday': 6, 'isodow': 6, 'doy': 31, 'julian': 2453036.500000579}
2004-02-01 {'weekday': 0, 'isodow': 7, 'doy': 32, 'julian': 2453037.5000000005}
2004-02-01 {'weekday': 0, 'isodow': 7, 'doy': 32, 'julian': 2453037.500000579}
2004-02-29 {'weekday': 0, 'isodow': 7, 'doy': 60, 'julian': 2453065.5456842994}
2008-01-01 {'weekday': 2, 'isodow': 2, 'doy': 1, 'julian': 2454467.0000173612}
2008-01-01 {'weekday': 2, 'isodow': 2, 'doy': 1, 'julian': 2454467.000018449}
2008-01-01 {'weekday': 2, 'isodow': 2, 'doy': 1, 'julian': 2454467.000020764}
2008-01-01 {'weekday': 2, 'isodow': 2, 'doy': 1, 'julian': 2454467.0000218665}
2008-01-01 {'weekday': 2, 'isodow': 2, 'doy': 1, 'julian': 2454467.0000219215}
2008-01-01 {'weekday': 2, 'isodow': 2, 'doy': 1, 'julian': 2454467.0000230237}
2008-01-01 {'weekday': 2, 'isodow': 2, 'doy': 1, 'julian': 2454467.0000231396}
2008-01-01 {'weekday': 2, 'isodow': 2, 'doy': 1, 'julian': 2454467.000128472}
2019-01-06 {'weekday': 0, 'isodow': 7, 'doy': 6, 'julian': 2458490.168774577}
2019-01-06 {'weekday': 0, 'isodow': 7, 'doy': 6, 'julian': 2458490.168778935}
2020-01-01 {'weekday': 3, 'isodow': 3, 'doy': 1, 'julian': 2458850.0000218665}
2020-12-31 {'weekday': 4, 'isodow': 4, 'doy': 366, 'julian': 2459215.893041033}
2021-04-15 {'weekday': 4, 'isodow': 4, 'doy': 105, 'julian': 2459320.621735127}
2021-04-15 {'weekday': 4, 'isodow': 4, 'doy': 105, 'julian': 2459320.621735127}
2021-05-02 {'weekday': 0, 'isodow': 7, 'doy': 122, 'julian': 2459337.5082118055}
2021-12-01 {'weekday': 3, 'isodow': 3, 'doy': 335, 'julian': 2459550.579723651}
2022-01-01 {'weekday': 6, 'isodow': 6, 'doy': 1, 'julian': 2459581.0004745373}
infinity {'weekday': NULL, 'isodow': NULL, 'doy': NULL, 'julian': NULL}
query I
SELECT DATE_PART(['weekday', 'isodow', 'doy', 'julian'], '2008-01-01 00:00:01.894'::TIMESTAMP) AS parts
----
{'weekday': 2, 'isodow': 2, 'doy': 1, 'julian': 2454467.0000219215}
query II
SELECT ts::DATE AS d, DATE_PART(['weekday', 'isodow', 'doy', 'julian'], ts) AS parts
FROM millennia
ORDER BY 1;
----
1001-03-15 (BC) {'weekday': 6, 'isodow': 6, 'doy': 74, 'julian': 1355891.8601851852}
0044-03-15 (BC) {'weekday': 5, 'isodow': 5, 'doy': 74, 'julian': 1705428.8601851852}
0998-02-16 {'weekday': 5, 'isodow': 5, 'doy': 47, 'julian': 2085619.8601851852}
1998-02-16 {'weekday': 1, 'isodow': 1, 'doy': 47, 'julian': 2450861.860185185}
2001-02-16 {'weekday': 5, 'isodow': 5, 'doy': 47, 'julian': 2451957.860185185}
# ISO parts
query II
SELECT ts::DATE AS d, DATE_PART(['isoyear', 'week', 'yearweek'], ts) AS parts
FROM timestamps
ORDER BY 1;
----
NULL NULL
-infinity {'isoyear': NULL, 'week': NULL, 'yearweek': NULL}
1962-07-31 {'isoyear': 1962, 'week': 31, 'yearweek': 196231}
1969-01-01 {'isoyear': 1969, 'week': 1, 'yearweek': 196901}
1992-01-01 {'isoyear': 1992, 'week': 1, 'yearweek': 199201}
1992-01-01 {'isoyear': 1992, 'week': 1, 'yearweek': 199201}
1992-01-01 {'isoyear': 1992, 'week': 1, 'yearweek': 199201}
1993-08-14 {'isoyear': 1993, 'week': 32, 'yearweek': 199332}
1993-08-14 {'isoyear': 1993, 'week': 32, 'yearweek': 199332}
2001-04-20 {'isoyear': 2001, 'week': 16, 'yearweek': 200116}
2001-04-20 {'isoyear': 2001, 'week': 16, 'yearweek': 200116}
2004-01-31 {'isoyear': 2004, 'week': 5, 'yearweek': 200405}
2004-01-31 {'isoyear': 2004, 'week': 5, 'yearweek': 200405}
2004-02-01 {'isoyear': 2004, 'week': 5, 'yearweek': 200405}
2004-02-01 {'isoyear': 2004, 'week': 5, 'yearweek': 200405}
2004-02-29 {'isoyear': 2004, 'week': 9, 'yearweek': 200409}
2008-01-01 {'isoyear': 2008, 'week': 1, 'yearweek': 200801}
2008-01-01 {'isoyear': 2008, 'week': 1, 'yearweek': 200801}
2008-01-01 {'isoyear': 2008, 'week': 1, 'yearweek': 200801}
2008-01-01 {'isoyear': 2008, 'week': 1, 'yearweek': 200801}
2008-01-01 {'isoyear': 2008, 'week': 1, 'yearweek': 200801}
2008-01-01 {'isoyear': 2008, 'week': 1, 'yearweek': 200801}
2008-01-01 {'isoyear': 2008, 'week': 1, 'yearweek': 200801}
2008-01-01 {'isoyear': 2008, 'week': 1, 'yearweek': 200801}
2019-01-06 {'isoyear': 2019, 'week': 1, 'yearweek': 201901}
2019-01-06 {'isoyear': 2019, 'week': 1, 'yearweek': 201901}
2020-01-01 {'isoyear': 2020, 'week': 1, 'yearweek': 202001}
2020-12-31 {'isoyear': 2020, 'week': 53, 'yearweek': 202053}
2021-04-15 {'isoyear': 2021, 'week': 15, 'yearweek': 202115}
2021-04-15 {'isoyear': 2021, 'week': 15, 'yearweek': 202115}
2021-05-02 {'isoyear': 2021, 'week': 17, 'yearweek': 202117}
2021-12-01 {'isoyear': 2021, 'week': 48, 'yearweek': 202148}
2022-01-01 {'isoyear': 2021, 'week': 52, 'yearweek': 202152}
infinity {'isoyear': NULL, 'week': NULL, 'yearweek': NULL}
query II
SELECT ts::DATE AS d, DATE_PART(['isoyear', 'week', 'yearweek'], ts) AS parts
FROM millennia
ORDER BY 1;
----
1001-03-15 (BC) {'isoyear': -1000, 'week': 11, 'yearweek': -100011}
0044-03-15 (BC) {'isoyear': -43, 'week': 11, 'yearweek': -4311}
0998-02-16 {'isoyear': 998, 'week': 7, 'yearweek': 99807}
1998-02-16 {'isoyear': 1998, 'week': 8, 'yearweek': 199808}
2001-02-16 {'isoyear': 2001, 'week': 7, 'yearweek': 200107}
# Time parts
query II
SELECT ts, DATE_PART(['hour', 'minute', 'microsecond'], ts) AS parts
FROM timestamps
ORDER BY 1;
----
NULL NULL
-infinity {'hour': NULL, 'minute': NULL, 'microsecond': NULL}
1962-07-31 12:20:48.123456 {'hour': 12, 'minute': 20, 'microsecond': 48123456}
1969-01-01 01:03:20.45432 {'hour': 1, 'minute': 3, 'microsecond': 20454320}
1992-01-01 01:01:01.4 {'hour': 1, 'minute': 1, 'microsecond': 1400000}
1992-01-01 01:01:02.2 {'hour': 1, 'minute': 1, 'microsecond': 2200000}
1992-01-01 01:01:02.4 {'hour': 1, 'minute': 1, 'microsecond': 2400000}
1993-08-14 08:22:33 {'hour': 8, 'minute': 22, 'microsecond': 33000000}
1993-08-14 08:22:33.42 {'hour': 8, 'minute': 22, 'microsecond': 33420000}
2001-04-20 14:42:11 {'hour': 14, 'minute': 42, 'microsecond': 11000000}
2001-04-20 14:42:11.123 {'hour': 14, 'minute': 42, 'microsecond': 11123000}
2004-01-31 12:00:00.00005 {'hour': 12, 'minute': 0, 'microsecond': 50}
2004-01-31 12:00:00.05 {'hour': 12, 'minute': 0, 'microsecond': 50000}
2004-02-01 12:00:00.00005 {'hour': 12, 'minute': 0, 'microsecond': 50}
2004-02-01 12:00:00.05 {'hour': 12, 'minute': 0, 'microsecond': 50000}
2004-02-29 13:05:47.123456 {'hour': 13, 'minute': 5, 'microsecond': 47123456}
2008-01-01 00:00:01.5 {'hour': 0, 'minute': 0, 'microsecond': 1500000}
2008-01-01 00:00:01.594 {'hour': 0, 'minute': 0, 'microsecond': 1594000}
2008-01-01 00:00:01.794 {'hour': 0, 'minute': 0, 'microsecond': 1794000}
2008-01-01 00:00:01.88926 {'hour': 0, 'minute': 0, 'microsecond': 1889260}
2008-01-01 00:00:01.894 {'hour': 0, 'minute': 0, 'microsecond': 1894000}
2008-01-01 00:00:01.98926 {'hour': 0, 'minute': 0, 'microsecond': 1989260}
2008-01-01 00:00:01.99926 {'hour': 0, 'minute': 0, 'microsecond': 1999260}
2008-01-01 00:00:11.1 {'hour': 0, 'minute': 0, 'microsecond': 11100000}
2019-01-06 04:03:02.123456 {'hour': 4, 'minute': 3, 'microsecond': 2123456}
2019-01-06 04:03:02.5 {'hour': 4, 'minute': 3, 'microsecond': 2500000}
2020-01-01 00:00:01.88926 {'hour': 0, 'minute': 0, 'microsecond': 1889260}
2020-12-31 21:25:58.745232 {'hour': 21, 'minute': 25, 'microsecond': 58745232}
2021-04-15 14:55:17.915 {'hour': 14, 'minute': 55, 'microsecond': 17915000}
2021-04-15 14:55:17.915 {'hour': 14, 'minute': 55, 'microsecond': 17915000}
2021-05-02 12:11:49.5 {'hour': 12, 'minute': 11, 'microsecond': 49500000}
2021-12-01 13:54:48.123456 {'hour': 13, 'minute': 54, 'microsecond': 48123456}
2022-01-01 00:00:41 {'hour': 0, 'minute': 0, 'microsecond': 41000000}
infinity {'hour': NULL, 'minute': NULL, 'microsecond': NULL}
query II
SELECT ts, DATE_PART(['hour', 'minute', 'microsecond'], ts) AS parts
FROM millennia
ORDER BY 1;
----
1001-03-15 (BC) 20:38:40 {'hour': 20, 'minute': 38, 'microsecond': 40000000}
0044-03-15 (BC) 20:38:40 {'hour': 20, 'minute': 38, 'microsecond': 40000000}
0998-02-16 20:38:40 {'hour': 20, 'minute': 38, 'microsecond': 40000000}
1998-02-16 20:38:40 {'hour': 20, 'minute': 38, 'microsecond': 40000000}
2001-02-16 20:38:40 {'hour': 20, 'minute': 38, 'microsecond': 40000000}
# Miscellaneous parts
query II
SELECT ts, DATE_PART(['epoch', 'timezone', 'timezone_hour', 'timezone_minute'], ts) AS parts
FROM timestamps
ORDER BY 1;
----
NULL NULL
-infinity {'epoch': NULL, 'timezone': NULL, 'timezone_hour': NULL, 'timezone_minute': NULL}
1962-07-31 12:20:48.123456 {'epoch': -234185951.876544, 'timezone': 0, 'timezone_hour': 0, 'timezone_minute': 0}
1969-01-01 01:03:20.45432 {'epoch': -31532199.54568, 'timezone': 0, 'timezone_hour': 0, 'timezone_minute': 0}
1992-01-01 01:01:01.4 {'epoch': 694227661.4, 'timezone': 0, 'timezone_hour': 0, 'timezone_minute': 0}
1992-01-01 01:01:02.2 {'epoch': 694227662.2, 'timezone': 0, 'timezone_hour': 0, 'timezone_minute': 0}
1992-01-01 01:01:02.4 {'epoch': 694227662.4, 'timezone': 0, 'timezone_hour': 0, 'timezone_minute': 0}
1993-08-14 08:22:33 {'epoch': 745316553.0, 'timezone': 0, 'timezone_hour': 0, 'timezone_minute': 0}
1993-08-14 08:22:33.42 {'epoch': 745316553.42, 'timezone': 0, 'timezone_hour': 0, 'timezone_minute': 0}
2001-04-20 14:42:11 {'epoch': 987777731.0, 'timezone': 0, 'timezone_hour': 0, 'timezone_minute': 0}
2001-04-20 14:42:11.123 {'epoch': 987777731.123, 'timezone': 0, 'timezone_hour': 0, 'timezone_minute': 0}
2004-01-31 12:00:00.00005 {'epoch': 1075550400.00005, 'timezone': 0, 'timezone_hour': 0, 'timezone_minute': 0}
2004-01-31 12:00:00.05 {'epoch': 1075550400.05, 'timezone': 0, 'timezone_hour': 0, 'timezone_minute': 0}
2004-02-01 12:00:00.00005 {'epoch': 1075636800.00005, 'timezone': 0, 'timezone_hour': 0, 'timezone_minute': 0}
2004-02-01 12:00:00.05 {'epoch': 1075636800.05, 'timezone': 0, 'timezone_hour': 0, 'timezone_minute': 0}
2004-02-29 13:05:47.123456 {'epoch': 1078059947.123456, 'timezone': 0, 'timezone_hour': 0, 'timezone_minute': 0}
2008-01-01 00:00:01.5 {'epoch': 1199145601.5, 'timezone': 0, 'timezone_hour': 0, 'timezone_minute': 0}
2008-01-01 00:00:01.594 {'epoch': 1199145601.594, 'timezone': 0, 'timezone_hour': 0, 'timezone_minute': 0}
2008-01-01 00:00:01.794 {'epoch': 1199145601.794, 'timezone': 0, 'timezone_hour': 0, 'timezone_minute': 0}
2008-01-01 00:00:01.88926 {'epoch': 1199145601.88926, 'timezone': 0, 'timezone_hour': 0, 'timezone_minute': 0}
2008-01-01 00:00:01.894 {'epoch': 1199145601.894, 'timezone': 0, 'timezone_hour': 0, 'timezone_minute': 0}
2008-01-01 00:00:01.98926 {'epoch': 1199145601.98926, 'timezone': 0, 'timezone_hour': 0, 'timezone_minute': 0}
2008-01-01 00:00:01.99926 {'epoch': 1199145601.99926, 'timezone': 0, 'timezone_hour': 0, 'timezone_minute': 0}
2008-01-01 00:00:11.1 {'epoch': 1199145611.1, 'timezone': 0, 'timezone_hour': 0, 'timezone_minute': 0}
2019-01-06 04:03:02.123456 {'epoch': 1546747382.123456, 'timezone': 0, 'timezone_hour': 0, 'timezone_minute': 0}
2019-01-06 04:03:02.5 {'epoch': 1546747382.5, 'timezone': 0, 'timezone_hour': 0, 'timezone_minute': 0}
2020-01-01 00:00:01.88926 {'epoch': 1577836801.88926, 'timezone': 0, 'timezone_hour': 0, 'timezone_minute': 0}
2020-12-31 21:25:58.745232 {'epoch': 1609449958.745232, 'timezone': 0, 'timezone_hour': 0, 'timezone_minute': 0}
2021-04-15 14:55:17.915 {'epoch': 1618498517.915, 'timezone': 0, 'timezone_hour': 0, 'timezone_minute': 0}
2021-04-15 14:55:17.915 {'epoch': 1618498517.915, 'timezone': 0, 'timezone_hour': 0, 'timezone_minute': 0}
2021-05-02 12:11:49.5 {'epoch': 1619957509.5, 'timezone': 0, 'timezone_hour': 0, 'timezone_minute': 0}
2021-12-01 13:54:48.123456 {'epoch': 1638366888.123456, 'timezone': 0, 'timezone_hour': 0, 'timezone_minute': 0}
2022-01-01 00:00:41 {'epoch': 1640995241.0, 'timezone': 0, 'timezone_hour': 0, 'timezone_minute': 0}
infinity {'epoch': NULL, 'timezone': NULL, 'timezone_hour': NULL, 'timezone_minute': NULL}
query II
SELECT ts, DATE_PART(['epoch', 'timezone', 'timezone_hour', 'timezone_minute'], ts) AS parts
FROM millennia
ORDER BY 1;
----
1001-03-15 (BC) 20:38:40 {'epoch': -93717746480.0, 'timezone': 0, 'timezone_hour': 0, 'timezone_minute': 0}
0044-03-15 (BC) 20:38:40 {'epoch': -63517749680.0, 'timezone': 0, 'timezone_hour': 0, 'timezone_minute': 0}
0998-02-16 20:38:40 {'epoch': -30669247280.0, 'timezone': 0, 'timezone_hour': 0, 'timezone_minute': 0}
1998-02-16 20:38:40 {'epoch': 887661520.0, 'timezone': 0, 'timezone_hour': 0, 'timezone_minute': 0}
2001-02-16 20:38:40 {'epoch': 982355920.0, 'timezone': 0, 'timezone_hour': 0, 'timezone_minute': 0}
query I
SELECT DATE_PART(['hour', 'minute', 'microsecond'], NULL::TIMESTAMP);
----
NULL
query I
SELECT DATE_PART(['hour', 'minute', 'microsecond'], '1962-07-31 12:20:48.123456'::TIMESTAMP);
----
{'hour': 12, 'minute': 20, 'microsecond': 48123456}
# Aliases
query I
SELECT DATE_PART(['month', 'months', 'mon'], '1962-07-31 12:20:48.123456'::TIMESTAMP);
----
{'month': 7, 'months': 7, 'mon': 7}
query II
SELECT ts::DATE AS d, DATE_PART(['year', 'month', 'months'], ts) AS parts
FROM timestamps
ORDER BY 1;
----
NULL NULL
-infinity {'year': NULL, 'month': NULL, 'months': NULL}
1962-07-31 {'year': 1962, 'month': 7, 'months': 7}
1969-01-01 {'year': 1969, 'month': 1, 'months': 1}
1992-01-01 {'year': 1992, 'month': 1, 'months': 1}
1992-01-01 {'year': 1992, 'month': 1, 'months': 1}
1992-01-01 {'year': 1992, 'month': 1, 'months': 1}
1993-08-14 {'year': 1993, 'month': 8, 'months': 8}
1993-08-14 {'year': 1993, 'month': 8, 'months': 8}
2001-04-20 {'year': 2001, 'month': 4, 'months': 4}
2001-04-20 {'year': 2001, 'month': 4, 'months': 4}
2004-01-31 {'year': 2004, 'month': 1, 'months': 1}
2004-01-31 {'year': 2004, 'month': 1, 'months': 1}
2004-02-01 {'year': 2004, 'month': 2, 'months': 2}
2004-02-01 {'year': 2004, 'month': 2, 'months': 2}
2004-02-29 {'year': 2004, 'month': 2, 'months': 2}
2008-01-01 {'year': 2008, 'month': 1, 'months': 1}
2008-01-01 {'year': 2008, 'month': 1, 'months': 1}
2008-01-01 {'year': 2008, 'month': 1, 'months': 1}
2008-01-01 {'year': 2008, 'month': 1, 'months': 1}
2008-01-01 {'year': 2008, 'month': 1, 'months': 1}
2008-01-01 {'year': 2008, 'month': 1, 'months': 1}
2008-01-01 {'year': 2008, 'month': 1, 'months': 1}
2008-01-01 {'year': 2008, 'month': 1, 'months': 1}
2019-01-06 {'year': 2019, 'month': 1, 'months': 1}
2019-01-06 {'year': 2019, 'month': 1, 'months': 1}
2020-01-01 {'year': 2020, 'month': 1, 'months': 1}
2020-12-31 {'year': 2020, 'month': 12, 'months': 12}
2021-04-15 {'year': 2021, 'month': 4, 'months': 4}
2021-04-15 {'year': 2021, 'month': 4, 'months': 4}
2021-05-02 {'year': 2021, 'month': 5, 'months': 5}
2021-12-01 {'year': 2021, 'month': 12, 'months': 12}
2022-01-01 {'year': 2022, 'month': 1, 'months': 1}
infinity {'year': NULL, 'month': NULL, 'months': NULL}
#
# Function-only parts
#
query II
SELECT ts, epoch_us(ts) FROM timestamps ORDER BY ALL;
----
NULL NULL
-infinity NULL
1962-07-31 12:20:48.123456 -234185951876544
1969-01-01 01:03:20.45432 -31532199545680
1992-01-01 01:01:01.4 694227661400000
1992-01-01 01:01:02.2 694227662200000
1992-01-01 01:01:02.4 694227662400000
1993-08-14 08:22:33 745316553000000
1993-08-14 08:22:33.42 745316553420000
2001-04-20 14:42:11 987777731000000
2001-04-20 14:42:11.123 987777731123000
2004-01-31 12:00:00.00005 1075550400000050
2004-01-31 12:00:00.05 1075550400050000
2004-02-01 12:00:00.00005 1075636800000050
2004-02-01 12:00:00.05 1075636800050000
2004-02-29 13:05:47.123456 1078059947123456
2008-01-01 00:00:01.5 1199145601500000
2008-01-01 00:00:01.594 1199145601594000
2008-01-01 00:00:01.794 1199145601794000
2008-01-01 00:00:01.88926 1199145601889260
2008-01-01 00:00:01.894 1199145601894000
2008-01-01 00:00:01.98926 1199145601989260
2008-01-01 00:00:01.99926 1199145601999260
2008-01-01 00:00:11.1 1199145611100000
2019-01-06 04:03:02.123456 1546747382123456
2019-01-06 04:03:02.5 1546747382500000
2020-01-01 00:00:01.88926 1577836801889260
2020-12-31 21:25:58.745232 1609449958745232
2021-04-15 14:55:17.915 1618498517915000
2021-04-15 14:55:17.915 1618498517915000
2021-05-02 12:11:49.5 1619957509500000
2021-12-01 13:54:48.123456 1638366888123456
2022-01-01 00:00:41 1640995241000000
infinity NULL
# EPOCH_US doesn't require ICU
query II
SELECT ts::TIMESTAMPTZ, epoch_us(ts::TIMESTAMPTZ) FROM timestamps ORDER BY ALL;
----
NULL NULL
-infinity NULL
1962-07-31 12:20:48.123456+00 -234185951876544
1969-01-01 01:03:20.45432+00 -31532199545680
1992-01-01 01:01:01.4+00 694227661400000
1992-01-01 01:01:02.2+00 694227662200000
1992-01-01 01:01:02.4+00 694227662400000
1993-08-14 08:22:33+00 745316553000000
1993-08-14 08:22:33.42+00 745316553420000
2001-04-20 14:42:11+00 987777731000000
2001-04-20 14:42:11.123+00 987777731123000
2004-01-31 12:00:00.00005+00 1075550400000050
2004-01-31 12:00:00.05+00 1075550400050000
2004-02-01 12:00:00.00005+00 1075636800000050
2004-02-01 12:00:00.05+00 1075636800050000
2004-02-29 13:05:47.123456+00 1078059947123456
2008-01-01 00:00:01.5+00 1199145601500000
2008-01-01 00:00:01.594+00 1199145601594000
2008-01-01 00:00:01.794+00 1199145601794000
2008-01-01 00:00:01.88926+00 1199145601889260
2008-01-01 00:00:01.894+00 1199145601894000
2008-01-01 00:00:01.98926+00 1199145601989260
2008-01-01 00:00:01.99926+00 1199145601999260
2008-01-01 00:00:11.1+00 1199145611100000
2019-01-06 04:03:02.123456+00 1546747382123456
2019-01-06 04:03:02.5+00 1546747382500000
2020-01-01 00:00:01.88926+00 1577836801889260
2020-12-31 21:25:58.745232+00 1609449958745232
2021-04-15 14:55:17.915+00 1618498517915000
2021-04-15 14:55:17.915+00 1618498517915000
2021-05-02 12:11:49.5+00 1619957509500000
2021-12-01 13:54:48.123456+00 1638366888123456
2022-01-01 00:00:41+00 1640995241000000
infinity NULL
query II
SELECT ts, epoch_ms(ts) FROM timestamps ORDER BY ALL;
----
NULL NULL
-infinity NULL
1962-07-31 12:20:48.123456 -234185951876
1969-01-01 01:03:20.45432 -31532199545
1992-01-01 01:01:01.4 694227661400
1992-01-01 01:01:02.2 694227662200
1992-01-01 01:01:02.4 694227662400
1993-08-14 08:22:33 745316553000
1993-08-14 08:22:33.42 745316553420
2001-04-20 14:42:11 987777731000
2001-04-20 14:42:11.123 987777731123
2004-01-31 12:00:00.00005 1075550400000
2004-01-31 12:00:00.05 1075550400050
2004-02-01 12:00:00.00005 1075636800000
2004-02-01 12:00:00.05 1075636800050
2004-02-29 13:05:47.123456 1078059947123
2008-01-01 00:00:01.5 1199145601500
2008-01-01 00:00:01.594 1199145601594
2008-01-01 00:00:01.794 1199145601794
2008-01-01 00:00:01.88926 1199145601889
2008-01-01 00:00:01.894 1199145601894
2008-01-01 00:00:01.98926 1199145601989
2008-01-01 00:00:01.99926 1199145601999
2008-01-01 00:00:11.1 1199145611100
2019-01-06 04:03:02.123456 1546747382123
2019-01-06 04:03:02.5 1546747382500
2020-01-01 00:00:01.88926 1577836801889
2020-12-31 21:25:58.745232 1609449958745
2021-04-15 14:55:17.915 1618498517915
2021-04-15 14:55:17.915 1618498517915
2021-05-02 12:11:49.5 1619957509500
2021-12-01 13:54:48.123456 1638366888123
2022-01-01 00:00:41 1640995241000
infinity NULL
# EPOCH_MS doesn't require ICU
query II
SELECT ts::TIMESTAMPTZ, epoch_ms(ts::TIMESTAMPTZ) FROM timestamps ORDER BY ALL;
----
NULL NULL
-infinity NULL
1962-07-31 12:20:48.123456+00 -234185951876
1969-01-01 01:03:20.45432+00 -31532199545
1992-01-01 01:01:01.4+00 694227661400
1992-01-01 01:01:02.2+00 694227662200
1992-01-01 01:01:02.4+00 694227662400
1993-08-14 08:22:33+00 745316553000
1993-08-14 08:22:33.42+00 745316553420
2001-04-20 14:42:11+00 987777731000
2001-04-20 14:42:11.123+00 987777731123
2004-01-31 12:00:00.00005+00 1075550400000
2004-01-31 12:00:00.05+00 1075550400050
2004-02-01 12:00:00.00005+00 1075636800000
2004-02-01 12:00:00.05+00 1075636800050
2004-02-29 13:05:47.123456+00 1078059947123
2008-01-01 00:00:01.5+00 1199145601500
2008-01-01 00:00:01.594+00 1199145601594
2008-01-01 00:00:01.794+00 1199145601794
2008-01-01 00:00:01.88926+00 1199145601889
2008-01-01 00:00:01.894+00 1199145601894
2008-01-01 00:00:01.98926+00 1199145601989
2008-01-01 00:00:01.99926+00 1199145601999
2008-01-01 00:00:11.1+00 1199145611100
2019-01-06 04:03:02.123456+00 1546747382123
2019-01-06 04:03:02.5+00 1546747382500
2020-01-01 00:00:01.88926+00 1577836801889
2020-12-31 21:25:58.745232+00 1609449958745
2021-04-15 14:55:17.915+00 1618498517915
2021-04-15 14:55:17.915+00 1618498517915
2021-05-02 12:11:49.5+00 1619957509500
2021-12-01 13:54:48.123456+00 1638366888123
2022-01-01 00:00:41+00 1640995241000
infinity NULL
query II
SELECT ts, epoch_ns(ts) FROM timestamps ORDER BY ALL;
----
NULL NULL
-infinity NULL
1962-07-31 12:20:48.123456 -234185951876544000
1969-01-01 01:03:20.45432 -31532199545680000
1992-01-01 01:01:01.4 694227661400000000
1992-01-01 01:01:02.2 694227662200000000
1992-01-01 01:01:02.4 694227662400000000
1993-08-14 08:22:33 745316553000000000
1993-08-14 08:22:33.42 745316553420000000
2001-04-20 14:42:11 987777731000000000
2001-04-20 14:42:11.123 987777731123000000
2004-01-31 12:00:00.00005 1075550400000050000
2004-01-31 12:00:00.05 1075550400050000000
2004-02-01 12:00:00.00005 1075636800000050000
2004-02-01 12:00:00.05 1075636800050000000
2004-02-29 13:05:47.123456 1078059947123456000
2008-01-01 00:00:01.5 1199145601500000000
2008-01-01 00:00:01.594 1199145601594000000
2008-01-01 00:00:01.794 1199145601794000000
2008-01-01 00:00:01.88926 1199145601889260000
2008-01-01 00:00:01.894 1199145601894000000
2008-01-01 00:00:01.98926 1199145601989260000
2008-01-01 00:00:01.99926 1199145601999260000
2008-01-01 00:00:11.1 1199145611100000000
2019-01-06 04:03:02.123456 1546747382123456000
2019-01-06 04:03:02.5 1546747382500000000
2020-01-01 00:00:01.88926 1577836801889260000
2020-12-31 21:25:58.745232 1609449958745232000
2021-04-15 14:55:17.915 1618498517915000000
2021-04-15 14:55:17.915 1618498517915000000
2021-05-02 12:11:49.5 1619957509500000000
2021-12-01 13:54:48.123456 1638366888123456000
2022-01-01 00:00:41 1640995241000000000
infinity NULL
# EPOCH_NS doesn't require ICU
query II
SELECT ts::TIMESTAMPTZ, epoch_ns(ts::TIMESTAMPTZ) FROM timestamps ORDER BY ALL;
----
NULL NULL
-infinity NULL
1962-07-31 12:20:48.123456+00 -234185951876544000
1969-01-01 01:03:20.45432+00 -31532199545680000
1992-01-01 01:01:01.4+00 694227661400000000
1992-01-01 01:01:02.2+00 694227662200000000
1992-01-01 01:01:02.4+00 694227662400000000
1993-08-14 08:22:33+00 745316553000000000
1993-08-14 08:22:33.42+00 745316553420000000
2001-04-20 14:42:11+00 987777731000000000
2001-04-20 14:42:11.123+00 987777731123000000
2004-01-31 12:00:00.00005+00 1075550400000050000
2004-01-31 12:00:00.05+00 1075550400050000000
2004-02-01 12:00:00.00005+00 1075636800000050000
2004-02-01 12:00:00.05+00 1075636800050000000
2004-02-29 13:05:47.123456+00 1078059947123456000
2008-01-01 00:00:01.5+00 1199145601500000000
2008-01-01 00:00:01.594+00 1199145601594000000
2008-01-01 00:00:01.794+00 1199145601794000000
2008-01-01 00:00:01.88926+00 1199145601889260000
2008-01-01 00:00:01.894+00 1199145601894000000
2008-01-01 00:00:01.98926+00 1199145601989260000
2008-01-01 00:00:01.99926+00 1199145601999260000
2008-01-01 00:00:11.1+00 1199145611100000000
2019-01-06 04:03:02.123456+00 1546747382123456000
2019-01-06 04:03:02.5+00 1546747382500000000
2020-01-01 00:00:01.88926+00 1577836801889260000
2020-12-31 21:25:58.745232+00 1609449958745232000
2021-04-15 14:55:17.915+00 1618498517915000000
2021-04-15 14:55:17.915+00 1618498517915000000
2021-05-02 12:11:49.5+00 1619957509500000000
2021-12-01 13:54:48.123456+00 1638366888123456000
2022-01-01 00:00:41+00 1640995241000000000
infinity NULL
query II
SELECT ts, nanosecond(ts) FROM timestamps ORDER BY ALL;
----
NULL NULL
-infinity NULL
1962-07-31 12:20:48.123456 48123456000
1969-01-01 01:03:20.45432 20454320000
1992-01-01 01:01:01.4 1400000000
1992-01-01 01:01:02.2 2200000000
1992-01-01 01:01:02.4 2400000000
1993-08-14 08:22:33 33000000000
1993-08-14 08:22:33.42 33420000000
2001-04-20 14:42:11 11000000000
2001-04-20 14:42:11.123 11123000000
2004-01-31 12:00:00.00005 50000
2004-01-31 12:00:00.05 50000000
2004-02-01 12:00:00.00005 50000
2004-02-01 12:00:00.05 50000000
2004-02-29 13:05:47.123456 47123456000
2008-01-01 00:00:01.5 1500000000
2008-01-01 00:00:01.594 1594000000
2008-01-01 00:00:01.794 1794000000
2008-01-01 00:00:01.88926 1889260000
2008-01-01 00:00:01.894 1894000000
2008-01-01 00:00:01.98926 1989260000
2008-01-01 00:00:01.99926 1999260000
2008-01-01 00:00:11.1 11100000000
2019-01-06 04:03:02.123456 2123456000
2019-01-06 04:03:02.5 2500000000
2020-01-01 00:00:01.88926 1889260000
2020-12-31 21:25:58.745232 58745232000
2021-04-15 14:55:17.915 17915000000
2021-04-15 14:55:17.915 17915000000
2021-05-02 12:11:49.5 49500000000
2021-12-01 13:54:48.123456 48123456000
2022-01-01 00:00:41 41000000000
infinity NULL
query II
SELECT ts::TIMESTAMPTZ, nanosecond(ts::TIMESTAMPTZ) FROM timestamps ORDER BY ALL;
----
NULL NULL
-infinity NULL
1962-07-31 12:20:48.123456+00 48123456000
1969-01-01 01:03:20.45432+00 20454320000
1992-01-01 01:01:01.4+00 1400000000
1992-01-01 01:01:02.2+00 2200000000
1992-01-01 01:01:02.4+00 2400000000
1993-08-14 08:22:33+00 33000000000
1993-08-14 08:22:33.42+00 33420000000
2001-04-20 14:42:11+00 11000000000
2001-04-20 14:42:11.123+00 11123000000
2004-01-31 12:00:00.00005+00 50000
2004-01-31 12:00:00.05+00 50000000
2004-02-01 12:00:00.00005+00 50000
2004-02-01 12:00:00.05+00 50000000
2004-02-29 13:05:47.123456+00 47123456000
2008-01-01 00:00:01.5+00 1500000000
2008-01-01 00:00:01.594+00 1594000000
2008-01-01 00:00:01.794+00 1794000000
2008-01-01 00:00:01.88926+00 1889260000
2008-01-01 00:00:01.894+00 1894000000
2008-01-01 00:00:01.98926+00 1989260000
2008-01-01 00:00:01.99926+00 1999260000
2008-01-01 00:00:11.1+00 11100000000
2019-01-06 04:03:02.123456+00 2123456000
2019-01-06 04:03:02.5+00 2500000000
2020-01-01 00:00:01.88926+00 1889260000
2020-12-31 21:25:58.745232+00 58745232000
2021-04-15 14:55:17.915+00 17915000000
2021-04-15 14:55:17.915+00 17915000000
2021-05-02 12:11:49.5+00 49500000000
2021-12-01 13:54:48.123456+00 48123456000
2022-01-01 00:00:41+00 41000000000
infinity NULL
query I
SELECT nanosecond(t)
FROM VALUES
('1992-01-01 12:03:27.123456789'::TIMESTAMP_NS),
('1900-01-01 03:08:47.987654'::TIMESTAMP_NS),
(NULL::TIMESTAMP_NS),
('2020-09-27 13:12:01'::TIMESTAMP_NS)
AS tbl(t);
----
27123456789
47987654000
NULL
1000000000
# Invalid parts
statement error
SELECT ts, DATE_PART(['duck', 'month', 'day'], ts) AS parts
FROM timestamps
ORDER BY 1;
----
# Duplicate parts
statement error
SELECT ts, DATE_PART(['year', 'month', 'day', 'year'], ts) AS parts
FROM timestamps
ORDER BY 1;
----
# Empty parts
statement error
SELECT DATE_PART([], ts) FROM timestamps;
----
# Null parts
statement error
SELECT DATE_PART(['year', NULL, 'month'], ts) FROM timestamps;
----
# Non-constant parts
statement error
WITH parts(p) AS (VALUES (['year', 'month', 'day']), (['hour', 'minute', 'microsecond']))
SELECT DATE_PART(p, ts) FROM parts, timestamps;
----
# epoch_ns has nanosecond precision on TIMESTAMP_NS
query I
select epoch_ns(make_timestamp_ns(1732118940123456789))
----
1732118940123456789

View File

@@ -0,0 +1,120 @@
# name: test/sql/function/timestamp/test_extract.test
# description: Extract timestamp function
# group: [timestamp]
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE timestamps(i TIMESTAMP)
statement ok
INSERT INTO timestamps VALUES ('1993-08-14 08:22:33'), (NULL)
# extract various parts of the timestamp
query I
SELECT EXTRACT(year FROM i) FROM timestamps
----
1993
NULL
query I
SELECT EXTRACT(month FROM i) FROM timestamps
----
8
NULL
query I
SELECT EXTRACT(day FROM i) FROM timestamps
----
14
NULL
query I
SELECT EXTRACT(week FROM i) FROM timestamps
----
32
NULL
query I
SELECT EXTRACT(yearweek FROM i) FROM timestamps
----
199332
NULL
query I
SELECT EXTRACT(quarter FROM i) FROM timestamps
----
3
NULL
query I
SELECT EXTRACT(decade FROM i) FROM timestamps
----
199
NULL
query I
SELECT EXTRACT(century FROM i) FROM timestamps
----
20
NULL
# day of the week (Sunday = 0, Saturday = 6)
query I
SELECT EXTRACT(DOW FROM i) FROM timestamps
----
6
NULL
# day of the year (1 - 365/366)
query I
SELECT EXTRACT(DOY FROM i) FROM timestamps
----
226
NULL
query I
SELECT EXTRACT(epoch FROM i) FROM timestamps
----
745316553
NULL
# isodow (Monday = 1, Sunday = 7)
query I
SELECT EXTRACT(ISODOW FROM i) FROM timestamps
----
6
NULL
# millennium (change of millennium is January 1, X001)
query I
SELECT EXTRACT(millennium FROM i) FROM timestamps
----
2
NULL
query I
SELECT EXTRACT(second FROM i) FROM timestamps
----
33
NULL
query I
SELECT EXTRACT(minute FROM i) FROM timestamps
----
22
NULL
query I
SELECT EXTRACT(hour FROM i) FROM timestamps
----
8
NULL
query I
SELECT EXTRACT(milliseconds FROM i) FROM timestamps
----
33000
NULL

View File

@@ -0,0 +1,37 @@
# name: test/sql/function/timestamp/test_extract_ms.test
# description: Extract milliseconds from timestamp
# group: [timestamp]
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE timestamps(i TIMESTAMP);
statement ok
INSERT INTO timestamps VALUES ('1993-08-14 08:22:33.42'), (NULL);
# postgres returns 33.42 here
query I
SELECT EXTRACT(second FROM i) FROM timestamps;
----
33
NULL
query I
SELECT EXTRACT(minute FROM i) FROM timestamps;
----
22
NULL
query I
SELECT EXTRACT(milliseconds FROM i) FROM timestamps;
----
33420
NULL
query I
SELECT EXTRACT(microseconds FROM i) FROM timestamps;
----
33420000
NULL

View File

@@ -0,0 +1,147 @@
# name: test/sql/function/timestamp/test_icu_age.test
# description: Test ICU age functionality
# group: [timestamp]
require icu
statement ok
SET Calendar = 'gregorian';
statement ok
SET TimeZone = 'America/Los_Angeles';
# age without second timestamp compares to NOW()
statement ok
SELECT AGE(TIMESTAMPTZ '1957-06-13') t;
query T
SELECT AGE(TIMESTAMP '2001-04-10 00:00:00-07', TIMESTAMP '1957-06-13 00:00:00-07');
----
43 years 9 months 27 days
query T
SELECT age(TIMESTAMP '2014-04-25 00:00:00-07', TIMESTAMP '2014-04-17 00:00:00-07');
----
8 days
# Daylight savings time
query T
SELECT age(TIMESTAMPTZ '2014-04-25', TIMESTAMPTZ '2014-01-01');
----
3 months 24 days
query T
SELECT age(TIMESTAMPTZ '2019-06-11', TIMESTAMPTZ '2019-06-11');
----
00:00:00
query T
SELECT age(TIMESTAMPTZ '2019-06-11', TIMESTAMPTZ '2019-06-11')::VARCHAR;
----
00:00:00
query T
SELECT age(TIMESTAMPTZ '2019-06-11 12:00:00-07', TIMESTAMPTZ '2019-07-11 11:00:00-07');
----
-29 days -23:00:00
statement ok
CREATE TABLE timestamps(t1 TIMESTAMPTZ, t2 TIMESTAMPTZ);
statement ok
INSERT INTO timestamps VALUES
('2001-04-10', '1957-06-13'),
('2014-04-25', '2014-04-17'),
('2014-04-25','2014-01-01'),
('2019-06-11', '2019-06-11'),
(NULL, '2019-06-11'),
('2019-06-11', NULL),
(NULL, NULL)
# Differences from the built in AGE function are due to ICU
# computing month lengths from the originating month
# instead of assuming a constant month size of 30 days
query T
SELECT AGE(t1, TIMESTAMPTZ '1957-06-13') FROM timestamps;
----
43 years 9 months 27 days
56 years 10 months 12 days
56 years 10 months 12 days
61 years 11 months 28 days
NULL
61 years 11 months 28 days
NULL
# Time fields caused by DST
query T
SELECT AGE(TIMESTAMPTZ '2001-04-10', t2) FROM timestamps;
----
43 years 9 months 27 days
-13 years -7 days
-12 years -8 months -21 days
-18 years -2 months -1 day
-18 years -2 months -1 day
NULL
NULL
query T
SELECT AGE(t1, t2) FROM timestamps;
----
43 years 9 months 27 days
8 days
3 months 24 days
00:00:00
NULL
NULL
NULL
query T
SELECT t1 - t2 FROM timestamps;
----
16007 days
8 days
114 days
00:00:00
NULL
NULL
NULL
query T
SELECT AGE(t1, t2) FROM timestamps WHERE t1 > '2001-12-12';
----
8 days
3 months 24 days
00:00:00
NULL
query T
SELECT AGE(NULL, NULL);
----
NULL
query T
SELECT AGE(TIMESTAMPTZ '1957-06-13', NULL);
----
NULL
query T
SELECT AGE(NULL, TIMESTAMPTZ '1957-06-13');
----
NULL
# Subsecond tests
query I
SELECT AGE(TIMESTAMPTZ '1992-01-01 01:01:02.400', TIMESTAMPTZ '1992-01-01 01:01:02.200');
----
00:00:00.2
query I
SELECT AGE(TIMESTAMPTZ '1992-01-01 01:01:02.200', TIMESTAMPTZ '1992-01-01 01:01:02.400');
----
-00:00:00.2
query I
SELECT AGE(TIMESTAMPTZ '1992-01-01 01:01:01.400', TIMESTAMPTZ '1992-01-01 01:01:02.200');
----
-00:00:00.8

View File

@@ -0,0 +1,576 @@
# name: test/sql/function/timestamp/test_icu_dateadd.test
# description: Test ICU date + interval functionality
# group: [timestamp]
require icu
# Normalise the testing locale
statement ok
SET Calendar = 'gregorian';
statement ok
SET TimeZone = 'America/Los_Angeles';
# Quick syntax check
query T
SELECT '2021-12-01 13:54:48Z'::TIMESTAMPTZ + INTERVAL 1 DAY;
----
2021-12-02 05:54:48-08
# Various intervals
statement ok
CREATE TABLE intervals AS SELECT iv FROM (VALUES
(INTERVAL 1 year),
(INTERVAL (-1) year),
(INTERVAL 1 month),
(INTERVAL (-1) month),
(INTERVAL 13 month),
(INTERVAL (-15) month),
(INTERVAL 1 day),
(INTERVAL (-1) day),
(INTERVAL 32 day),
(INTERVAL (-40) day),
(INTERVAL 1 hour),
(INTERVAL (-1) hour),
(INTERVAL 11 hour),
(INTERVAL (-14) hour),
(INTERVAL 1 minute),
(INTERVAL (-1) minute),
(INTERVAL 6 minute),
(INTERVAL (-72) minute),
(INTERVAL 1 second),
(INTERVAL (-1) second),
(INTERVAL 23 second),
(INTERVAL (-118) second),
(INTERVAL 1 millisecond),
(INTERVAL (-1) millisecond),
(INTERVAL 910 millisecond),
(INTERVAL (-150) millisecond),
(INTERVAL 1 microsecond),
(INTERVAL (-1) microsecond),
(INTERVAL 612 microsecond),
(INTERVAL (-485) microsecond)
) tbl(iv);
# timestamp + interval
query II
SELECT iv, '2021-12-01 13:54:48.123456Z'::TIMESTAMPTZ + iv FROM intervals;
----
1 year 2022-12-01 05:54:48.123456-08
-1 year 2020-12-01 05:54:48.123456-08
1 month 2022-01-01 05:54:48.123456-08
-1 month 2021-11-01 05:54:48.123456-07
1 year 1 month 2023-01-01 05:54:48.123456-08
-1 year -3 months 2020-09-01 05:54:48.123456-07
1 day 2021-12-02 05:54:48.123456-08
-1 day 2021-11-30 05:54:48.123456-08
32 days 2022-01-02 05:54:48.123456-08
-40 days 2021-10-22 05:54:48.123456-07
01:00:00 2021-12-01 06:54:48.123456-08
-01:00:00 2021-12-01 04:54:48.123456-08
11:00:00 2021-12-01 16:54:48.123456-08
-14:00:00 2021-11-30 15:54:48.123456-08
00:01:00 2021-12-01 05:55:48.123456-08
-00:01:00 2021-12-01 05:53:48.123456-08
00:06:00 2021-12-01 06:00:48.123456-08
-01:12:00 2021-12-01 04:42:48.123456-08
00:00:01 2021-12-01 05:54:49.123456-08
-00:00:01 2021-12-01 05:54:47.123456-08
00:00:23 2021-12-01 05:55:11.123456-08
-00:01:58 2021-12-01 05:52:50.123456-08
00:00:00.001 2021-12-01 05:54:48.124456-08
-00:00:00.001 2021-12-01 05:54:48.122456-08
00:00:00.91 2021-12-01 05:54:49.033456-08
-00:00:00.15 2021-12-01 05:54:47.973456-08
00:00:00.000001 2021-12-01 05:54:48.123457-08
-00:00:00.000001 2021-12-01 05:54:48.123455-08
00:00:00.000612 2021-12-01 05:54:48.124068-08
-00:00:00.000485 2021-12-01 05:54:48.122971-08
# ms overflow
query I
select '1999-12-31 16:00:00-08'::timestamptz + interval 2400 hours
----
2000-04-09 17:00:00-07
statement error
select 'epoch'::timestamptz + '9223372036854775000 microseconds'::interval
----
Conversion Error: ICU date overflows timestamp range
query I
select 'epoch'::timestamptz + '9223372036854774999 microseconds'::interval
----
294247-01-09 20:00:54.774999-08
statement error
select 'epoch'::timestamptz + '-9223372022400001001 microseconds'::interval
----
Conversion Error: ICU date overflows timestamp range
query I
select 'epoch'::timestamptz + '-9223372022400001000 microseconds'::interval
----
290309-12-21 (BC) 16:07:02-07:52
# interval + timestamp
query II
SELECT iv, iv + '2021-12-01 13:54:48.123456Z'::TIMESTAMPTZ FROM intervals;
----
1 year 2022-12-01 05:54:48.123456-08
-1 year 2020-12-01 05:54:48.123456-08
1 month 2022-01-01 05:54:48.123456-08
-1 month 2021-11-01 05:54:48.123456-07
1 year 1 month 2023-01-01 05:54:48.123456-08
-1 year -3 months 2020-09-01 05:54:48.123456-07
1 day 2021-12-02 05:54:48.123456-08
-1 day 2021-11-30 05:54:48.123456-08
32 days 2022-01-02 05:54:48.123456-08
-40 days 2021-10-22 05:54:48.123456-07
01:00:00 2021-12-01 06:54:48.123456-08
-01:00:00 2021-12-01 04:54:48.123456-08
11:00:00 2021-12-01 16:54:48.123456-08
-14:00:00 2021-11-30 15:54:48.123456-08
00:01:00 2021-12-01 05:55:48.123456-08
-00:01:00 2021-12-01 05:53:48.123456-08
00:06:00 2021-12-01 06:00:48.123456-08
-01:12:00 2021-12-01 04:42:48.123456-08
00:00:01 2021-12-01 05:54:49.123456-08
-00:00:01 2021-12-01 05:54:47.123456-08
00:00:23 2021-12-01 05:55:11.123456-08
-00:01:58 2021-12-01 05:52:50.123456-08
00:00:00.001 2021-12-01 05:54:48.124456-08
-00:00:00.001 2021-12-01 05:54:48.122456-08
00:00:00.91 2021-12-01 05:54:49.033456-08
-00:00:00.15 2021-12-01 05:54:47.973456-08
00:00:00.000001 2021-12-01 05:54:48.123457-08
-00:00:00.000001 2021-12-01 05:54:48.123455-08
00:00:00.000612 2021-12-01 05:54:48.124068-08
-00:00:00.000485 2021-12-01 05:54:48.122971-08
# ms overflow
query I
select interval 2400 hours + '1999-12-31 16:00:00-08'::timestamptz
----
2000-04-09 17:00:00-07
statement error
select '9223372036854775000 microseconds'::interval + 'epoch'::timestamptz
----
Conversion Error: ICU date overflows timestamp range
query I
select '9223372036854774999 microseconds'::interval + 'epoch'::timestamptz
----
294247-01-09 20:00:54.774999-08
statement error
select '-9223372022400001001 microseconds'::interval + 'epoch'::timestamptz
----
Conversion Error: ICU date overflows timestamp range
query I
select '-9223372022400001000 microseconds'::interval + 'epoch'::timestamptz
----
290309-12-21 (BC) 16:07:02-07:52
# infinity
query I
select 'infinity'::timestamptz + '1 microsecond'::interval
----
infinity
query I
select '1 microsecond'::interval + 'infinity'::timestamptz
----
infinity
query I
select '-infinity'::timestamptz + '1 microsecond'::interval
----
-infinity
query I
select '1 microsecond'::interval + '-infinity'::timestamptz
----
-infinity
# timestamp - interval
query II
SELECT iv, '2021-12-01 13:54:48.123456Z'::TIMESTAMPTZ - iv FROM intervals;
----
1 year 2020-12-01 05:54:48.123456-08
-1 year 2022-12-01 05:54:48.123456-08
1 month 2021-11-01 05:54:48.123456-07
-1 month 2022-01-01 05:54:48.123456-08
1 year 1 month 2020-11-01 05:54:48.123456-08
-1 year -3 months 2023-03-01 05:54:48.123456-08
1 day 2021-11-30 05:54:48.123456-08
-1 day 2021-12-02 05:54:48.123456-08
32 days 2021-10-30 05:54:48.123456-07
-40 days 2022-01-10 05:54:48.123456-08
01:00:00 2021-12-01 04:54:48.123456-08
-01:00:00 2021-12-01 06:54:48.123456-08
11:00:00 2021-11-30 18:54:48.123456-08
-14:00:00 2021-12-01 19:54:48.123456-08
00:01:00 2021-12-01 05:53:48.123456-08
-00:01:00 2021-12-01 05:55:48.123456-08
00:06:00 2021-12-01 05:48:48.123456-08
-01:12:00 2021-12-01 07:06:48.123456-08
00:00:01 2021-12-01 05:54:47.123456-08
-00:00:01 2021-12-01 05:54:49.123456-08
00:00:23 2021-12-01 05:54:25.123456-08
-00:01:58 2021-12-01 05:56:46.123456-08
00:00:00.001 2021-12-01 05:54:48.122456-08
-00:00:00.001 2021-12-01 05:54:48.124456-08
00:00:00.91 2021-12-01 05:54:47.213456-08
-00:00:00.15 2021-12-01 05:54:48.273456-08
00:00:00.000001 2021-12-01 05:54:48.123455-08
-00:00:00.000001 2021-12-01 05:54:48.123457-08
00:00:00.000612 2021-12-01 05:54:48.122844-08
-00:00:00.000485 2021-12-01 05:54:48.123941-08
# ms overflow
query I
select '2000-04-09 17:00:00-07'::timestamptz - interval 2400 hours
----
1999-12-31 16:00:00-08
statement error
select 'epoch'::timestamptz - '9223372022400001001 microseconds'::interval
----
Conversion Error: ICU date overflows timestamp range
query I
select 'epoch'::timestamptz - '9223372022400001000 microseconds'::interval
----
290309-12-21 (BC) 16:07:02-07:52
# infinity
query I
select 'infinity'::timestamptz - '1 day'::interval
----
infinity
query I
select '-infinity'::timestamptz - '1 day'::interval
----
-infinity
# Before the epoch
query II
SELECT iv, '1962-07-31 12:20:48.123456Z'::TIMESTAMPTZ + iv FROM intervals;
----
1 year 1963-07-31 05:20:48.123456-07
-1 year 1961-07-31 05:20:48.123456-07
1 month 1962-08-31 05:20:48.123456-07
-1 month 1962-06-30 05:20:48.123456-07
1 year 1 month 1963-08-31 05:20:48.123456-07
-1 year -3 months 1961-04-30 05:20:48.123456-07
1 day 1962-08-01 05:20:48.123456-07
-1 day 1962-07-30 05:20:48.123456-07
32 days 1962-09-01 05:20:48.123456-07
-40 days 1962-06-21 05:20:48.123456-07
01:00:00 1962-07-31 06:20:48.123456-07
-01:00:00 1962-07-31 04:20:48.123456-07
11:00:00 1962-07-31 16:20:48.123456-07
-14:00:00 1962-07-30 15:20:48.123456-07
00:01:00 1962-07-31 05:21:48.123456-07
-00:01:00 1962-07-31 05:19:48.123456-07
00:06:00 1962-07-31 05:26:48.123456-07
-01:12:00 1962-07-31 04:08:48.123456-07
00:00:01 1962-07-31 05:20:49.123456-07
-00:00:01 1962-07-31 05:20:47.123456-07
00:00:23 1962-07-31 05:21:11.123456-07
-00:01:58 1962-07-31 05:18:50.123456-07
00:00:00.001 1962-07-31 05:20:48.124456-07
-00:00:00.001 1962-07-31 05:20:48.122456-07
00:00:00.91 1962-07-31 05:20:49.033456-07
-00:00:00.15 1962-07-31 05:20:47.973456-07
00:00:00.000001 1962-07-31 05:20:48.123457-07
-00:00:00.000001 1962-07-31 05:20:48.123455-07
00:00:00.000612 1962-07-31 05:20:48.124068-07
-00:00:00.000485 1962-07-31 05:20:48.122971-07
#
# Limits testing
#
statement ok
CREATE TABLE limits AS SELECT ts, label FROM (VALUES
('290309-12-22 (BC) 00:00:00Z'::TIMESTAMPTZ, 'tsmin'),
('294247-01-10 04:00:54.775806Z'::TIMESTAMPTZ, 'tsmax')
) tbl(ts, label);
# Forward from the minimum
query II
SELECT iv, ts + iv FROM limits, intervals
WHERE label = 'tsmin'
AND iv >= INTERVAL 0 SECONDS;
----
1 year 290308-12-21 (BC) 16:07:02-07:52
1 month 290308-01-21 (BC) 16:07:02-07:52
1 year 1 month 290307-01-21 (BC) 16:07:02-07:52
1 day 290309-12-22 (BC) 16:07:02-07:52
32 days 290308-01-22 (BC) 16:07:02-07:52
01:00:00 290309-12-21 (BC) 17:07:02-07:52
11:00:00 290309-12-22 (BC) 03:07:02-07:52
00:01:00 290309-12-21 (BC) 16:08:02-07:52
00:06:00 290309-12-21 (BC) 16:13:02-07:52
00:00:01 290309-12-21 (BC) 16:07:03-07:52
00:00:23 290309-12-21 (BC) 16:07:25-07:52
00:00:00.001 290309-12-21 (BC) 16:07:02-07:52
00:00:00.91 290309-12-21 (BC) 16:07:02.91-07:52
00:00:00.000001 290309-12-21 (BC) 16:07:02.000001-07:52
00:00:00.000612 290309-12-21 (BC) 16:07:02.000612-07:52
# Backwards from the minimum
statement error
SELECT ts + (INTERVAL (-1) year) FROM limits WHERE label = 'tsmin';
----
Conversion Error: ICU date overflows timestamp range
statement error
SELECT ts + (INTERVAL (-1) month) FROM limits WHERE label = 'tsmin';
----
Conversion Error: ICU date overflows timestamp range
statement error
SELECT ts + (INTERVAL (-15) month) FROM limits WHERE label = 'tsmin';
----
Conversion Error: ICU date overflows timestamp range
statement error
SELECT ts + (INTERVAL (-1) day) FROM limits WHERE label = 'tsmin';
----
Conversion Error: ICU date overflows timestamp range
statement error
SELECT ts + (INTERVAL (-40) day) FROM limits WHERE label = 'tsmin';
----
Conversion Error: ICU date overflows timestamp range
statement error
SELECT ts + (INTERVAL (-1) hour) FROM limits WHERE label = 'tsmin';
----
Conversion Error: ICU date overflows timestamp range
statement error
SELECT ts + (INTERVAL (-14) hour) FROM limits WHERE label = 'tsmin';
----
Conversion Error: ICU date overflows timestamp range
statement error
SELECT ts + (INTERVAL (-1) minute) FROM limits WHERE label = 'tsmin';
----
Conversion Error: ICU date overflows timestamp range
statement error
SELECT ts + (INTERVAL (-72) minute) FROM limits WHERE label = 'tsmin';
----
Conversion Error: ICU date overflows timestamp range
statement error
SELECT ts + (INTERVAL (-1) second) FROM limits WHERE label = 'tsmin';
----
Conversion Error: ICU date overflows timestamp range
statement error
SELECT ts + (INTERVAL (-118) second) FROM limits WHERE label = 'tsmin';
----
Conversion Error: ICU date overflows timestamp range
# Succeeds because we are below the precision of UDate
query I
SELECT ts + (INTERVAL (-1) millisecond) FROM limits WHERE label = 'tsmin';
----
290309-12-21 (BC) 16:07:02-07:52
statement error
SELECT ts + (INTERVAL (-150) millisecond) FROM limits WHERE label = 'tsmin';
----
Conversion Error: ICU date overflows timestamp range
statement error
SELECT ts + (INTERVAL (-1) microsecond) FROM limits WHERE label = 'tsmin';
----
Conversion Error: Date out of range in timestamp conversion
statement error
SELECT ts + (INTERVAL (-485) microsecond) FROM limits WHERE label = 'tsmin';
----
Conversion Error: Date out of range in timestamp conversion
statement error
SELECT ts + INTERVAL (-150) millisecond FROM limits WHERE label = 'tsmin';
----
Conversion Error: ICU date overflows timestamp range
statement error
SELECT ts + INTERVAL (-485) microsecond FROM limits WHERE label = 'tsmin';
----
Conversion Error: Date out of range in timestamp conversion
# Backward from the maximum
# UDate loses ms accuracy when close to the upper limit,
# so these results are off by 1ms
query II
SELECT iv, ts + iv FROM limits, intervals
WHERE label = 'tsmax'
AND iv < (INTERVAL (-1) millisecond);
----
-1 year 294246-01-09 20:00:54.776806-08
-1 month 294246-12-09 20:00:54.776806-08
-1 year -3 months 294245-10-09 20:00:54.776806-07
-1 day 294247-01-08 20:00:54.776806-08
-40 days 294246-11-30 20:00:54.776806-08
-01:00:00 294247-01-09 19:00:54.776806-08
-14:00:00 294247-01-09 06:00:54.776806-08
-00:01:00 294247-01-09 19:59:54.776806-08
-01:12:00 294247-01-09 18:48:54.776806-08
-00:00:01 294247-01-09 20:00:53.776806-08
-00:01:58 294247-01-09 19:58:56.776806-08
-00:00:00.15 294247-01-09 20:00:54.626806-08
statement error
SELECT ts + (INTERVAL (-485) microsecond) FROM limits WHERE label = 'tsmax';
----
Conversion Error: ICU date overflows timestamp range
statement error
SELECT ts + (INTERVAL (-1) microsecond) FROM limits WHERE label = 'tsmax';
----
Conversion Error: ICU date overflows timestamp range
statement error
SELECT ts + (INTERVAL (-1) millisecond) FROM limits WHERE label = 'tsmax';
----
Conversion Error: ICU date overflows timestamp range
# Forward from the maximum
statement error
SELECT ts + (INTERVAL 1 year) FROM limits WHERE label = 'tsmax';
----
Conversion Error: ICU date overflows timestamp range
statement error
SELECT ts + (INTERVAL 1 month) FROM limits WHERE label = 'tsmax';
----
Conversion Error: ICU date overflows timestamp range
statement error
SELECT ts + (INTERVAL 13 month) FROM limits WHERE label = 'tsmax';
----
Conversion Error: ICU date overflows timestamp range
statement error
SELECT ts + (INTERVAL 1 day) FROM limits WHERE label = 'tsmax';
----
Conversion Error: ICU date overflows timestamp range
statement error
SELECT ts + (INTERVAL 32 day) FROM limits WHERE label = 'tsmax';
----
Conversion Error: ICU date overflows timestamp range
statement error
SELECT ts + (INTERVAL 1 hour) FROM limits WHERE label = 'tsmax';
----
Conversion Error: ICU date overflows timestamp range
statement error
SELECT ts + (INTERVAL 11 hour) FROM limits WHERE label = 'tsmax';
----
Conversion Error: ICU date overflows timestamp range
statement error
SELECT ts + (INTERVAL 1 minute) FROM limits WHERE label = 'tsmax';
----
Conversion Error: ICU date overflows timestamp range
statement error
SELECT ts + (INTERVAL 6 minute) FROM limits WHERE label = 'tsmax';
----
Conversion Error: ICU date overflows timestamp range
statement error
SELECT ts + (INTERVAL 1 second) FROM limits WHERE label = 'tsmax';
----
Conversion Error: ICU date overflows timestamp range
statement error
SELECT ts + (INTERVAL 23 second) FROM limits WHERE label = 'tsmax';
----
Conversion Error: ICU date overflows timestamp range
statement error
SELECT ts + (INTERVAL 1 millisecond) FROM limits WHERE label = 'tsmax';
----
Conversion Error: ICU date overflows timestamp range
statement error
SELECT ts + (INTERVAL 910 millisecond) FROM limits WHERE label = 'tsmax';
----
Conversion Error: ICU date overflows timestamp range
statement error
SELECT ts + (INTERVAL 1 microsecond) FROM limits WHERE label = 'tsmax';
----
Conversion Error: ICU date overflows timestamp range
statement error
SELECT ts + (INTERVAL 612 microsecond) FROM limits WHERE label = 'tsmax';
----
Out of Range Error: Overflow in multiplication
# DST arithmetic
statement ok
set timezone = 'Europe/London';
statement ok
CREATE TABLE london AS (
SELECT *
FROM (VALUES
('2000-10-29 03:00:00+00'::TIMESTAMPTZ, '2000-03-26 03:00:00+01'::TIMESTAMPTZ, '2000-01-03 00:00:00+00'::TIMESTAMPTZ)
) tbl(dst2, dst1, origin)
);
query I
SELECT origin + (dst1 - origin) FROM london;
----
2000-03-26 03:00:00+01
query I
SELECT origin + (dst2 - origin) FROM london;
----
2000-10-29 03:00:00+00
# Months before days
statement ok
set timezone = 'Asia/Kolkata';
query I
select ('1920-12-12 01:02:02+05:30'::timestamptz + interval '-1 month 400 day')::timestamptz as r;
----
1921-12-17 01:02:02+05:30
query I
select ('1920-12-12 01:02:02+05:30'::timestamptz + interval '1 month -400 day')::timestamptz as r;
----
1919-12-09 01:02:02+05:30
# Adding and subtracting infinities
statement error
SELECT TIMESTAMPTZ 'Infinity' - TIMESTAMPTZ 'Infinity';
----
Cannot subtract infinite timestamps
statement error
SELECT TIMESTAMPTZ 'Infinity' - TIMESTAMPTZ '-Infinity';
----
Cannot subtract infinite timestamps
statement error
SELECT TIMESTAMPTZ 'Infinity' - TIMESTAMPTZ '2020-01-01';
----
Cannot subtract infinite timestamps

View File

@@ -0,0 +1,145 @@
# name: test/sql/function/timestamp/test_icu_datediff.test
# description: Test ICU date difference function
# group: [timestamp]
require icu
# Normalise the testing locale
statement ok
SET Calendar = 'gregorian';
statement ok
SET TimeZone = 'America/Los_Angeles';
#
# TIMESTAMP
#
statement ok
CREATE TABLE datetime1 AS
SELECT '2005-12-31 23:59:59.9999999-08'::TIMESTAMPTZ AS startdate, '2006-01-01 00:00:00.0000000-08'::TIMESTAMPTZ AS enddate;
foreach datepart year quarter month day dayofyear hour minute second millisecond microsecond julian
query I
SELECT DATEDIFF('${datepart}', startdate, enddate) FROM datetime1
----
1
endloop
foreach datepart decade century millennium week yearweek isoyear
query I
SELECT DATEDIFF('${datepart}', startdate, enddate) FROM datetime1
----
0
endloop
# ISO Year boundary
query I
SELECT DATEDIFF('isoyear', '2022-01-01 00:00:00-08'::TIMESTAMPTZ, '2022-01-03 00:00:00-08'::TIMESTAMPTZ);
----
1
#
# Infinities
#
foreach specifier year isoyear month day decade century millennium quarter week microseconds milliseconds second minute hour julian
foreach lspecial infinity -infinity 2004-01-31T12:00:00.000050-08
foreach rspecial infinity -infinity
query I
SELECT DATEDIFF('${specifier}', '${lspecial}'::TIMESTAMPTZ, '${rspecial}'::TIMESTAMPTZ);
----
NULL
query I
SELECT DATEDIFF('${specifier}', '${rspecial}'::TIMESTAMPTZ, '${lspecial}'::TIMESTAMPTZ);
----
NULL
endloop
endloop
endloop
# Negation
foreach datepart year quarter month day dayofyear hour minute second millisecond microsecond decade century millennium week yearweek isoyear julian
query I
SELECT DATEDIFF('${datepart}', startdate, enddate) + DATEDIFF('${datepart}', enddate, startdate) FROM datetime1
----
0
endloop
# Table
foreach datepart year month day hour minute second millisecond microsecond
query I
SELECT DATEDIFF('${datepart}', startdate, startdate + INTERVAL 1 ${datepart})
FROM (SELECT '2021-07-30'::TIMESTAMP + INTERVAL (d) DAY AS startdate FROM range(0, 5) tbl(d)) days
----
1
1
1
1
1
endloop
# Week diffs are just day counts
query III
SELECT *, DATE_DIFF('week', lo, hi)
FROM (
SELECT (d - INTERVAL 9 HOUR)::TIMESTAMPTZ AS lo, (d + INTERVAL 7 HOUR)::TIMESTAMPTZ AS hi
FROM generate_series('2022-09-01'::DATE, '2022-09-12'::DATE, INTERVAL 1 DAY) tbl(d)
);
----
2022-08-31 15:00:00-07 2022-09-01 07:00:00-07 0
2022-09-01 15:00:00-07 2022-09-02 07:00:00-07 0
2022-09-02 15:00:00-07 2022-09-03 07:00:00-07 0
2022-09-03 15:00:00-07 2022-09-04 07:00:00-07 0
2022-09-04 15:00:00-07 2022-09-05 07:00:00-07 0
2022-09-05 15:00:00-07 2022-09-06 07:00:00-07 0
2022-09-06 15:00:00-07 2022-09-07 07:00:00-07 0
2022-09-07 15:00:00-07 2022-09-08 07:00:00-07 0
2022-09-08 15:00:00-07 2022-09-09 07:00:00-07 0
2022-09-09 15:00:00-07 2022-09-10 07:00:00-07 0
2022-09-10 15:00:00-07 2022-09-11 07:00:00-07 0
2022-09-11 15:00:00-07 2022-09-12 07:00:00-07 0
query I
SELECT date_diff('week', '2015-10-06 04:22:11'::timestamptz, '2016-11-25 23:19:37'::timestamptz);
----
59
# DST diffs should not be negative
statement ok
set timezone='CET';
statement ok
CREATE TABLE issue9673(starttime TIMESTAMPTZ, recordtime TIMESTAMPTZ);
statement ok
INSERT INTO issue9673 VALUES ('2022-10-30 02:17:00+02', '2022-10-30 02:00:21+01');
statement ok
INSERT INTO issue9673 VALUES ('2021-10-31 02:39:00+02', '2021-10-31 02:38:20+01');
query III
SELECT starttime, recordtime, date_diff('minute', starttime, recordtime)
FROM issue9673;
----
2022-10-30 02:17:00+02 2022-10-30 02:00:21+01 43
2021-10-31 02:39:00+02 2021-10-31 02:38:20+01 59
# Promotion cast from DATE
query I
select date_diff('day', '2022-01-04 19:00:00'::timestamptz, '2024-03-01'::date) as c1;
----
787

View File

@@ -0,0 +1,822 @@
# name: test/sql/function/timestamp/test_icu_datepart.test
# description: Test moving ICU date part functions
# group: [timestamp]
statement ok
SET default_null_order='nulls_first';
require icu
# Normalise the testing locale
statement ok
SET Calendar = 'gregorian';
statement ok
SET TimeZone = 'America/Los_Angeles';
statement ok
CREATE TABLE timestamps AS SELECT * FROM (VALUES
('0044-03-13 (BC) 10:33:41.987654+01'::TIMESTAMPTZ, 'era'),
('1962-07-31 12:20:48.123456+00'::TIMESTAMPTZ, 'epoch'),
('2021-01-01 00:00:00+00'::TIMESTAMPTZ, 'year'),
('2021-02-02 00:00:00+00'::TIMESTAMPTZ, 'month'),
('2021-11-26 10:15:13.123456+00'::TIMESTAMPTZ, 'microsecond'),
('2021-11-15 02:30:00-08'::TIMESTAMPTZ, 'hour'),
('2021-11-15 02:30:00-07'::TIMESTAMPTZ, 'minute'),
('2021-12-25 00:00:00+02'::TIMESTAMPTZ, 'day'),
('infinity'::TIMESTAMPTZ, 'second'),
('-infinity'::TIMESTAMPTZ, 'decade'),
(NULL::TIMESTAMPTZ, 'century'),
) tbl(ts, part);
query II
SELECT year(ts), year(ts::TIMESTAMP) FROM timestamps;
----
44 -43
1962 1962
2020 2020
2021 2021
2021 2021
2021 2021
2021 2021
2021 2021
NULL NULL
NULL NULL
NULL NULL
query II
SELECT month(ts), month(ts::TIMESTAMP) FROM timestamps;
----
3 3
7 7
12 12
2 2
11 11
11 11
11 11
12 12
NULL NULL
NULL NULL
NULL NULL
query II
SELECT day(ts), day(ts::TIMESTAMP) FROM timestamps;
----
13 13
31 31
31 31
1 1
26 26
15 15
15 15
24 24
NULL NULL
NULL NULL
NULL NULL
query II
SELECT decade(ts), decade(ts::TIMESTAMP) FROM timestamps;
----
4 -4
196 196
202 202
202 202
202 202
202 202
202 202
202 202
NULL NULL
NULL NULL
NULL NULL
query II
SELECT century(ts), century(ts::TIMESTAMP) FROM timestamps;
----
-1 -1
20 20
21 21
21 21
21 21
21 21
21 21
21 21
NULL NULL
NULL NULL
NULL NULL
query II
SELECT millennium(ts), millennium(ts::TIMESTAMP) FROM timestamps;
----
-1 -1
2 2
3 3
3 3
3 3
3 3
3 3
3 3
NULL NULL
NULL NULL
NULL NULL
query II
SELECT microsecond(ts), microsecond(ts::TIMESTAMP) FROM timestamps;
----
43987654 43987654
48123456 48123456
0 0
0 0
13123456 13123456
0 0
0 0
0 0
NULL NULL
NULL NULL
NULL NULL
query II
SELECT millisecond(ts), millisecond(ts::TIMESTAMP) FROM timestamps;
----
43987 43987
48123 48123
0 0
0 0
13123 13123
0 0
0 0
0 0
NULL NULL
NULL NULL
NULL NULL
query II
SELECT second(ts), second(ts::TIMESTAMP) FROM timestamps;
----
43 43
48 48
0 0
0 0
13 13
0 0
0 0
0 0
NULL NULL
NULL NULL
NULL NULL
query II
SELECT minute(ts), minute(ts::TIMESTAMP) FROM timestamps;
----
40 40
20 20
0 0
0 0
15 15
30 30
30 30
0 0
NULL NULL
NULL NULL
NULL NULL
query II
SELECT hour(ts), hour(ts::TIMESTAMP) FROM timestamps;
----
1 1
5 5
16 16
16 16
2 2
2 2
1 1
14 14
NULL NULL
NULL NULL
NULL NULL
# ICU uses the Julian calendar before the Gregorian Epoch.
query II
SELECT dayofweek(ts), dayofweek(ts::TIMESTAMP) FROM timestamps;
----
3 3
2 2
4 4
1 1
5 5
1 1
1 1
5 5
NULL NULL
NULL NULL
NULL NULL
query II
SELECT isodow(ts), isodow(ts::TIMESTAMP) FROM timestamps;
----
3 3
2 2
4 4
1 1
5 5
1 1
1 1
5 5
NULL NULL
NULL NULL
NULL NULL
query II
SELECT date_part('isodow', ts), date_part('isodow', ts::timestamp)
FROM range('1992-01-06'::timestamptz, '1992-01-13'::timestamptz, interval 1 day) as t(ts);
----
1 1
2 2
3 3
4 4
5 5
6 6
7 7
query II
SELECT date_part('dow', ts), date_part('dow', ts::timestamp)
FROM range('1992-01-05'::timestamptz, '1992-01-12'::timestamptz, interval 1 day) as t(ts);
----
0 0
1 1
2 2
3 3
4 4
5 5
6 6
query II
SELECT week(ts), week(ts::TIMESTAMP) FROM timestamps;
----
11 11
31 31
53 53
5 5
47 47
46 46
46 46
51 51
NULL NULL
NULL NULL
NULL NULL
query II
SELECT dayofyear(ts), dayofyear(ts::TIMESTAMP) FROM timestamps;
----
72 72
212 212
366 366
32 32
330 330
319 319
319 319
358 358
NULL NULL
NULL NULL
NULL NULL
query II
SELECT quarter(ts), quarter(ts::TIMESTAMP) FROM timestamps;
----
1 1
3 3
4 4
1 1
4 4
4 4
4 4
4 4
NULL NULL
NULL NULL
NULL NULL
query II
SELECT yearweek(ts), yearweek(ts::TIMESTAMP) FROM timestamps;
----
-4311 -4311
196231 196231
202053 202053
202105 202105
202147 202147
202146 202146
202146 202146
202151 202151
NULL NULL
NULL NULL
NULL NULL
query II
SELECT isoyear(ts), isoyear(ts::TIMESTAMP) FROM timestamps;
----
-43 -43
1962 1962
2020 2020
2021 2021
2021 2021
2021 2021
2021 2021
2021 2021
NULL NULL
NULL NULL
NULL NULL
query II
SELECT epoch(ts), epoch(ts::TIMESTAMP) FROM timestamps;
----
-63517962378.012344 -63517990756.012344
-234185951.876544 -234211151.876544
1609459200.0 1609430400.0
1612224000.0 1612195200.0
1637921713.123456 1637892913.123456
1636972200.0 1636943400.0
1636968600.0 1636939800.0
1640383200.0 1640354400.0
NULL NULL
NULL NULL
NULL NULL
query III
SELECT date_part(part, ts), date_part(part, ts::TIMESTAMP), part
FROM timestamps
WHERE part NOT IN ('epoch', 'julian')
----
0 0 era
2020 2020 year
2 2 month
13123456 13123456 microsecond
2 2 hour
30 30 minute
24 24 day
NULL NULL second
NULL NULL decade
NULL NULL century
query I
SELECT ERA(ts) FROM timestamps;
----
0
1
1
1
1
1
1
1
NULL
NULL
NULL
query I
SELECT DATE_PART('era', ts) FROM timestamps;
----
0
1
1
1
1
1
1
1
NULL
NULL
NULL
# Beware the ides of March
query I
SELECT DATE_PART('julian', '0044-03-15 (BC) 12:00:00'::TIMESTAMPTZ);
----
1705428.5
query I
SELECT JULIAN(ts) FROM timestamps;
----
1705426.0699535608
2437877.2227792065
2459215.6666666665
2459247.6666666665
2459545.0939018917
2459534.1041666665
2459534.0625
2459573.5833333335
NULL
NULL
NULL
query I
SELECT DATE_PART('julian', ts) FROM timestamps;
----
1705426.0699535608
2437877.2227792065
2459215.6666666665
2459247.6666666665
2459545.0939018917
2459534.1041666665
2459534.0625
2459573.5833333335
NULL
NULL
NULL
query I
SELECT DATE_PART('timezone', ts) FROM timestamps;
----
-28378
-25200
-28800
-28800
-28800
-28800
-28800
-28800
NULL
NULL
NULL
query I
SELECT DATE_PART('timezone_hour', ts) FROM timestamps;
----
-7
-7
-8
-8
-8
-8
-8
-8
NULL
NULL
NULL
query I
SELECT DATE_PART('timezone_minute', ts) FROM timestamps;
----
-52
0
0
0
0
0
0
0
NULL
NULL
NULL
query I
SELECT DATE_PART('timezone', '2021-07-31 00:00:00-07'::TIMESTAMPTZ);
----
-25200
query I
SELECT DATE_PART('timezone_hour', '2021-07-31 00:00:00-07'::TIMESTAMPTZ);
----
-7
query I
SELECT DATE_PART('timezone_minute', '2021-07-31 00:00:00-07'::TIMESTAMPTZ);
----
0
# Multiple extractions
query IIIII
SELECT MAX(EXTRACT(YEAR FROM ts))
, MAX(EXTRACT(MONTH FROM ts))
, MAX(EXTRACT(DAY FROM ts))
, MAX(EXTRACT(DECADE FROM ts))
, MAX(EXTRACT(CENTURY FROM ts))
FROM timestamps
----
2021 12 31 202 21
# Aliases
query II
SELECT dayofmonth(ts), dayofmonth(ts::TIMESTAMP) FROM timestamps;
----
13 13
31 31
31 31
1 1
26 26
15 15
15 15
24 24
NULL NULL
NULL NULL
NULL NULL
query II
SELECT weekday(ts), weekday(ts::TIMESTAMP) FROM timestamps;
----
3 3
2 2
4 4
1 1
5 5
1 1
1 1
5 5
NULL NULL
NULL NULL
NULL NULL
query II
SELECT weekofyear(ts), weekofyear(ts::TIMESTAMP) FROM timestamps;
----
11 11
31 31
53 53
5 5
47 47
46 46
46 46
51 51
NULL NULL
NULL NULL
NULL NULL
# Correctness: Compare date_part to named function
foreach partcode era millennium century decade year quarter month day hour minute second millisecond microsecond week weekday isodow dayofyear yearweek isoyear julian epoch timezone timezone_hour timezone_minute
query III
SELECT *
FROM (
SELECT ts, DATE_PART('${partcode}', ts) AS p, ${partcode}(ts) AS f
FROM timestamps
) tbl
WHERE p IS DISTINCT FROM f
----
endloop
#
# Struct parts
#
# Correctness: Compare struct values with scalar values
foreach partcode era millennium century decade year quarter month day hour minute second millisecond microsecond week weekday isodow doy yearweek isoyear julian epoch timezone timezone_hour timezone_minute
query III
SELECT ts, DATE_PART('${partcode}', ts) AS pc, DATE_PART(['${partcode}'], ts) AS st
FROM timestamps
WHERE pc IS DISTINCT FROM st['${partcode}'];
----
endloop
# Date parts
query II
SELECT DATE_PART(['era', 'year', 'month', 'day', 'julian'], ts), ts
FROM timestamps
ORDER BY 2
----
NULL NULL
{'era': NULL, 'year': NULL, 'month': NULL, 'day': NULL, 'julian': NULL} -infinity
{'era': 0, 'year': 44, 'month': 3, 'day': 13, 'julian': 1705426.0699535608} 0044-03-13 (BC) 01:40:43.987654-07:52
{'era': 1, 'year': 1962, 'month': 7, 'day': 31, 'julian': 2437877.2227792065} 1962-07-31 05:20:48.123456-07
{'era': 1, 'year': 2020, 'month': 12, 'day': 31, 'julian': 2459215.6666666665} 2020-12-31 16:00:00-08
{'era': 1, 'year': 2021, 'month': 2, 'day': 1, 'julian': 2459247.6666666665} 2021-02-01 16:00:00-08
{'era': 1, 'year': 2021, 'month': 11, 'day': 15, 'julian': 2459534.0625} 2021-11-15 01:30:00-08
{'era': 1, 'year': 2021, 'month': 11, 'day': 15, 'julian': 2459534.1041666665} 2021-11-15 02:30:00-08
{'era': 1, 'year': 2021, 'month': 11, 'day': 26, 'julian': 2459545.0939018917} 2021-11-26 02:15:13.123456-08
{'era': 1, 'year': 2021, 'month': 12, 'day': 24, 'julian': 2459573.5833333335} 2021-12-24 14:00:00-08
{'era': NULL, 'year': NULL, 'month': NULL, 'day': NULL, 'julian': NULL} infinity
# Time parts
query II
SELECT DATE_PART(['hour', 'minute', 'microsecond'], ts), ts
FROM timestamps
ORDER BY 2
----
NULL NULL
{'hour': NULL, 'minute': NULL, 'microsecond': NULL} -infinity
{'hour': 1, 'minute': 40, 'microsecond': 43987654} 0044-03-13 (BC) 01:40:43.987654-07:52
{'hour': 5, 'minute': 20, 'microsecond': 48123456} 1962-07-31 05:20:48.123456-07
{'hour': 16, 'minute': 0, 'microsecond': 0} 2020-12-31 16:00:00-08
{'hour': 16, 'minute': 0, 'microsecond': 0} 2021-02-01 16:00:00-08
{'hour': 1, 'minute': 30, 'microsecond': 0} 2021-11-15 01:30:00-08
{'hour': 2, 'minute': 30, 'microsecond': 0} 2021-11-15 02:30:00-08
{'hour': 2, 'minute': 15, 'microsecond': 13123456} 2021-11-26 02:15:13.123456-08
{'hour': 14, 'minute': 0, 'microsecond': 0} 2021-12-24 14:00:00-08
{'hour': NULL, 'minute': NULL, 'microsecond': NULL} infinity
# Year parts
query II
SELECT DATE_PART(['millennium', 'century', 'decade', 'quarter'], ts), ts
FROM timestamps
ORDER BY 2
----
NULL NULL
{'millennium': NULL, 'century': NULL, 'decade': NULL, 'quarter': NULL} -infinity
{'millennium': -1, 'century': -1, 'decade': 4, 'quarter': 1} 0044-03-13 (BC) 01:40:43.987654-07:52
{'millennium': 2, 'century': 20, 'decade': 196, 'quarter': 3} 1962-07-31 05:20:48.123456-07
{'millennium': 3, 'century': 21, 'decade': 202, 'quarter': 4} 2020-12-31 16:00:00-08
{'millennium': 3, 'century': 21, 'decade': 202, 'quarter': 1} 2021-02-01 16:00:00-08
{'millennium': 3, 'century': 21, 'decade': 202, 'quarter': 4} 2021-11-15 01:30:00-08
{'millennium': 3, 'century': 21, 'decade': 202, 'quarter': 4} 2021-11-15 02:30:00-08
{'millennium': 3, 'century': 21, 'decade': 202, 'quarter': 4} 2021-11-26 02:15:13.123456-08
{'millennium': 3, 'century': 21, 'decade': 202, 'quarter': 4} 2021-12-24 14:00:00-08
{'millennium': NULL, 'century': NULL, 'decade': NULL, 'quarter': NULL} infinity
# Day parts
query II
SELECT DATE_PART(['weekday', 'isodow', 'doy'], ts), ts
FROM timestamps
ORDER BY 2
----
NULL NULL
{'weekday': NULL, 'isodow': NULL, 'doy': NULL} -infinity
{'weekday': 3, 'isodow': 3, 'doy': 72} 0044-03-13 (BC) 01:40:43.987654-07:52
{'weekday': 2, 'isodow': 2, 'doy': 212} 1962-07-31 05:20:48.123456-07
{'weekday': 4, 'isodow': 4, 'doy': 366} 2020-12-31 16:00:00-08
{'weekday': 1, 'isodow': 1, 'doy': 32} 2021-02-01 16:00:00-08
{'weekday': 1, 'isodow': 1, 'doy': 319} 2021-11-15 01:30:00-08
{'weekday': 1, 'isodow': 1, 'doy': 319} 2021-11-15 02:30:00-08
{'weekday': 5, 'isodow': 5, 'doy': 330} 2021-11-26 02:15:13.123456-08
{'weekday': 5, 'isodow': 5, 'doy': 358} 2021-12-24 14:00:00-08
{'weekday': NULL, 'isodow': NULL, 'doy': NULL} infinity
# ISO parts
query II
SELECT DATE_PART(['isoyear', 'week', 'yearweek'], ts), ts
FROM timestamps
ORDER BY 2
----
NULL NULL
{'isoyear': NULL, 'week': NULL, 'yearweek': NULL} -infinity
{'isoyear': -43, 'week': 11, 'yearweek': -4311} 0044-03-13 (BC) 01:40:43.987654-07:52
{'isoyear': 1962, 'week': 31, 'yearweek': 196231} 1962-07-31 05:20:48.123456-07
{'isoyear': 2020, 'week': 53, 'yearweek': 202053} 2020-12-31 16:00:00-08
{'isoyear': 2021, 'week': 5, 'yearweek': 202105} 2021-02-01 16:00:00-08
{'isoyear': 2021, 'week': 46, 'yearweek': 202146} 2021-11-15 01:30:00-08
{'isoyear': 2021, 'week': 46, 'yearweek': 202146} 2021-11-15 02:30:00-08
{'isoyear': 2021, 'week': 47, 'yearweek': 202147} 2021-11-26 02:15:13.123456-08
{'isoyear': 2021, 'week': 51, 'yearweek': 202151} 2021-12-24 14:00:00-08
{'isoyear': NULL, 'week': NULL, 'yearweek': NULL} infinity
# Miscellaneous parts
query II
SELECT DATE_PART(['epoch', 'second', 'timezone', 'timezone_hour', 'timezone_minute'], ts), ts
FROM timestamps
ORDER BY 2
----
NULL NULL
{'epoch': NULL, 'second': NULL, 'timezone': NULL, 'timezone_hour': NULL, 'timezone_minute': NULL} -infinity
{'epoch': -63517962378.012344, 'second': 43, 'timezone': -28378, 'timezone_hour': -7, 'timezone_minute': -52} 0044-03-13 (BC) 01:40:43.987654-07:52
{'epoch': -234185951.876544, 'second': 48, 'timezone': -25200, 'timezone_hour': -7, 'timezone_minute': 0} 1962-07-31 05:20:48.123456-07
{'epoch': 1609459200.0, 'second': 0, 'timezone': -28800, 'timezone_hour': -8, 'timezone_minute': 0} 2020-12-31 16:00:00-08
{'epoch': 1612224000.0, 'second': 0, 'timezone': -28800, 'timezone_hour': -8, 'timezone_minute': 0} 2021-02-01 16:00:00-08
{'epoch': 1636968600.0, 'second': 0, 'timezone': -28800, 'timezone_hour': -8, 'timezone_minute': 0} 2021-11-15 01:30:00-08
{'epoch': 1636972200.0, 'second': 0, 'timezone': -28800, 'timezone_hour': -8, 'timezone_minute': 0} 2021-11-15 02:30:00-08
{'epoch': 1637921713.123456, 'second': 13, 'timezone': -28800, 'timezone_hour': -8, 'timezone_minute': 0} 2021-11-26 02:15:13.123456-08
{'epoch': 1640383200.0, 'second': 0, 'timezone': -28800, 'timezone_hour': -8, 'timezone_minute': 0} 2021-12-24 14:00:00-08
{'epoch': NULL, 'second': NULL, 'timezone': NULL, 'timezone_hour': NULL, 'timezone_minute': NULL} infinity
# Correctness: Compare struct values with scalar values
foreach partcode era millennium century decade year quarter month day hour minute second millisecond microsecond week weekday isodow doy yearweek isoyear julian epoch timezone timezone_hour timezone_minute
query III
SELECT ts, DATE_PART('${partcode}', ts) AS p, DATE_PART(['${partcode}'], ts) AS s
FROM timestamps
WHERE p IS DISTINCT FROM s['${partcode}'];
----
endloop
# Selective filtering (Issue #5342)
query II
SELECT ts, DATE_PART(['year', 'month', 'day'], ts) AS parts
FROM timestamps
WHERE part = 'day'
ORDER BY 1;
----
2021-12-24 14:00:00-08 {'year': 2021, 'month': 12, 'day': 24}
# Invalid parts
statement error
SELECT DATE_PART(['duck', 'minute', 'microsecond', 'timezone'], ts), ts
FROM timestamps
ORDER BY 2
----
# Duplicate parts
statement error
SELECT DATE_PART(['era', 'year', 'month', 'era'], ts), ts
FROM timestamps
ORDER BY 2
----
# Empty parts
statement error
SELECT DATE_PART([], ts) FROM timestamps;
----
# Null parts
statement error
SELECT DATE_PART(['year', NULL, 'month'], ts) FROM timestamps;
----
# Non-constant parts
statement error
WITH parts(p) AS (VALUES (['year', 'month', 'day']), (['hour', 'minute', 'microsecond']))
SELECT DATE_PART(p, ts) FROM parts, timestamps;
----
# last_day
statement ok
CREATE TABLE februaries AS
SELECT ts::TIMESTAMPTZ AS ts
FROM (VALUES
('1900-02-12'),
('1992-02-12'),
('2000-02-12')
) tbl(ts);
query TTT
SELECT ts, LAST_DAY(ts), LAST_DAY(ts::TIMESTAMP) FROM februaries;
----
1900-02-12 00:00:00-08 1900-02-28 1900-02-28
1992-02-12 00:00:00-08 1992-02-29 1992-02-29
2000-02-12 00:00:00-08 2000-02-29 2000-02-29
query TTT
SELECT ts, LAST_DAY(ts), LAST_DAY(ts::TIMESTAMP) FROM timestamps;
----
0044-03-13 (BC) 01:40:43.987654-07:52 0044-03-31 (BC) 0044-03-31 (BC)
1962-07-31 05:20:48.123456-07 1962-07-31 1962-07-31
2020-12-31 16:00:00-08 2020-12-31 2020-12-31
2021-02-01 16:00:00-08 2021-02-28 2021-02-28
2021-11-26 02:15:13.123456-08 2021-11-30 2021-11-30
2021-11-15 02:30:00-08 2021-11-30 2021-11-30
2021-11-15 01:30:00-08 2021-11-30 2021-11-30
2021-12-24 14:00:00-08 2021-12-31 2021-12-31
infinity NULL NULL
-infinity NULL NULL
NULL NULL NULL
# dayname/monthname
query II
SELECT dayname(ts), monthname(ts) from timestamps;
----
Wednesday March
Tuesday July
Thursday December
Monday February
Friday November
Monday November
Monday November
Friday December
NULL NULL
NULL NULL
NULL NULL
#
# Fractional Time Zones
#
statement ok
SET TimeZone='Asia/Kathmandu';
query I
SELECT DATE_PART(['timezone', 'timezone_hour', 'timezone_minute'], '2021-12-22'::TIMESTAMPTZ);
----
{'timezone': 20700, 'timezone_hour': 5, 'timezone_minute': 45}
statement ok
SET TimeZone='Canada/Newfoundland';
query I
SELECT DATE_PART(['timezone', 'timezone_hour', 'timezone_minute'], '2021-12-22'::TIMESTAMPTZ);
----
{'timezone': -12600, 'timezone_hour': -3, 'timezone_minute': -30}
#
# 13 month Calendars
#
statement ok
SET Calendar = 'hebrew';
# Year 5872 (2021-2022) was a leap year
query III
SELECT year(ts), month(ts), monthname(ts)
FROM range('5872-01-01'::TIMESTAMPTZ, '5873-01-01'::TIMESTAMPTZ, INTERVAL 1 DAY) tbl(ts)
GROUP BY ALL
ORDER BY ALL;
----
5872 1 January
5872 2 February
5872 3 March
5872 4 April
5872 5 May
5872 7 July
5872 8 August
5872 9 September
5872 10 October
5872 11 November
5872 12 December
5872 13 Undecimber

View File

@@ -0,0 +1,301 @@
# name: test/sql/function/timestamp/test_icu_datesub.test
# description: Test ICU date difference function
# group: [timestamp]
require icu
statement ok
SET Calendar = 'gregorian';
statement ok
SET TimeZone = 'America/Los_Angeles';
#
# TIMESTAMPTZ
#
# Ragged months
query I
select DATESUB('month', '2004-01-31 12:00:00-08'::TIMESTAMPTZ, '2004-02-29 13:00:00-08'::TIMESTAMPTZ);
----
1
query I
select DATESUB('month', '2004-01-29 12:00:00-08'::TIMESTAMPTZ, '2004-02-29 13:00:00-08'::TIMESTAMPTZ);
----
1
query I
select DATESUB('month', '2004-02-29 12:00:00-08'::TIMESTAMPTZ, '2004-03-31 13:00:00-08'::TIMESTAMPTZ);
----
1
query I
select DATESUB('month', '2004-02-29 13:00:00-08'::TIMESTAMPTZ, '2004-03-31 12:00:00-08'::TIMESTAMPTZ);
----
1
query I
select DATESUB('quarter', '2004-01-31 12:00:00-07'::TIMESTAMPTZ, '2004-04-30 13:00:00-07'::TIMESTAMPTZ);
----
1
query I
select DATESUB('year', '2004-02-29 12:00:00-08'::TIMESTAMPTZ, '2005-02-28 13:00:00-08'::TIMESTAMPTZ);
----
1
query I
select DATESUB('isoyear', '2004-02-29 12:00:00-08'::TIMESTAMPTZ, '2005-02-28 13:00:00-08'::TIMESTAMPTZ);
----
1
query I
select DATESUB('decade', '1994-02-28 12:00:00-08'::TIMESTAMPTZ, '2004-02-29 13:00:00-08'::TIMESTAMPTZ);
----
1
query I
select DATESUB('century', '1904-02-29 12:00:00-08'::TIMESTAMPTZ, '2005-02-28 13:00:00-08'::TIMESTAMPTZ);
----
1
# Ragged incomplete months
query I
select DATESUB('month', '2004-01-31 13:00:00-08'::TIMESTAMPTZ, '2004-02-29 12:00:00-08'::TIMESTAMPTZ);
----
0
query I
select DATESUB('month', '2004-01-29 13:00:00-08'::TIMESTAMPTZ, '2004-02-29 12:00:00-08'::TIMESTAMPTZ);
----
0
query I
select DATESUB('quarter', '2004-01-31 13:00:00-08'::TIMESTAMPTZ, '2004-04-30 12:00:00-07'::TIMESTAMPTZ);
----
0
query I
select DATESUB('year', '2004-02-29 13:00:00-08'::TIMESTAMPTZ, '2005-02-28 12:00:00-08'::TIMESTAMPTZ);
----
0
query I
select DATESUB('isoyear', '2004-02-29 13:00:00-08'::TIMESTAMPTZ, '2005-02-28 12:00:00-08'::TIMESTAMPTZ);
----
0
query I
select DATESUB('decade', '1992-02-29 13:00:00-08'::TIMESTAMPTZ, '2002-02-28 12:00:00-08'::TIMESTAMPTZ);
----
0
query I
select DATESUB('century', '1904-02-29 13:00:00-08'::TIMESTAMPTZ, '2004-02-28 12:00:00-08'::TIMESTAMPTZ);
----
0
query I
select DATESUB('millennium', '1004-02-29 11:00:00-08'::TIMESTAMPTZ, '2004-02-29 11:00:00-08'::TIMESTAMPTZ);
----
0
# Sub-month
foreach datepart day doy dow isodow julian
query I
select DATESUB('${datepart}', '2004-01-31 12:00:00-08'::TIMESTAMPTZ, '2004-02-29 13:00:00-08'::TIMESTAMPTZ);
----
29
query I
select DATESUB('${datepart}', '2004-01-31 13:00:00-08'::TIMESTAMPTZ, '2004-02-29 12:00:00-08'::TIMESTAMPTZ);
----
28
endloop
foreach datepart week yearweek
query I
select DATESUB('${datepart}', '2004-01-31 12:00:00-08'::TIMESTAMPTZ, '2004-02-28 13:00:00-08'::TIMESTAMPTZ);
----
4
query I
select DATESUB('${datepart}', '2004-01-31 13:00:00-08'::TIMESTAMPTZ, '2004-02-28 12:00:00-08'::TIMESTAMPTZ);
----
3
endloop
query I
select DATESUB('hour', '2004-01-31 12:00:00-08'::TIMESTAMPTZ, '2004-02-01 13:05:00-08'::TIMESTAMPTZ);
----
25
query I
select DATESUB('hour', '2004-01-31 12:00:00-08'::TIMESTAMPTZ, '2004-02-01 12:00:00-08'::TIMESTAMPTZ);
----
24
query I
select DATESUB('hour', '2004-01-31 13:00:00-08'::TIMESTAMPTZ, '2004-02-01 12:05:00-08'::TIMESTAMPTZ);
----
23
query I
select DATESUB('minute', '2004-01-31 12:00:00-08'::TIMESTAMPTZ, '2004-02-01 13:05:00-08'::TIMESTAMPTZ);
----
1505
query I
select DATESUB('minute', '2004-01-31 12:00:00-08'::TIMESTAMPTZ, '2004-02-01 12:00:00-08'::TIMESTAMPTZ);
----
1440
query I
select DATESUB('minute', '2004-01-31 13:00:00-08'::TIMESTAMPTZ, '2004-02-01 12:05:00-08'::TIMESTAMPTZ);
----
1385
query I
select DATESUB('second', '2004-01-31 12:00:00-08'::TIMESTAMPTZ, '2004-02-01 12:00:05-08'::TIMESTAMPTZ);
----
86405
query I
select DATESUB('second', '2004-01-31 12:00:00-08'::TIMESTAMPTZ, '2004-02-01 12:00:00-08'::TIMESTAMPTZ);
----
86400
query I
select DATESUB('second', '2004-01-31 12:00:05-08'::TIMESTAMPTZ, '2004-02-01 12:00:00-08'::TIMESTAMPTZ);
----
86395
query I
select DATESUB('millisecond', '2004-01-31 12:00:00-08'::TIMESTAMPTZ, '2004-02-01 12:00:00.050-08'::TIMESTAMPTZ);
----
86400050
query I
select DATESUB('millisecond', '2004-01-31 12:00:00-08'::TIMESTAMPTZ, '2004-02-01 12:00:00-08'::TIMESTAMPTZ);
----
86400000
query I
select DATESUB('millisecond', '2004-01-31 12:00:00.050-08'::TIMESTAMPTZ, '2004-02-01 12:00:00-08'::TIMESTAMPTZ);
----
86399950
query I
select DATESUB('microsecond', '2004-01-31 12:00:00-08'::TIMESTAMPTZ, '2004-02-01 12:00:00.000050-08'::TIMESTAMPTZ);
----
86400000050
query I
select DATESUB('microsecond', '2004-01-31 12:00:00-08'::TIMESTAMPTZ, '2004-02-01 12:00:00-08'::TIMESTAMPTZ);
----
86400000000
query I
select DATESUB('microsecond', '2004-01-31 12:00:00.000050-08'::TIMESTAMPTZ, '2004-02-01 12:00:00-08'::TIMESTAMPTZ);
----
86399999950
#
# Infinities
#
foreach specifier year isoyear month day decade century millennium quarter week microseconds milliseconds second minute hour julian
foreach lspecial infinity -infinity 2004-01-31T12:00:00.000050-08
foreach rspecial infinity -infinity
query I
SELECT DATESUB('${specifier}', '${lspecial}'::TIMESTAMPTZ, '${rspecial}'::TIMESTAMPTZ);
----
NULL
query I
SELECT DATESUB('${specifier}', '${rspecial}'::TIMESTAMPTZ, '${lspecial}'::TIMESTAMPTZ);
----
NULL
endloop
endloop
endloop
# Negation
statement ok
CREATE TABLE datetime1 AS
SELECT '2004-01-31 12:00:00-08'::TIMESTAMPTZ AS startdate, '2004-02-29 13:05:00-08'::TIMESTAMPTZ AS enddate;
statement ok
CREATE TABLE dateparts AS SELECT datepart FROM (VALUES
('year'),
('quarter'),
('month'),
('day'),
('dayofyear'),
('hour'),
('minute'),
('second'),
('millisecond'),
('microsecond'),
('decade'),
('century'),
('millennium'),
('week'),
('yearweek'),
('isoyear')
) tbl(datepart)
# ICU field difference is almost symmetric,
# but the clamping to the end of a month only works forward.
query II
SELECT DATESUB(datepart, startdate, enddate) + DATESUB(datepart, enddate, startdate), datepart
FROM datetime1, dateparts
----
0 year
0 quarter
1 month
0 day
0 dayofyear
0 hour
0 minute
0 second
0 millisecond
0 microsecond
0 decade
0 century
0 millennium
0 week
0 yearweek
0 isoyear
# Table
foreach datepart year month day hour minute second millisecond microsecond
query I
SELECT DATESUB('${datepart}', startdate, startdate + INTERVAL 1 ${datepart})
FROM (
SELECT '2021-07-30 00:00:00-07'::TIMESTAMPTZ + INTERVAL (d) DAY AS startdate
FROM range(0, 5) tbl(d)
) days
----
1
1
1
1
1
endloop

View File

@@ -0,0 +1,248 @@
# name: test/sql/function/timestamp/test_icu_datetrunc.test
# description: Test the ICU DATETRUNC functions
# group: [timestamp]
require icu
# Normalise the testing locale
statement ok
SET Calendar = 'gregorian';
statement ok
SET TimeZone = 'America/Los_Angeles';
statement ok
CREATE TABLE timestamps(d TIMESTAMPTZ, s VARCHAR);
statement ok
INSERT INTO timestamps VALUES
('-infinity', 'year'),
('1992-02-02 02:02:03.123456-08', 'millennium'),
('1992-02-02 02:02:03.123456-08', 'century'),
('1992-02-02 02:02:03.123456-08', 'decade'),
('1992-02-02 02:02:03.123456-08', 'year'),
('1992-02-02 02:02:03.123456-08', 'quarter'),
('1992-02-02 02:02:03.123456-08', 'month'),
('1992-02-02 02:02:03.123456-08', 'week'),
('1992-02-02 02:02:03.123456-08', 'day'),
('1992-02-02 02:02:03.123456-08', 'hour'),
('1992-02-02 02:02:03.123456-08', 'minute'),
('1992-02-02 02:02:03.123456-08', 'second'),
('1992-02-02 02:02:03.123456-08', 'milliseconds'),
('1992-02-02 02:02:03.123456-08', 'microseconds'),
('infinity', 'month'),
;
# test date_trunc with different combinations of constant/non-constant columns on timestamps
query T
SELECT date_trunc(NULL::VARCHAR, NULL::TIMESTAMPTZ) FROM timestamps LIMIT 3;
----
NULL
NULL
NULL
query T
SELECT date_trunc(s, NULL::TIMESTAMPTZ) FROM timestamps LIMIT 3;
----
NULL
NULL
NULL
query T
SELECT date_trunc(NULL, d) FROM timestamps LIMIT 3;
----
NULL
NULL
NULL
# Timestamps should return timestamp type
query T
SELECT date_trunc('minute', TIMESTAMPTZ '1992-02-02 04:03:02Z') FROM timestamps LIMIT 1;
----
1992-02-01 20:03:00-08
# Test all truncate operators on timestamps
# The use of double for UDate by ICU reduces the representation accuracy far from the epoch.
query II
SELECT date_trunc(s, d), s FROM timestamps;
----
-infinity year
1000-01-01 00:00:00-07:52 millennium
1900-01-01 00:00:00-08 century
1990-01-01 00:00:00-08 decade
1992-01-01 00:00:00-08 year
1992-01-01 00:00:00-08 quarter
1992-02-01 00:00:00-08 month
1992-01-27 00:00:00-08 week
1992-02-02 00:00:00-08 day
1992-02-02 02:00:00-08 hour
1992-02-02 02:02:00-08 minute
1992-02-02 02:02:03-08 second
1992-02-02 02:02:03.123-08 milliseconds
1992-02-02 02:02:03.123456-08 microseconds
infinity month
# Test alias
query II
SELECT datetrunc(s, d), s FROM timestamps;
----
-infinity year
1000-01-01 00:00:00-07:52 millennium
1900-01-01 00:00:00-08 century
1990-01-01 00:00:00-08 decade
1992-01-01 00:00:00-08 year
1992-01-01 00:00:00-08 quarter
1992-02-01 00:00:00-08 month
1992-01-27 00:00:00-08 week
1992-02-02 00:00:00-08 day
1992-02-02 02:00:00-08 hour
1992-02-02 02:02:00-08 minute
1992-02-02 02:02:03-08 second
1992-02-02 02:02:03.123-08 milliseconds
1992-02-02 02:02:03.123456-08 microseconds
infinity month
# Test week operator special cases
query T
SELECT date_trunc('week', TIMESTAMPTZ '2019-01-06 04:03:02-08') FROM timestamps LIMIT 1;
----
2018-12-31 00:00:00-08
query T
SELECT date_trunc('yearweek', TIMESTAMPTZ '2019-01-06 04:03:02-08') FROM timestamps LIMIT 1;
----
2018-12-31 00:00:00-08
query T
SELECT date_trunc('week', TIMESTAMPTZ '2020-01-01 04:03:02-08') FROM timestamps LIMIT 1;
----
2019-12-30 00:00:00-08
query T
SELECT date_trunc('yearweek', TIMESTAMPTZ '2020-01-01 04:03:02-08') FROM timestamps LIMIT 1;
----
2019-12-30 00:00:00-08
# Test quarter operator more thoroughly
query T
SELECT date_trunc('quarter', TIMESTAMPTZ '2020-12-02 04:03:02-08') FROM timestamps LIMIT 1;
----
2020-10-01 00:00:00-07
query T
SELECT date_trunc('quarter', TIMESTAMPTZ '2019-01-06 04:03:02-08') FROM timestamps LIMIT 1;
----
2019-01-01 00:00:00-08
query T
SELECT date_trunc('millennium', TIMESTAMPTZ '1996-01-06 04:03:02-08') FROM timestamps LIMIT 1;
----
1000-01-01 00:00:00-07:52
query T
SELECT date_trunc('century', TIMESTAMPTZ '2019-01-06 04:03:02-08') FROM timestamps LIMIT 1;
----
2000-01-01 00:00:00-08
query T
SELECT date_trunc('decade', TIMESTAMPTZ '2019-01-06 04:03:02-08') FROM timestamps LIMIT 1;
----
2010-01-01 00:00:00-08
query T
SELECT date_trunc('year', TIMESTAMPTZ '2019-01-06 04:03:02-08') FROM timestamps LIMIT 1;
----
2019-01-01 00:00:00-08
query T
SELECT date_trunc('day', TIMESTAMPTZ '2019-01-06 04:03:02-08') FROM timestamps LIMIT 1;
----
2019-01-06 00:00:00-08
query T
SELECT date_trunc('hour', TIMESTAMPTZ '2019-01-06 04:03:02-08') FROM timestamps LIMIT 1;
----
2019-01-06 04:00:00-08
query T
SELECT date_trunc('milliseconds', TIMESTAMPTZ '2019-01-06 04:03:02.123456-08') FROM timestamps LIMIT 1;
----
2019-01-06 04:03:02.123-08
query T
SELECT date_trunc('microseconds', TIMESTAMPTZ '2019-01-06 04:03:02.123456-08');
----
2019-01-06 04:03:02.123456-08
# Synonym for second
query T
SELECT date_trunc('epoch', TIMESTAMPTZ '2019-01-06 04:03:02.5-08') FROM timestamps LIMIT 1;
----
2019-01-06 04:03:02-08
# Synonyms for day
foreach daypart day dow isodow doy julian
query II rowsort
SELECT d, date_trunc('${daypart}', d)
FROM (SELECT DISTINCT d FROM timestamps) tbl(d);
----
-infinity -infinity
1992-02-02 02:02:03.123456-08 1992-02-02 00:00:00-08
infinity infinity
endloop
# ISO Years
query II
SELECT ts, DATE_TRUNC('isoyear', ts::TIMESTAMPTZ)
FROM generate_series('2000-01-01 08:00:00'::TIMESTAMP, '2023-01-01 08:00:00'::TIMESTAMP, INTERVAL 1 YEAR) tbl(ts);
----
2000-01-01 08:00:00 1999-01-04 00:00:00-08
2001-01-01 08:00:00 2001-01-01 00:00:00-08
2002-01-01 08:00:00 2001-12-31 00:00:00-08
2003-01-01 08:00:00 2002-12-30 00:00:00-08
2004-01-01 08:00:00 2003-12-29 00:00:00-08
2005-01-01 08:00:00 2003-12-29 00:00:00-08
2006-01-01 08:00:00 2005-01-03 00:00:00-08
2007-01-01 08:00:00 2007-01-01 00:00:00-08
2008-01-01 08:00:00 2007-12-31 00:00:00-08
2009-01-01 08:00:00 2008-12-29 00:00:00-08
2010-01-01 08:00:00 2008-12-29 00:00:00-08
2011-01-01 08:00:00 2010-01-04 00:00:00-08
2012-01-01 08:00:00 2011-01-03 00:00:00-08
2013-01-01 08:00:00 2012-12-31 00:00:00-08
2014-01-01 08:00:00 2013-12-30 00:00:00-08
2015-01-01 08:00:00 2014-12-29 00:00:00-08
2016-01-01 08:00:00 2014-12-29 00:00:00-08
2017-01-01 08:00:00 2016-01-04 00:00:00-08
2018-01-01 08:00:00 2018-01-01 00:00:00-08
2019-01-01 08:00:00 2018-12-31 00:00:00-08
2020-01-01 08:00:00 2019-12-30 00:00:00-08
2021-01-01 08:00:00 2019-12-30 00:00:00-08
2022-01-01 08:00:00 2021-01-04 00:00:00-08
2023-01-01 08:00:00 2022-01-03 00:00:00-08
# Unknown specifier should fail
statement error
SELECT date_trunc('duck', TIMESTAMPTZ '2019-01-06 04:03:02-08') FROM timestamps LIMIT 1;
----
# Minute truncation within a DST fall back ambiguity
statement ok
set timezone='CET';
query I
select date_trunc('minute', '2022-10-30 02:17:00+02'::TIMESTAMPTZ);
----
2022-10-30 02:17:00+02
# Comparisons to DATE
statement ok
set time zone 'UTC';
query I
select date_trunc('day', '2024-05-06 16:09:28+05:00'::timestamptz) >= '2024-05-06 17:19:18+05:20'::date as r
----
True

View File

@@ -0,0 +1,407 @@
# name: test/sql/function/timestamp/test_icu_makedate.test
# description: Test ICU make_timestamptz and cast to DATE
# group: [timestamp]
require icu
statement ok
PRAGMA enable_verification
# Normalise the testing locale
statement ok
SET Calendar = 'gregorian';
statement ok
SET TimeZone = 'America/Los_Angeles';
statement ok
CREATE TABLE timestamps(ts TIMESTAMPTZ)
statement ok
INSERT INTO timestamps VALUES
('1001-03-15 (BC) 20:38:40+00'),
('0044-03-15 (BC) 20:38:40+00'),
('1962-07-31 12:20:48.123456+00'),
('1969-01-01 01:03:20.45432+00'),
('1992-01-01 01:01:01.400+00'),
('1992-01-01 01:01:02.200+00'),
('1992-01-01 01:01:02.400+00'),
('1993-08-14 08:22:33+00'),
('1993-08-14 08:22:33.42+00'),
('2001-04-20 14:42:11.0+00'),
('2001-04-20 14:42:11.123+00'),
('2004-01-31 12:00:00.000050+00'),
('2004-01-31 12:00:00.050+00'),
('2004-02-01 12:00:00.000050+00'),
('2004-02-01 12:00:00.050+00'),
('2004-02-29 13:05:47.123456+00'),
('2008-01-01 00:00:01.5+00'),
('2008-01-01 00:00:01.594+00'),
('2008-01-01 00:00:01.794+00'),
('2008-01-01 00:00:01.88926+00'),
('2008-01-01 00:00:01.894+00'),
('2008-01-01 00:00:01.98926+00'),
('2008-01-01 00:00:01.99926+00'),
('2008-01-01 00:00:11.1+00'),
('2019-01-06 04:03:02.123456+00'),
('2019-01-06 04:03:02.5+00'),
('2020-01-01 00:00:01.88926+00'),
('2020-12-31 21:25:58.745232+00'),
('2021-04-15 14:55:17.915+00'),
('2021-04-15 14:55:17.915000+00'),
('2021-05-02 12:11:49.5+00'),
('2021-12-01 13:54:48.123456+00'),
(NULL)
;
#
# Default time zone
#
query III
SELECT era(ts), year(ts), ts FROM timestamps;
----
0 1001 1001-03-15 (BC) 12:45:42-07:52
0 44 0044-03-15 (BC) 12:45:42-07:52
1 1962 1962-07-31 05:20:48.123456-07
1 1968 1968-12-31 17:03:20.45432-08
1 1991 1991-12-31 17:01:01.4-08
1 1991 1991-12-31 17:01:02.2-08
1 1991 1991-12-31 17:01:02.4-08
1 1993 1993-08-14 01:22:33-07
1 1993 1993-08-14 01:22:33.42-07
1 2001 2001-04-20 07:42:11-07
1 2001 2001-04-20 07:42:11.123-07
1 2004 2004-01-31 04:00:00.00005-08
1 2004 2004-01-31 04:00:00.05-08
1 2004 2004-02-01 04:00:00.00005-08
1 2004 2004-02-01 04:00:00.05-08
1 2004 2004-02-29 05:05:47.123456-08
1 2007 2007-12-31 16:00:01.5-08
1 2007 2007-12-31 16:00:01.594-08
1 2007 2007-12-31 16:00:01.794-08
1 2007 2007-12-31 16:00:01.88926-08
1 2007 2007-12-31 16:00:01.894-08
1 2007 2007-12-31 16:00:01.98926-08
1 2007 2007-12-31 16:00:01.99926-08
1 2007 2007-12-31 16:00:11.1-08
1 2019 2019-01-05 20:03:02.123456-08
1 2019 2019-01-05 20:03:02.5-08
1 2019 2019-12-31 16:00:01.88926-08
1 2020 2020-12-31 13:25:58.745232-08
1 2021 2021-04-15 07:55:17.915-07
1 2021 2021-04-15 07:55:17.915-07
1 2021 2021-05-02 05:11:49.5-07
1 2021 2021-12-01 05:54:48.123456-08
NULL NULL NULL
statement ok
CREATE MACRO yeartz(ts) AS year(ts::TIMESTAMPTZ) * (CASE WHEN ERA(ts::TIMESTAMPTZ) > 0 THEN 1 ELSE -1 END);
query II
SELECT ts, mts
FROM (SELECT ts, make_timestamptz(yeartz(ts), month(ts), day(ts), hour(ts), minute(ts), microsecond(ts) / 1000000.0) mts
FROM timestamps) t
WHERE mts IS DISTINCT FROM ts
ORDER BY 1;
----
# Null part
query II
SELECT ts, mts
FROM (SELECT ts, make_timestamptz(yeartz(ts), NULL, day(ts), hour(ts), minute(ts), microsecond(ts) / 1000000.0) mts
FROM timestamps) t
WHERE mts IS NOT NULL;
----
# ICU wraps out of range
query I
SELECT make_timestamptz(2021, 13, 1, 0, 0, 0) mts
----
2022-01-01 00:00:00-08
query I
SELECT make_timestamptz(2021, -1, 1, 0, 0, 0) mts
----
2020-11-01 00:00:00-07
# From microseconds
query II
SELECT make_timestamptz(0), make_timestamptz(1684509234845000);
----
1969-12-31 16:00:00-08 2023-05-19 08:13:54.845-07
#
# Argument time zones
#
# Constant values
query I
SELECT make_timestamptz(2021, 12, 30, 10, 12, 4.123, 'America/New_York');
----
2021-12-30 07:12:04.123-08
query I
SELECT make_timestamptz(NULL, 12, 30, 10, 12, 4.123, 'America/New_York');
----
NULL
query I
SELECT make_timestamptz(2021, NULL, 30, 10, 12, 4.123, 'America/New_York');
----
NULL
query I
SELECT make_timestamptz(2021, 12, NULL, 10, 12, 4.123, 'America/New_York');
----
NULL
query I
SELECT make_timestamptz(2021, 12, 30, NULL, 12, 4.123, 'America/New_York');
----
NULL
query I
SELECT make_timestamptz(2021, 12, 30, 10, NULL, 4.123, 'America/New_York');
----
NULL
query I
SELECT make_timestamptz(2021, 12, 30, 10, 12, NULL, 'America/New_York');
----
NULL
query I
SELECT make_timestamptz(2021, 12, 30, 10, 12, 4.123, NULL);
----
NULL
# TZ lookup table
statement ok
CREATE TABLE timezones AS (SELECT mm, tz FROM (VALUES
(1, 'America/New_York'),
(2, 'America/Los_Angeles'),
(3, 'Europe/Rome'),
(4, 'Asia/Kathmandu'),
(5, 'Canada/Newfoundland'),
(7, 'Pacific/Auckland'),
(8, 'Asia/Hong_Kong'),
(12, 'US/Hawaii')
) tbl(mm, tz)
);
statement ok
CREATE TABLE timeparts AS (
SELECT ts,
yeartz(ts) yyyy,
month(ts) mm,
day(ts) dd,
hour(ts) hr,
minute(ts) mn,
microsecond(ts) / 1000000.0 as ss,
tz
FROM timestamps t
LEFT JOIN timezones z ON (month(t.ts) = z.mm)
ORDER BY ts
);
query IIIIIIII
SELECT * FROM timeparts;
----
1001-03-15 (BC) 12:45:42-07:52 -1001 3 15 12 45 42.0 Europe/Rome
0044-03-15 (BC) 12:45:42-07:52 -44 3 15 12 45 42.0 Europe/Rome
1962-07-31 05:20:48.123456-07 1962 7 31 5 20 48.123456 Pacific/Auckland
1968-12-31 17:03:20.45432-08 1968 12 31 17 3 20.45432 US/Hawaii
1991-12-31 17:01:01.4-08 1991 12 31 17 1 1.4 US/Hawaii
1991-12-31 17:01:02.2-08 1991 12 31 17 1 2.2 US/Hawaii
1991-12-31 17:01:02.4-08 1991 12 31 17 1 2.4 US/Hawaii
1993-08-14 01:22:33-07 1993 8 14 1 22 33.0 Asia/Hong_Kong
1993-08-14 01:22:33.42-07 1993 8 14 1 22 33.42 Asia/Hong_Kong
2001-04-20 07:42:11-07 2001 4 20 7 42 11.0 Asia/Kathmandu
2001-04-20 07:42:11.123-07 2001 4 20 7 42 11.123 Asia/Kathmandu
2004-01-31 04:00:00.00005-08 2004 1 31 4 0 5e-05 America/New_York
2004-01-31 04:00:00.05-08 2004 1 31 4 0 0.05 America/New_York
2004-02-01 04:00:00.00005-08 2004 2 1 4 0 5e-05 America/Los_Angeles
2004-02-01 04:00:00.05-08 2004 2 1 4 0 0.05 America/Los_Angeles
2004-02-29 05:05:47.123456-08 2004 2 29 5 5 47.123456 America/Los_Angeles
2007-12-31 16:00:01.5-08 2007 12 31 16 0 1.5 US/Hawaii
2007-12-31 16:00:01.594-08 2007 12 31 16 0 1.594 US/Hawaii
2007-12-31 16:00:01.794-08 2007 12 31 16 0 1.794 US/Hawaii
2007-12-31 16:00:01.88926-08 2007 12 31 16 0 1.88926 US/Hawaii
2007-12-31 16:00:01.894-08 2007 12 31 16 0 1.894 US/Hawaii
2007-12-31 16:00:01.98926-08 2007 12 31 16 0 1.98926 US/Hawaii
2007-12-31 16:00:01.99926-08 2007 12 31 16 0 1.99926 US/Hawaii
2007-12-31 16:00:11.1-08 2007 12 31 16 0 11.1 US/Hawaii
2019-01-05 20:03:02.123456-08 2019 1 5 20 3 2.123456 America/New_York
2019-01-05 20:03:02.5-08 2019 1 5 20 3 2.5 America/New_York
2019-12-31 16:00:01.88926-08 2019 12 31 16 0 1.88926 US/Hawaii
2020-12-31 13:25:58.745232-08 2020 12 31 13 25 58.745232 US/Hawaii
2021-04-15 07:55:17.915-07 2021 4 15 7 55 17.915 Asia/Kathmandu
2021-04-15 07:55:17.915-07 2021 4 15 7 55 17.915 Asia/Kathmandu
2021-05-02 05:11:49.5-07 2021 5 2 5 11 49.5 Canada/Newfoundland
2021-12-01 05:54:48.123456-08 2021 12 1 5 54 48.123456 US/Hawaii
NULL NULL NULL NULL NULL NULL NULL NULL
# Constant time zone
query III
SELECT ts, make_timestamptz(yyyy, mm, dd, hr, mn, ss, 'America/New_York'), make_timestamptz(yyyy, mm, dd, hr, mn, ss)
FROM timeparts;
----
1001-03-15 (BC) 12:45:42-07:52 1001-03-15 (BC) 09:48:46-07:52 1001-03-15 (BC) 12:45:42-07:52
0044-03-15 (BC) 12:45:42-07:52 0044-03-15 (BC) 09:48:46-07:52 0044-03-15 (BC) 12:45:42-07:52
1962-07-31 05:20:48.123456-07 1962-07-31 02:20:48.123456-07 1962-07-31 05:20:48.123456-07
1968-12-31 17:03:20.45432-08 1968-12-31 14:03:20.45432-08 1968-12-31 17:03:20.45432-08
1991-12-31 17:01:01.4-08 1991-12-31 14:01:01.4-08 1991-12-31 17:01:01.4-08
1991-12-31 17:01:02.2-08 1991-12-31 14:01:02.2-08 1991-12-31 17:01:02.2-08
1991-12-31 17:01:02.4-08 1991-12-31 14:01:02.4-08 1991-12-31 17:01:02.4-08
1993-08-14 01:22:33-07 1993-08-13 22:22:33-07 1993-08-14 01:22:33-07
1993-08-14 01:22:33.42-07 1993-08-13 22:22:33.42-07 1993-08-14 01:22:33.42-07
2001-04-20 07:42:11-07 2001-04-20 04:42:11-07 2001-04-20 07:42:11-07
2001-04-20 07:42:11.123-07 2001-04-20 04:42:11.123-07 2001-04-20 07:42:11.123-07
2004-01-31 04:00:00.00005-08 2004-01-31 01:00:00.00005-08 2004-01-31 04:00:00.00005-08
2004-01-31 04:00:00.05-08 2004-01-31 01:00:00.05-08 2004-01-31 04:00:00.05-08
2004-02-01 04:00:00.00005-08 2004-02-01 01:00:00.00005-08 2004-02-01 04:00:00.00005-08
2004-02-01 04:00:00.05-08 2004-02-01 01:00:00.05-08 2004-02-01 04:00:00.05-08
2004-02-29 05:05:47.123456-08 2004-02-29 02:05:47.123456-08 2004-02-29 05:05:47.123456-08
2007-12-31 16:00:01.5-08 2007-12-31 13:00:01.5-08 2007-12-31 16:00:01.5-08
2007-12-31 16:00:01.594-08 2007-12-31 13:00:01.594-08 2007-12-31 16:00:01.594-08
2007-12-31 16:00:01.794-08 2007-12-31 13:00:01.794-08 2007-12-31 16:00:01.794-08
2007-12-31 16:00:01.88926-08 2007-12-31 13:00:01.88926-08 2007-12-31 16:00:01.88926-08
2007-12-31 16:00:01.894-08 2007-12-31 13:00:01.894-08 2007-12-31 16:00:01.894-08
2007-12-31 16:00:01.98926-08 2007-12-31 13:00:01.98926-08 2007-12-31 16:00:01.98926-08
2007-12-31 16:00:01.99926-08 2007-12-31 13:00:01.99926-08 2007-12-31 16:00:01.99926-08
2007-12-31 16:00:11.1-08 2007-12-31 13:00:11.1-08 2007-12-31 16:00:11.1-08
2019-01-05 20:03:02.123456-08 2019-01-05 17:03:02.123456-08 2019-01-05 20:03:02.123456-08
2019-01-05 20:03:02.5-08 2019-01-05 17:03:02.5-08 2019-01-05 20:03:02.5-08
2019-12-31 16:00:01.88926-08 2019-12-31 13:00:01.88926-08 2019-12-31 16:00:01.88926-08
2020-12-31 13:25:58.745232-08 2020-12-31 10:25:58.745232-08 2020-12-31 13:25:58.745232-08
2021-04-15 07:55:17.915-07 2021-04-15 04:55:17.915-07 2021-04-15 07:55:17.915-07
2021-04-15 07:55:17.915-07 2021-04-15 04:55:17.915-07 2021-04-15 07:55:17.915-07
2021-05-02 05:11:49.5-07 2021-05-02 02:11:49.5-07 2021-05-02 05:11:49.5-07
2021-12-01 05:54:48.123456-08 2021-12-01 02:54:48.123456-08 2021-12-01 05:54:48.123456-08
NULL NULL NULL
# Null part
query II
SELECT ts, make_timestamptz(yyyy, NULL, dd, hr, mn, ss, tz) mts
FROM timeparts
WHERE mts IS NOT NULL;
----
# Null time zone
query II
SELECT ts, make_timestamptz(yyyy, mm, dd, hr, mn, ss, NULL) mts
FROM timeparts
WHERE mts IS NOT NULL;
----
# Variable time zone
query III
SELECT tz, ts, make_timestamptz(yyyy, mm, dd, hr, mn, ss, tz)
FROM timeparts;
----
Europe/Rome 1001-03-15 (BC) 12:45:42-07:52 1001-03-15 (BC) 04:02:48-07:52
Europe/Rome 0044-03-15 (BC) 12:45:42-07:52 0044-03-15 (BC) 04:02:48-07:52
Pacific/Auckland 1962-07-31 05:20:48.123456-07 1962-07-30 10:20:48.123456-07
US/Hawaii 1968-12-31 17:03:20.45432-08 1968-12-31 19:03:20.45432-08
US/Hawaii 1991-12-31 17:01:01.4-08 1991-12-31 19:01:01.4-08
US/Hawaii 1991-12-31 17:01:02.2-08 1991-12-31 19:01:02.2-08
US/Hawaii 1991-12-31 17:01:02.4-08 1991-12-31 19:01:02.4-08
Asia/Hong_Kong 1993-08-14 01:22:33-07 1993-08-13 10:22:33-07
Asia/Hong_Kong 1993-08-14 01:22:33.42-07 1993-08-13 10:22:33.42-07
Asia/Kathmandu 2001-04-20 07:42:11-07 2001-04-19 18:57:11-07
Asia/Kathmandu 2001-04-20 07:42:11.123-07 2001-04-19 18:57:11.123-07
America/New_York 2004-01-31 04:00:00.00005-08 2004-01-31 01:00:00.00005-08
America/New_York 2004-01-31 04:00:00.05-08 2004-01-31 01:00:00.05-08
America/Los_Angeles 2004-02-01 04:00:00.00005-08 2004-02-01 04:00:00.00005-08
America/Los_Angeles 2004-02-01 04:00:00.05-08 2004-02-01 04:00:00.05-08
America/Los_Angeles 2004-02-29 05:05:47.123456-08 2004-02-29 05:05:47.123456-08
US/Hawaii 2007-12-31 16:00:01.5-08 2007-12-31 18:00:01.5-08
US/Hawaii 2007-12-31 16:00:01.594-08 2007-12-31 18:00:01.594-08
US/Hawaii 2007-12-31 16:00:01.794-08 2007-12-31 18:00:01.794-08
US/Hawaii 2007-12-31 16:00:01.88926-08 2007-12-31 18:00:01.88926-08
US/Hawaii 2007-12-31 16:00:01.894-08 2007-12-31 18:00:01.894-08
US/Hawaii 2007-12-31 16:00:01.98926-08 2007-12-31 18:00:01.98926-08
US/Hawaii 2007-12-31 16:00:01.99926-08 2007-12-31 18:00:01.99926-08
US/Hawaii 2007-12-31 16:00:11.1-08 2007-12-31 18:00:11.1-08
America/New_York 2019-01-05 20:03:02.123456-08 2019-01-05 17:03:02.123456-08
America/New_York 2019-01-05 20:03:02.5-08 2019-01-05 17:03:02.5-08
US/Hawaii 2019-12-31 16:00:01.88926-08 2019-12-31 18:00:01.88926-08
US/Hawaii 2020-12-31 13:25:58.745232-08 2020-12-31 15:25:58.745232-08
Asia/Kathmandu 2021-04-15 07:55:17.915-07 2021-04-14 19:10:17.915-07
Asia/Kathmandu 2021-04-15 07:55:17.915-07 2021-04-14 19:10:17.915-07
Canada/Newfoundland 2021-05-02 05:11:49.5-07 2021-05-02 00:41:49.5-07
US/Hawaii 2021-12-01 05:54:48.123456-08 2021-12-01 07:54:48.123456-08
NULL NULL NULL
# Invalid zone -
statement error
SELECT ts, make_timestamptz(yyyy, mm, dd, hr, mn, ss, 'Europe/Duck') mts
FROM timeparts;
----
Unknown TimeZone 'Europe/Duck'
# Cast to DATE
query II
SELECT ts, ts::DATE FROM timeparts
----
1001-03-15 (BC) 12:45:42-07:52 1001-03-15 (BC)
0044-03-15 (BC) 12:45:42-07:52 0044-03-15 (BC)
1962-07-31 05:20:48.123456-07 1962-07-31
1968-12-31 17:03:20.45432-08 1968-12-31
1991-12-31 17:01:01.4-08 1991-12-31
1991-12-31 17:01:02.2-08 1991-12-31
1991-12-31 17:01:02.4-08 1991-12-31
1993-08-14 01:22:33-07 1993-08-14
1993-08-14 01:22:33.42-07 1993-08-14
2001-04-20 07:42:11-07 2001-04-20
2001-04-20 07:42:11.123-07 2001-04-20
2004-01-31 04:00:00.00005-08 2004-01-31
2004-01-31 04:00:00.05-08 2004-01-31
2004-02-01 04:00:00.00005-08 2004-02-01
2004-02-01 04:00:00.05-08 2004-02-01
2004-02-29 05:05:47.123456-08 2004-02-29
2007-12-31 16:00:01.5-08 2007-12-31
2007-12-31 16:00:01.594-08 2007-12-31
2007-12-31 16:00:01.794-08 2007-12-31
2007-12-31 16:00:01.88926-08 2007-12-31
2007-12-31 16:00:01.894-08 2007-12-31
2007-12-31 16:00:01.98926-08 2007-12-31
2007-12-31 16:00:01.99926-08 2007-12-31
2007-12-31 16:00:11.1-08 2007-12-31
2019-01-05 20:03:02.123456-08 2019-01-05
2019-01-05 20:03:02.5-08 2019-01-05
2019-12-31 16:00:01.88926-08 2019-12-31
2020-12-31 13:25:58.745232-08 2020-12-31
2021-04-15 07:55:17.915-07 2021-04-15
2021-04-15 07:55:17.915-07 2021-04-15
2021-05-02 05:11:49.5-07 2021-05-02
2021-12-01 05:54:48.123456-08 2021-12-01
NULL NULL
# Overflow
statement error
WITH all_types AS (
select * exclude(small_enum, medium_enum, large_enum)
from test_all_types()
)
SELECT make_timestamptz(
CAST(century(CAST(a."interval" AS INTERVAL)) AS BIGINT),
CAST(a."bigint" AS BIGINT),
CAST(a."bigint" AS BIGINT),
CAST(a."bigint" AS BIGINT),
CAST(a."bigint" AS BIGINT),
CAST(txid_current() AS BIGINT),
'UTC')
FROM all_types a;
----
Overflow in subtraction
statement error
SELECT make_timestamptz(9223372036854775807); -- Infinity
----
Conversion Error: Timestamp microseconds out of range
statement error
SELECT make_timestamptz(294248, 1, 10, 4, 0, 54.775807);
----
Conversion Error: ICU date overflows timestamp range

View File

@@ -0,0 +1,306 @@
# name: test/sql/function/timestamp/test_icu_strftime.test
# description: Test sequence overflow
# group: [timestamp]
require icu
# Normalise the testing locale
statement ok
SET Calendar = 'gregorian';
statement ok
SET TimeZone = 'America/Los_Angeles';
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE timestamps AS SELECT ts::TIMESTAMPTZ AS ts FROM (VALUES
('-infinity'),
('0044-03-13 (BC) 10:33:41.987654+01'),
('1962-07-31 12:20:48.123456+00'),
('epoch'),
('2021-01-01 00:00:00+00'),
('2021-02-02 00:00:00+00'),
('2021-11-26 10:15:13.123456+00'),
('2021-11-15 02:30:00-08'),
('2021-11-15 02:30:00-07'),
('2021-12-25 00:00:00+02'),
('infinity'),
(NULL),
) tbl(ts);
# String casts
query I
SELECT ts::VARCHAR FROM timestamps;
----
-infinity
0044-03-13 (BC) 01:40:43.987654-07:52
1962-07-31 05:20:48.123456-07
1969-12-31 16:00:00-08
2020-12-31 16:00:00-08
2021-02-01 16:00:00-08
2021-11-26 02:15:13.123456-08
2021-11-15 02:30:00-08
2021-11-15 01:30:00-08
2021-12-24 14:00:00-08
infinity
NULL
query II
SELECT ts, strftime(ts, '%Y-%m-%d %H:%M:%S.%f %Z') FROM timestamps;
----
-infinity -infinity
0044-03-13 (BC) 01:40:43.987654-07:52 -43-03-13 01:40:43.987654 America/Los_Angeles
1962-07-31 05:20:48.123456-07 1962-07-31 05:20:48.123456 America/Los_Angeles
1969-12-31 16:00:00-08 1969-12-31 16:00:00.000000 America/Los_Angeles
2020-12-31 16:00:00-08 2020-12-31 16:00:00.000000 America/Los_Angeles
2021-02-01 16:00:00-08 2021-02-01 16:00:00.000000 America/Los_Angeles
2021-11-26 02:15:13.123456-08 2021-11-26 02:15:13.123456 America/Los_Angeles
2021-11-15 02:30:00-08 2021-11-15 02:30:00.000000 America/Los_Angeles
2021-11-15 01:30:00-08 2021-11-15 01:30:00.000000 America/Los_Angeles
2021-12-24 14:00:00-08 2021-12-24 14:00:00.000000 America/Los_Angeles
infinity infinity
NULL NULL
# TZ at the start
query II
SELECT ts, strftime(ts, '%Z %Y-%m-%d %H:%M:%S.%f') FROM timestamps;
----
-infinity -infinity
0044-03-13 (BC) 01:40:43.987654-07:52 America/Los_Angeles -43-03-13 01:40:43.987654
1962-07-31 05:20:48.123456-07 America/Los_Angeles 1962-07-31 05:20:48.123456
1969-12-31 16:00:00-08 America/Los_Angeles 1969-12-31 16:00:00.000000
2020-12-31 16:00:00-08 America/Los_Angeles 2020-12-31 16:00:00.000000
2021-02-01 16:00:00-08 America/Los_Angeles 2021-02-01 16:00:00.000000
2021-11-26 02:15:13.123456-08 America/Los_Angeles 2021-11-26 02:15:13.123456
2021-11-15 02:30:00-08 America/Los_Angeles 2021-11-15 02:30:00.000000
2021-11-15 01:30:00-08 America/Los_Angeles 2021-11-15 01:30:00.000000
2021-12-24 14:00:00-08 America/Los_Angeles 2021-12-24 14:00:00.000000
infinity infinity
NULL NULL
#
# Multiple Formats from an exhaustive list
#
statement ok
CREATE TABLE formats (f VARCHAR);
statement ok
INSERT INTO formats VALUES
('%Y-%m-%d %H:%M:%S.%f %Z'),
('%Y-%m-%d %H:%M:%S.%f'),
('%Y'),
('(%Y)'),
('%% %Y %%'),
('%%%%%% %Y %%%%%%'),
('%d/%m/%Y'),
('%Y %Y %Y %Y'),
('%d/%m/%Y'),
('hello world'),
('%g'),
('%a'),
('%A'),
('%w'),
('%d'),
('%-d'),
('%b'),
('%h'),
('%B'),
('%m'),
('%-m'),
('%y'),
('%-y'),
('%-y'),
('%Y'),
('%H'),
('%-H'),
('%I'),
('%-I'),
('%p'),
('%M'),
('%-M'),
('%S'),
('%-S'),
('%f'),
('%z'),
('%Z'),
('%j'),
('%-j'),
('%U'),
('%W'),
('%c'),
('XX%cXX'),
('%x'),
('%X'),
('XX%cXX%xXX%XXX'),
('%Y'),
('%Y'),
('%y'),
('%y'),
('%V'),
('%G'),
('%u'),
(NULL),
;
query I
SELECT strftime('2022-04-07 18:12:15.123456+00'::TIMESTAMPTZ, f)
FROM formats
----
2022-04-07 11:12:15.123456 America/Los_Angeles
2022-04-07 11:12:15.123456
2022
(2022)
% 2022 %
%%% 2022 %%%
07/04/2022
2022 2022 2022 2022
07/04/2022
hello world
123
Thu
Thursday
4
07
7
Apr
Apr
April
04
4
22
22
22
2022
11
11
11
11
AM
12
12
15
15
123456
-07
America/Los_Angeles
097
97
14
14
2022-04-07 11:12:15
XX2022-04-07 11:12:15XX
2022-04-07
11:12:15
XX2022-04-07 11:12:15XX2022-04-07XX11:12:15XX
2022
2022
22
22
14
2022
4
NULL
#
# Fractional Time Zones
#
statement ok
SET TimeZone='Asia/Kathmandu';
query II
SELECT ts, strftime(ts, '%Y-%m-%d %H:%M:%S.%f %Z') FROM timestamps;
----
-infinity -infinity
0044-03-13 (BC) 15:14:57.987654+05:41 -43-03-13 15:14:57.987654 Asia/Kathmandu
1962-07-31 17:50:48.123456+05:30 1962-07-31 17:50:48.123456 Asia/Kathmandu
1970-01-01 05:30:00+05:30 1970-01-01 05:30:00.000000 Asia/Kathmandu
2021-01-01 05:45:00+05:45 2021-01-01 05:45:00.000000 Asia/Kathmandu
2021-02-02 05:45:00+05:45 2021-02-02 05:45:00.000000 Asia/Kathmandu
2021-11-26 16:00:13.123456+05:45 2021-11-26 16:00:13.123456 Asia/Kathmandu
2021-11-15 16:15:00+05:45 2021-11-15 16:15:00.000000 Asia/Kathmandu
2021-11-15 15:15:00+05:45 2021-11-15 15:15:00.000000 Asia/Kathmandu
2021-12-25 03:45:00+05:45 2021-12-25 03:45:00.000000 Asia/Kathmandu
infinity infinity
NULL NULL
query II
SELECT ts, strftime(ts, '%Y-%m-%d %H:%M:%S.%f %z') FROM timestamps;
----
-infinity -infinity
0044-03-13 (BC) 15:14:57.987654+05:41 -43-03-13 15:14:57.987654 +05:41:16
1962-07-31 17:50:48.123456+05:30 1962-07-31 17:50:48.123456 +05:30
1970-01-01 05:30:00+05:30 1970-01-01 05:30:00.000000 +05:30
2021-01-01 05:45:00+05:45 2021-01-01 05:45:00.000000 +05:45
2021-02-02 05:45:00+05:45 2021-02-02 05:45:00.000000 +05:45
2021-11-26 16:00:13.123456+05:45 2021-11-26 16:00:13.123456 +05:45
2021-11-15 16:15:00+05:45 2021-11-15 16:15:00.000000 +05:45
2021-11-15 15:15:00+05:45 2021-11-15 15:15:00.000000 +05:45
2021-12-25 03:45:00+05:45 2021-12-25 03:45:00.000000 +05:45
infinity infinity
NULL NULL
statement ok
SET TimeZone='Canada/Newfoundland';
query II
SELECT ts, strftime(ts, '%Y-%m-%d %H:%M:%S.%f %Z') FROM timestamps;
----
-infinity -infinity
0044-03-13 (BC) 06:02:49.987654-03:30 -43-03-13 06:02:49.987654 Canada/Newfoundland
1962-07-31 09:50:48.123456-02:30 1962-07-31 09:50:48.123456 Canada/Newfoundland
1969-12-31 20:30:00-03:30 1969-12-31 20:30:00.000000 Canada/Newfoundland
2020-12-31 20:30:00-03:30 2020-12-31 20:30:00.000000 Canada/Newfoundland
2021-02-01 20:30:00-03:30 2021-02-01 20:30:00.000000 Canada/Newfoundland
2021-11-26 06:45:13.123456-03:30 2021-11-26 06:45:13.123456 Canada/Newfoundland
2021-11-15 07:00:00-03:30 2021-11-15 07:00:00.000000 Canada/Newfoundland
2021-11-15 06:00:00-03:30 2021-11-15 06:00:00.000000 Canada/Newfoundland
2021-12-24 18:30:00-03:30 2021-12-24 18:30:00.000000 Canada/Newfoundland
infinity infinity
NULL NULL
query II
SELECT ts, strftime(ts, '%Y-%m-%d %H:%M:%S.%f %z') FROM timestamps;
----
-infinity -infinity
0044-03-13 (BC) 06:02:49.987654-03:30 -43-03-13 06:02:49.987654 -03:30:52
1962-07-31 09:50:48.123456-02:30 1962-07-31 09:50:48.123456 -02:30
1969-12-31 20:30:00-03:30 1969-12-31 20:30:00.000000 -03:30
2020-12-31 20:30:00-03:30 2020-12-31 20:30:00.000000 -03:30
2021-02-01 20:30:00-03:30 2021-02-01 20:30:00.000000 -03:30
2021-11-26 06:45:13.123456-03:30 2021-11-26 06:45:13.123456 -03:30
2021-11-15 07:00:00-03:30 2021-11-15 07:00:00.000000 -03:30
2021-11-15 06:00:00-03:30 2021-11-15 06:00:00.000000 -03:30
2021-12-24 18:30:00-03:30 2021-12-24 18:30:00.000000 -03:30
infinity infinity
NULL NULL
#
# Errors/Coverage
#
statement error
SELECT ts, strftime(ts, '%C') FROM timestamps;
----
#
# Tests for fix of nr3 in list of https://github.com/duckdb/duckdb/issues/5984
#
statement ok
PRAGMA TIMEZONE='Asia/Baghdad';
SELECT strftime(TIMESTAMPTZ '-268535-1-1 0:0:0 America/Pangnirtung','%Z');
statement ok
PRAGMA TIMEZONE='Asia/Baghdad';
SELECT strftime(TIMESTAMPTZ '-268535-1-1 0:0:0 America/Pangnirtung','%Z');
statement ok
PRAGMA TIMEZONE='Pacific/Truk';
SELECT strftime(TIMESTAMPTZ '-217208-11-5 1:47:22 America/Merida','%Z');
statement ok
SELECT strftime(TIMESTAMPTZ '-204873-8-9 6:35:55 America/North_Dakota/Beulah','x%Z');
statement ok
SELECT strftime(TIMESTAMPTZ '292555-4-29 18:38:18 Asia/Damascus','e%Z');

View File

@@ -0,0 +1,603 @@
# name: test/sql/function/timestamp/test_icu_strptime.test
# description: Test sequence overflow
# group: [timestamp]
require icu
# Normalise the testing locale
statement ok
SET Calendar = 'gregorian';
statement ok
SET TimeZone = 'America/Los_Angeles';
statement ok
PRAGMA enable_verification
# Parse TZ
query I
select strptime('2022-03-05 17:59:17.877 CST', '%Y-%m-%d %H:%M:%S.%g %Z');
----
2022-03-05 15:59:17.877-08
# NULLs
query I
select strptime('2022-03-05 17:59:17.877 CST', NULL);
----
NULL
query I
select strptime(NULL, '%Y-%m-%d %H:%M:%S.%g %Z');
----
NULL
# Parse microseconds
query I
select strptime('2022-03-05 17:59:17.123456 CST', '%Y-%m-%d %H:%M:%S.%f %Z');
----
2022-03-05 15:59:17.123456-08
# Parse nanoseconds
query I
select strptime('2022-03-05 17:59:17.123456789 CST', '%Y-%m-%d %H:%M:%S.%n %Z');
----
2022-03-05 15:59:17.123457-08
# Parse specials
foreach func strptime try_strptime
query I
select ${func}('infinity', '%Y-%m-%d %H:%M:%S.%g %Z');
----
infinity
query I
select ${func}('-infinity', '%Y-%m-%d %H:%M:%S.%g %Z');
----
-infinity
query I
select ${func}('epoch', '%Y-%m-%d %H:%M:%S.%g %Z');
----
1969-12-31 16:00:00-08
endloop
#
# Parsing pre-Gregorian timestamps
#
# Winter
query I
select '1582-01-01 10:33:41+01'::timestamptz
----
1582-01-01 01:40:43-07:52
# Summer (no DST)
query I
select '1582-06-01 10:40:43+01'::timestamptz
----
1582-06-01 01:47:45-07:52
# BC
query I
select '0044-03-13 (BC) 10:33:41+01'::timestamptz
----
0044-03-13 (BC) 01:40:43-07:52
query I
SELECT '1582-10-10'::TIMESTAMPTZ AS ts;
----
1582-10-10 00:00:00-07:52
#
# Same date, multiple TZ names
#
# We can't use the offsets in pg_timezone_names()
# because they change with the date
# So hard code the original values
# The important point is that these cover all the GMT offsets.
statement ok
CREATE TABLE zones AS (
FROM (VALUES
('Etc/GMT-14'),
('NZ-CHAT'),
('Pacific/Auckland'),
('Pacific/Enderbury'),
('Australia/LHI'),
('Australia/Melbourne'),
('Pacific/Efate'),
('Australia/Darwin'),
('Asia/Tokyo'),
('Australia/Eucla'),
('Asia/Shanghai'),
('Asia/Novosibirsk'),
('Asia/Yangon'),
('Asia/Omsk'),
('Asia/Kathmandu'),
('Asia/Colombo'),
('Asia/Oral'),
('Asia/Kabul'),
('Europe/Astrakhan'),
('Asia/Tehran'),
('Asia/Kuwait'),
('Asia/Nicosia'),
('Europe/Budapest'),
('Etc/GMT-0'),
('Atlantic/Azores'),
('America/Cayenne'),
('America/Nuuk'),
('CNT'),
('America/Martinique'),
('America/Louisville'),
('America/Rainy_River'),
('America/Shiprock'),
('Mexico/BajaNorte'),
('America/Sitka'),
('Pacific/Marquesas'),
('Pacific/Johnston'),
('Pacific/Niue'),
('Etc/GMT+12'),
) tbl(tz_name)
);
statement ok
CREATE TABLE abbrevs AS (
FROM (VALUES
('Etc/GMT-14'),
('NZ-CHAT'),
('NZ'),
('Pacific/Enderbury'),
('Australia/Hobart'),
('Australia/LHI'),
('Pacific/Efate'),
('Australia/Adelaide'),
('Etc/GMT-9'),
('Australia/Eucla'),
('CTT'),
('Asia/Phnom_Penh'),
('Asia/Yangon'),
('Asia/Thimbu'),
('Asia/Kathmandu'),
('IST'),
('Asia/Qyzylorda'),
('Asia/Kabul'),
('Europe/Samara'),
('Iran'),
('EAT'),
('CAT'),
('Europe/Bratislava'),
('GMT'),
('Atlantic/Azores'),
('America/Cayenne'),
('America/Nuuk'),
('CNT'),
('PRT'),
('America/Panama'),
('America/Rankin_Inlet'),
('Canada/Yukon'),
('PST'),
('America/Nome'),
('Pacific/Marquesas'),
('Pacific/Johnston'),
('Pacific/Niue'),
('Etc/GMT+12'),
) tbl(tz_name)
);
statement ok
CREATE TABLE offsets AS
FROM (VALUES
('+14'),
('+13'),
('+12:45'),
('+12'),
('+11'),
('+10:30'),
('+10'),
('+09:30'),
('+09'),
('+08:45'),
('+08'),
('+07'),
('+06:30'),
('+06'),
('+05:45'),
('+05:30'),
('+05'),
('+04:30'),
('+04'),
('+03:30'),
('+03'),
('+02'),
('+01'),
('+00'),
('-01'),
('-02'),
('-03'),
('-03:30'),
('-04'),
('-05'),
('-06'),
('-07'),
('-08'),
('-09'),
('-09:30'),
('-10'),
('-11'),
('-12'),
) tbl(utc_offset)
;
foreach func strptime try_strptime
# Full zone names
query II
SELECT ${func}('2022-03-05 17:59:17.877 ' || tz_name, '%Y-%m-%d %H:%M:%S.%g %Z') tstz, tz_name
FROM zones
ORDER BY ALL
----
2022-03-04 19:59:17.877-08 Etc/GMT-14
2022-03-04 20:14:17.877-08 NZ-CHAT
2022-03-04 20:59:17.877-08 Pacific/Auckland
2022-03-04 20:59:17.877-08 Pacific/Enderbury
2022-03-04 22:59:17.877-08 Australia/LHI
2022-03-04 22:59:17.877-08 Australia/Melbourne
2022-03-04 22:59:17.877-08 Pacific/Efate
2022-03-05 00:29:17.877-08 Australia/Darwin
2022-03-05 00:59:17.877-08 Asia/Tokyo
2022-03-05 01:14:17.877-08 Australia/Eucla
2022-03-05 01:59:17.877-08 Asia/Shanghai
2022-03-05 02:59:17.877-08 Asia/Novosibirsk
2022-03-05 03:29:17.877-08 Asia/Yangon
2022-03-05 03:59:17.877-08 Asia/Omsk
2022-03-05 04:14:17.877-08 Asia/Kathmandu
2022-03-05 04:29:17.877-08 Asia/Colombo
2022-03-05 04:59:17.877-08 Asia/Oral
2022-03-05 05:29:17.877-08 Asia/Kabul
2022-03-05 05:59:17.877-08 Europe/Astrakhan
2022-03-05 06:29:17.877-08 Asia/Tehran
2022-03-05 06:59:17.877-08 Asia/Kuwait
2022-03-05 07:59:17.877-08 Asia/Nicosia
2022-03-05 08:59:17.877-08 Europe/Budapest
2022-03-05 09:59:17.877-08 Etc/GMT-0
2022-03-05 10:59:17.877-08 Atlantic/Azores
2022-03-05 12:59:17.877-08 America/Cayenne
2022-03-05 12:59:17.877-08 America/Nuuk
2022-03-05 13:29:17.877-08 CNT
2022-03-05 13:59:17.877-08 America/Martinique
2022-03-05 14:59:17.877-08 America/Louisville
2022-03-05 15:59:17.877-08 America/Rainy_River
2022-03-05 16:59:17.877-08 America/Shiprock
2022-03-05 17:59:17.877-08 Mexico/BajaNorte
2022-03-05 18:59:17.877-08 America/Sitka
2022-03-05 19:29:17.877-08 Pacific/Marquesas
2022-03-05 19:59:17.877-08 Pacific/Johnston
2022-03-05 20:59:17.877-08 Pacific/Niue
2022-03-05 21:59:17.877-08 Etc/GMT+12
# Abbreviations
query II
SELECT ${func}('2022-03-05 17:59:17.877 ' || tz_name, '%Y-%m-%d %H:%M:%S.%g %Z') tstz, tz_name
FROM abbrevs
ORDER BY ALL
----
2022-03-04 19:59:17.877-08 Etc/GMT-14
2022-03-04 20:14:17.877-08 NZ-CHAT
2022-03-04 20:59:17.877-08 NZ
2022-03-04 20:59:17.877-08 Pacific/Enderbury
2022-03-04 22:59:17.877-08 Australia/Hobart
2022-03-04 22:59:17.877-08 Australia/LHI
2022-03-04 22:59:17.877-08 Pacific/Efate
2022-03-04 23:29:17.877-08 Australia/Adelaide
2022-03-05 00:59:17.877-08 Etc/GMT-9
2022-03-05 01:14:17.877-08 Australia/Eucla
2022-03-05 01:59:17.877-08 CTT
2022-03-05 02:59:17.877-08 Asia/Phnom_Penh
2022-03-05 03:29:17.877-08 Asia/Yangon
2022-03-05 03:59:17.877-08 Asia/Thimbu
2022-03-05 04:14:17.877-08 Asia/Kathmandu
2022-03-05 04:29:17.877-08 IST
2022-03-05 04:59:17.877-08 Asia/Qyzylorda
2022-03-05 05:29:17.877-08 Asia/Kabul
2022-03-05 05:59:17.877-08 Europe/Samara
2022-03-05 06:29:17.877-08 Iran
2022-03-05 06:59:17.877-08 EAT
2022-03-05 07:59:17.877-08 CAT
2022-03-05 08:59:17.877-08 Europe/Bratislava
2022-03-05 09:59:17.877-08 GMT
2022-03-05 10:59:17.877-08 Atlantic/Azores
2022-03-05 12:59:17.877-08 America/Cayenne
2022-03-05 12:59:17.877-08 America/Nuuk
2022-03-05 13:29:17.877-08 CNT
2022-03-05 13:59:17.877-08 PRT
2022-03-05 14:59:17.877-08 America/Panama
2022-03-05 15:59:17.877-08 America/Rankin_Inlet
2022-03-05 16:59:17.877-08 Canada/Yukon
2022-03-05 17:59:17.877-08 PST
2022-03-05 18:59:17.877-08 America/Nome
2022-03-05 19:29:17.877-08 Pacific/Marquesas
2022-03-05 19:59:17.877-08 Pacific/Johnston
2022-03-05 20:59:17.877-08 Pacific/Niue
2022-03-05 21:59:17.877-08 Etc/GMT+12
#
# UTC Offsets
#
# These should be TSTZs because there is an offset specified.
query II
SELECT ${func}('2022-03-05 17:59:17.877 ' || utc_offset, '%Y-%m-%d %H:%M:%S.%g %z') tstz, utc_offset
FROM offsets
ORDER BY tstz
----
2022-03-04 19:59:17.877-08 +14
2022-03-04 20:59:17.877-08 +13
2022-03-04 21:14:17.877-08 +12:45
2022-03-04 21:59:17.877-08 +12
2022-03-04 22:59:17.877-08 +11
2022-03-04 23:29:17.877-08 +10:30
2022-03-04 23:59:17.877-08 +10
2022-03-05 00:29:17.877-08 +09:30
2022-03-05 00:59:17.877-08 +09
2022-03-05 01:14:17.877-08 +08:45
2022-03-05 01:59:17.877-08 +08
2022-03-05 02:59:17.877-08 +07
2022-03-05 03:29:17.877-08 +06:30
2022-03-05 03:59:17.877-08 +06
2022-03-05 04:14:17.877-08 +05:45
2022-03-05 04:29:17.877-08 +05:30
2022-03-05 04:59:17.877-08 +05
2022-03-05 05:29:17.877-08 +04:30
2022-03-05 05:59:17.877-08 +04
2022-03-05 06:29:17.877-08 +03:30
2022-03-05 06:59:17.877-08 +03
2022-03-05 07:59:17.877-08 +02
2022-03-05 08:59:17.877-08 +01
2022-03-05 09:59:17.877-08 +00
2022-03-05 10:59:17.877-08 -01
2022-03-05 11:59:17.877-08 -02
2022-03-05 12:59:17.877-08 -03
2022-03-05 13:29:17.877-08 -03:30
2022-03-05 13:59:17.877-08 -04
2022-03-05 14:59:17.877-08 -05
2022-03-05 15:59:17.877-08 -06
2022-03-05 16:59:17.877-08 -07
2022-03-05 17:59:17.877-08 -08
2022-03-05 18:59:17.877-08 -09
2022-03-05 19:29:17.877-08 -09:30
2022-03-05 19:59:17.877-08 -10
2022-03-05 20:59:17.877-08 -11
2022-03-05 21:59:17.877-08 -12
#
# Multiple formats
#
# First fails
query II
SELECT ${func}('2022-03-05 17:59:17.877 ' || tz_name, ['%m/%d/%Y %H:%M:%S.%g %Z', '%Y-%m-%d %H:%M:%S.%g %Z']) tstz, tz_name
FROM zones
ORDER BY ALL
----
2022-03-04 19:59:17.877-08 Etc/GMT-14
2022-03-04 20:14:17.877-08 NZ-CHAT
2022-03-04 20:59:17.877-08 Pacific/Auckland
2022-03-04 20:59:17.877-08 Pacific/Enderbury
2022-03-04 22:59:17.877-08 Australia/LHI
2022-03-04 22:59:17.877-08 Australia/Melbourne
2022-03-04 22:59:17.877-08 Pacific/Efate
2022-03-05 00:29:17.877-08 Australia/Darwin
2022-03-05 00:59:17.877-08 Asia/Tokyo
2022-03-05 01:14:17.877-08 Australia/Eucla
2022-03-05 01:59:17.877-08 Asia/Shanghai
2022-03-05 02:59:17.877-08 Asia/Novosibirsk
2022-03-05 03:29:17.877-08 Asia/Yangon
2022-03-05 03:59:17.877-08 Asia/Omsk
2022-03-05 04:14:17.877-08 Asia/Kathmandu
2022-03-05 04:29:17.877-08 Asia/Colombo
2022-03-05 04:59:17.877-08 Asia/Oral
2022-03-05 05:29:17.877-08 Asia/Kabul
2022-03-05 05:59:17.877-08 Europe/Astrakhan
2022-03-05 06:29:17.877-08 Asia/Tehran
2022-03-05 06:59:17.877-08 Asia/Kuwait
2022-03-05 07:59:17.877-08 Asia/Nicosia
2022-03-05 08:59:17.877-08 Europe/Budapest
2022-03-05 09:59:17.877-08 Etc/GMT-0
2022-03-05 10:59:17.877-08 Atlantic/Azores
2022-03-05 12:59:17.877-08 America/Cayenne
2022-03-05 12:59:17.877-08 America/Nuuk
2022-03-05 13:29:17.877-08 CNT
2022-03-05 13:59:17.877-08 America/Martinique
2022-03-05 14:59:17.877-08 America/Louisville
2022-03-05 15:59:17.877-08 America/Rainy_River
2022-03-05 16:59:17.877-08 America/Shiprock
2022-03-05 17:59:17.877-08 Mexico/BajaNorte
2022-03-05 18:59:17.877-08 America/Sitka
2022-03-05 19:29:17.877-08 Pacific/Marquesas
2022-03-05 19:59:17.877-08 Pacific/Johnston
2022-03-05 20:59:17.877-08 Pacific/Niue
2022-03-05 21:59:17.877-08 Etc/GMT+12
# First has no TZ
query II
SELECT ${func}('2022-03-05 17:59:17.877 ' || tz_name, ['%Y-%m-%d %H:%M:%S.%g', '%Y-%m-%d %H:%M:%S.%g %Z']) tstz, tz_name
FROM zones
ORDER BY ALL
----
2022-03-04 19:59:17.877-08 Etc/GMT-14
2022-03-04 20:14:17.877-08 NZ-CHAT
2022-03-04 20:59:17.877-08 Pacific/Auckland
2022-03-04 20:59:17.877-08 Pacific/Enderbury
2022-03-04 22:59:17.877-08 Australia/LHI
2022-03-04 22:59:17.877-08 Australia/Melbourne
2022-03-04 22:59:17.877-08 Pacific/Efate
2022-03-05 00:29:17.877-08 Australia/Darwin
2022-03-05 00:59:17.877-08 Asia/Tokyo
2022-03-05 01:14:17.877-08 Australia/Eucla
2022-03-05 01:59:17.877-08 Asia/Shanghai
2022-03-05 02:59:17.877-08 Asia/Novosibirsk
2022-03-05 03:29:17.877-08 Asia/Yangon
2022-03-05 03:59:17.877-08 Asia/Omsk
2022-03-05 04:14:17.877-08 Asia/Kathmandu
2022-03-05 04:29:17.877-08 Asia/Colombo
2022-03-05 04:59:17.877-08 Asia/Oral
2022-03-05 05:29:17.877-08 Asia/Kabul
2022-03-05 05:59:17.877-08 Europe/Astrakhan
2022-03-05 06:29:17.877-08 Asia/Tehran
2022-03-05 06:59:17.877-08 Asia/Kuwait
2022-03-05 07:59:17.877-08 Asia/Nicosia
2022-03-05 08:59:17.877-08 Europe/Budapest
2022-03-05 09:59:17.877-08 Etc/GMT-0
2022-03-05 10:59:17.877-08 Atlantic/Azores
2022-03-05 12:59:17.877-08 America/Cayenne
2022-03-05 12:59:17.877-08 America/Nuuk
2022-03-05 13:29:17.877-08 CNT
2022-03-05 13:59:17.877-08 America/Martinique
2022-03-05 14:59:17.877-08 America/Louisville
2022-03-05 15:59:17.877-08 America/Rainy_River
2022-03-05 16:59:17.877-08 America/Shiprock
2022-03-05 17:59:17.877-08 Mexico/BajaNorte
2022-03-05 18:59:17.877-08 America/Sitka
2022-03-05 19:29:17.877-08 Pacific/Marquesas
2022-03-05 19:59:17.877-08 Pacific/Johnston
2022-03-05 20:59:17.877-08 Pacific/Niue
2022-03-05 21:59:17.877-08 Etc/GMT+12
# Neither has TZ - should be TS not TSTZ
query II
SELECT ${func}('2022-03-05 17:59:17.877', ['%m/%d/%Y %H:%M:%S.%g', '%Y-%m-%d %H:%M:%S.%g']) tstz, tz_name
FROM zones
ORDER BY ALL
----
2022-03-05 17:59:17.877 America/Cayenne
2022-03-05 17:59:17.877 America/Louisville
2022-03-05 17:59:17.877 America/Martinique
2022-03-05 17:59:17.877 America/Nuuk
2022-03-05 17:59:17.877 America/Rainy_River
2022-03-05 17:59:17.877 America/Shiprock
2022-03-05 17:59:17.877 America/Sitka
2022-03-05 17:59:17.877 Asia/Colombo
2022-03-05 17:59:17.877 Asia/Kabul
2022-03-05 17:59:17.877 Asia/Kathmandu
2022-03-05 17:59:17.877 Asia/Kuwait
2022-03-05 17:59:17.877 Asia/Nicosia
2022-03-05 17:59:17.877 Asia/Novosibirsk
2022-03-05 17:59:17.877 Asia/Omsk
2022-03-05 17:59:17.877 Asia/Oral
2022-03-05 17:59:17.877 Asia/Shanghai
2022-03-05 17:59:17.877 Asia/Tehran
2022-03-05 17:59:17.877 Asia/Tokyo
2022-03-05 17:59:17.877 Asia/Yangon
2022-03-05 17:59:17.877 Atlantic/Azores
2022-03-05 17:59:17.877 Australia/Darwin
2022-03-05 17:59:17.877 Australia/Eucla
2022-03-05 17:59:17.877 Australia/LHI
2022-03-05 17:59:17.877 Australia/Melbourne
2022-03-05 17:59:17.877 CNT
2022-03-05 17:59:17.877 Etc/GMT+12
2022-03-05 17:59:17.877 Etc/GMT-0
2022-03-05 17:59:17.877 Etc/GMT-14
2022-03-05 17:59:17.877 Europe/Astrakhan
2022-03-05 17:59:17.877 Europe/Budapest
2022-03-05 17:59:17.877 Mexico/BajaNorte
2022-03-05 17:59:17.877 NZ-CHAT
2022-03-05 17:59:17.877 Pacific/Auckland
2022-03-05 17:59:17.877 Pacific/Efate
2022-03-05 17:59:17.877 Pacific/Enderbury
2022-03-05 17:59:17.877 Pacific/Johnston
2022-03-05 17:59:17.877 Pacific/Marquesas
2022-03-05 17:59:17.877 Pacific/Niue
endloop
# Offset patterns should also trigger casting to th current time zone
query I
SELECT STRPTIME('2025-09-16', ['%Y-%m-%d', '%Y-%m-%d%z']);
----
2025-09-16 00:00:00-07
#
# Try
#
query II
SELECT try_strptime('2022-03-05 17:59:17.877 ' || tz_name, '%m/%d/%Y %H:%M:%S.%g %Z') tstz, tz_name
FROM zones
WHERE tstz IS NOT NULL
ORDER BY ALL
----
#
# Errors/Coverage
#
# Multiple formats are not allowed
statement ok
CREATE TABLE multiples (s VARCHAR, f VARCHAR);
statement ok
INSERT INTO multiples VALUES
('2022-03-05 17:59:17.877 CST', '%Y-%m-%d %H:%M:%S.%g %Z'),
('2022-03-05 17:59:17.877', '%Y-%m-%d %H:%M:%S.%g'),
;
statement error
SELECT strptime(s, f) FROM multiples;
----
# Invalid format
statement error
select strptime('2022-03-05 17:59:17.877 CST', '%C');
----
# Parse error
statement error
select strptime('2022-03-05 17:59:17.877 CST', '%Y-%m-%d %H:%M:%S.%g');
----
#
# Cast VARCHAR => TIMESTAMPTZ
#
statement error
select 'fnord'::timestamptz;
----
query I
select TRY_CAST('fnord' AS timestamptz);
----
NULL
query I
select '2022-03-05 17:59:17.123456 CST'::timestamptz;
----
2022-03-05 15:59:17.123456-08
query I
select 'infinity'::timestamptz;
----
infinity
query I
select '-infinity'::timestamptz;
----
-infinity
query I
select 'epoch'::timestamptz;
----
1969-12-31 16:00:00-08
# This is expected behaviour (ICU precision)
statement error
SELECT TIMESTAMPTZ '294247-01-10 04:00:54.7758';
----
Conversion Error: ICU date overflows timestamp range
# Invalid time zones should produce NULL, not an error
query I
select try_strptime('2015-01-05 00:00:00 FNORD', '%Y-%m-%d %H:%M:%S %Z');
----
NULL

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,25 @@
# name: test/sql/function/timestamp/test_last_modified.test
# description: Test file system last modified time zone
# group: [timestamp]
require icu
loop i 0 100
# create file
statement ok
copy (select 42 i) to '__TEST_DIR__/last_modified_tz.csv'
# last modified time should be equal to now(), but, now() is a lot more accurate than file system modification times
# so, we convert to epoch (double), then check that the absolute difference between the two is less than 5
query I
with cte as (
select epoch(last_modified) as last_modified
from read_blob('__TEST_DIR__/last_modified_tz.csv')
)
select abs(epoch(now()) - last_modified) < 5
from cte;
----
true
endloop

View File

@@ -0,0 +1,29 @@
# name: test/sql/function/timestamp/test_now.test
# description: NOW function
# group: [timestamp]
statement ok
PRAGMA enable_verification
# the NOW function should return the start time of the transaction
# hence during a transaction it should not change
statement ok
BEGIN TRANSACTION
statement ok
CREATE TABLE t1(t TIMESTAMP)
statement ok
INSERT INTO t1 VALUES (NOW());
statement ok
INSERT INTO t1 SELECT NOW();
query I
SELECT COUNT(DISTINCT t) FROM t1
----
1
statement ok
ROLLBACK

View File

@@ -0,0 +1,43 @@
# name: test/sql/function/timestamp/test_now_prepared.test
# description: NOW function with prepared statements
# group: [timestamp]
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE timestamps(ts TIMESTAMP);
# the NOW function should not be cached in prepared statements
statement ok
PREPARE v1 AS INSERT INTO timestamps VALUES(NOW());
statement ok
EXECUTE v1;
sleep 1 second
statement ok
EXECUTE v1
query I
SELECT COUNT(DISTINCT ts) FROM timestamps
----
2
# with DEFAULT values
statement ok
CREATE TABLE timestamps_default(ts TIMESTAMP DEFAULT NOW());
statement ok
INSERT INTO timestamps_default DEFAULT VALUES
sleep 1 second
statement ok
INSERT INTO timestamps_default DEFAULT VALUES
query I
SELECT COUNT(DISTINCT ts) FROM timestamps_default
----
2

View File

@@ -0,0 +1,398 @@
# name: test/sql/function/timestamp/test_strftime_timestamp.test
# description: Test all strftime % codes with the date type
# group: [timestamp]
statement ok
SET default_null_order='nulls_first';
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE timestamps(d TIMESTAMP);
INSERT INTO timestamps VALUES
('1992-01-01 01:20:30'),
('1993-03-20 23:50:01.123'),
('2020-08-09 12:01:55.123456'),
('2020-08-10 10:10:10.123456789'),
(NULL);
# %a: Abbreviated weekday name
query I
SELECT strftime(d, '%a') FROM timestamps ORDER BY d;
----
NULL
Wed
Sat
Sun
Mon
# %A: Full weekday name
query I
SELECT strftime(d, '%A') FROM timestamps ORDER BY d;
----
NULL
Wednesday
Saturday
Sunday
Monday
# %w - Weekday as a decimal number.
query I
SELECT strftime(d, '%w') FROM timestamps ORDER BY d;
----
NULL
3
6
0
1
# %u - ISO Weekday as a decimal number.
query I
SELECT strftime(d, '%u') FROM timestamps ORDER BY d;
----
NULL
3
6
7
1
# %d - Day of the month as a zero-padded decimal.
query I
SELECT strftime(d, '%d') FROM timestamps ORDER BY d;
----
NULL
01
20
09
10
# %-d - Day of the month as a decimal number.
query I
SELECT strftime(d, '%-d') FROM timestamps ORDER BY d;
----
NULL
1
20
9
10
# %b - Abbreviated month name.
query I
SELECT strftime(d, '%b') FROM timestamps ORDER BY d;
----
NULL
Jan
Mar
Aug
Aug
# %h - alias for %b
query I
SELECT strftime(d, '%h') FROM timestamps ORDER BY d;
----
NULL
Jan
Mar
Aug
Aug
# %B - Full month name
query I
SELECT strftime(d, '%B') FROM timestamps ORDER BY d;
----
NULL
January
March
August
August
# %m - Month as a zero-padded decimal number
query I
SELECT strftime(d, '%m') FROM timestamps ORDER BY d;
----
NULL
01
03
08
08
# %-m - Month as a decimal number. (1, 2, ..., 12)
query I
SELECT strftime(d, '%-m') FROM timestamps ORDER BY d;
----
NULL
1
3
8
8
# %y - Year without century as a zero-padded decimal number.
query I
SELECT strftime(d, '%y') FROM timestamps ORDER BY d;
----
NULL
92
93
20
20
# %-y - Year without century as a decimal number.
query I
SELECT strftime(d, '%-y') FROM timestamps ORDER BY d;
----
NULL
92
93
20
20
query I
SELECT strftime(DATE '2001-01-01', '%-y')
----
1
# %Y - Year with century as a decimal number.
query I
SELECT strftime(d, '%Y') FROM timestamps ORDER BY d;
----
NULL
1992
1993
2020
2020
# %G - ISO Year with century as a decimal number.
query I
SELECT strftime(d, '%G') FROM timestamps ORDER BY d;
----
NULL
1992
1993
2020
2020
# %H - Hour (24-hour clock) as a zero-padded decimal number.
query I
SELECT strftime(d, '%H') FROM timestamps ORDER BY d;
----
NULL
01
23
12
10
# %-H - Hour (24-hour clock) as a decimal number. (0, 1, ..., 23)
query I
SELECT strftime(d, '%-H') FROM timestamps ORDER BY d;
----
NULL
1
23
12
10
# %I - Hour (12-hour clock) as a zero-padded decimal number.
query I
SELECT strftime(d, '%I') FROM timestamps ORDER BY d;
----
NULL
01
11
12
10
# %-I - Hour (12-hour clock) as a decimal number. (1, 2, ... 12)
query I
SELECT strftime(d, '%-I') FROM timestamps ORDER BY d;
----
NULL
1
11
12
10
# %p - Locales AM or PM.
query I
SELECT strftime(d, '%p') FROM timestamps ORDER BY d;
----
NULL
AM
PM
PM
AM
# %M - Minute as a zero-padded decimal number.
query I
SELECT strftime(d, '%M') FROM timestamps ORDER BY d;
----
NULL
20
50
01
10
# %-M - Minute as a decimal number. (0, 1, ..., 59)
query I
SELECT strftime(d, '%-M') FROM timestamps ORDER BY d;
----
NULL
20
50
1
10
# %S - Second as a zero-padded decimal number.
query I
SELECT strftime(d, '%S') FROM timestamps ORDER BY d;
----
NULL
30
01
55
10
# %-S - Second as a decimal number. (0, 1, ..., 59)
query I
SELECT strftime(d, '%-S') FROM timestamps ORDER BY d;
----
NULL
30
1
55
10
# %f - Microsecond as a decimal number, zero-padded on the left.
query I
SELECT strftime(d, '%f') FROM timestamps ORDER BY d;
----
NULL
000000
123000
123456
123456
# %g - Millisecond as a decimal number, zero-padded on the left.
query I
SELECT strftime(d, '%g')
FROM timestamps
ORDER BY d;
----
NULL
000
123
123
123
# %n - Nanosecond as a decimal number, zero-padded on the left.
query I
SELECT strftime(d, '%n')
FROM timestamps
ORDER BY d;
----
NULL
000000000
123000000
123456000
123456000
# %z - UTC offset in the form +HHMM or -HHMM.
query I
SELECT strftime(d, '%z') FROM timestamps ORDER BY d;
----
NULL
+00
+00
+00
+00
# %Z - Time zone name.
query I
SELECT strftime(d, '%Z') FROM timestamps ORDER BY d;
----
NULL
(empty)
(empty)
(empty)
(empty)
# %j - Day of the year as a zero-padded decimal number.
query I
SELECT strftime(d, '%j') FROM timestamps ORDER BY d;
----
NULL
001
079
222
223
# %-j - Day of the year as a decimal number. (1, 2, ..., 366)
query I
SELECT strftime(d, '%-j') FROM timestamps ORDER BY d;
----
NULL
1
79
222
223
# %U - Week number of the year (Sunday as the first day of the week).
query I
SELECT strftime(d, '%U') FROM timestamps ORDER BY d;
----
NULL
00
11
32
32
# %W - Week number of the year (Monday as the first day of the week).
query I
SELECT strftime(d, '%W') FROM timestamps ORDER BY d;
----
NULL
00
11
31
32
# %V - ISO Week number of the year (Week 1 contains Jan 4).
query I
SELECT strftime(d, '%V') FROM timestamps ORDER BY d;
----
NULL
01
11
32
33
# %c - Locales appropriate date and time representation.
query I
SELECT strftime(d, '%c') FROM timestamps ORDER BY d;
----
NULL
1992-01-01 01:20:30
1993-03-20 23:50:01
2020-08-09 12:01:55
2020-08-10 10:10:10
# %x - Locales appropriate date representation.
query I
SELECT strftime(d, '%x') FROM timestamps ORDER BY d;
----
NULL
1992-01-01
1993-03-20
2020-08-09
2020-08-10
# X - Locales appropriate time representation.
query I
SELECT strftime(d, '%X') FROM timestamps ORDER BY d;
----
NULL
01:20:30
23:50:01
12:01:55
10:10:10

View File

@@ -0,0 +1,398 @@
# name: test/sql/function/timestamp/test_strftime_timestamp_ns.test
# description: Test all strftime % codes with the TIMESTAMP_NS type
# group: [timestamp]
statement ok
SET default_null_order='nulls_first';
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE timestamps(d TIMESTAMP_NS);
INSERT INTO timestamps VALUES
('1992-01-01 01:20:30'),
('1993-03-20 23:50:01.123'),
('2020-08-09 12:01:55.123456'),
('2020-08-10 10:10:10.123456789'),
(NULL);
# %a: Abbreviated weekday name
query I
SELECT strftime(d, '%a') FROM timestamps ORDER BY d;
----
NULL
Wed
Sat
Sun
Mon
# %A: Full weekday name
query I
SELECT strftime(d, '%A') FROM timestamps ORDER BY d;
----
NULL
Wednesday
Saturday
Sunday
Monday
# %w - Weekday as a decimal number.
query I
SELECT strftime(d, '%w') FROM timestamps ORDER BY d;
----
NULL
3
6
0
1
# %u - ISO Weekday as a decimal number.
query I
SELECT strftime(d, '%u') FROM timestamps ORDER BY d;
----
NULL
3
6
7
1
# %d - Day of the month as a zero-padded decimal.
query I
SELECT strftime(d, '%d') FROM timestamps ORDER BY d;
----
NULL
01
20
09
10
# %-d - Day of the month as a decimal number.
query I
SELECT strftime(d, '%-d') FROM timestamps ORDER BY d;
----
NULL
1
20
9
10
# %b - Abbreviated month name.
query I
SELECT strftime(d, '%b') FROM timestamps ORDER BY d;
----
NULL
Jan
Mar
Aug
Aug
# %h - alias for %b
query I
SELECT strftime(d, '%h') FROM timestamps ORDER BY d;
----
NULL
Jan
Mar
Aug
Aug
# %B - Full month name
query I
SELECT strftime(d, '%B') FROM timestamps ORDER BY d;
----
NULL
January
March
August
August
# %m - Month as a zero-padded decimal number
query I
SELECT strftime(d, '%m') FROM timestamps ORDER BY d;
----
NULL
01
03
08
08
# %-m - Month as a decimal number. (1, 2, ..., 12)
query I
SELECT strftime(d, '%-m') FROM timestamps ORDER BY d;
----
NULL
1
3
8
8
# %y - Year without century as a zero-padded decimal number.
query I
SELECT strftime(d, '%y') FROM timestamps ORDER BY d;
----
NULL
92
93
20
20
# %-y - Year without century as a decimal number.
query I
SELECT strftime(d, '%-y') FROM timestamps ORDER BY d;
----
NULL
92
93
20
20
query I
SELECT strftime(DATE '2001-01-01', '%-y')
----
1
# %Y - Year with century as a decimal number.
query I
SELECT strftime(d, '%Y') FROM timestamps ORDER BY d;
----
NULL
1992
1993
2020
2020
# %G - ISO Year with century as a decimal number.
query I
SELECT strftime(d, '%G') FROM timestamps ORDER BY d;
----
NULL
1992
1993
2020
2020
# %H - Hour (24-hour clock) as a zero-padded decimal number.
query I
SELECT strftime(d, '%H') FROM timestamps ORDER BY d;
----
NULL
01
23
12
10
# %-H - Hour (24-hour clock) as a decimal number. (0, 1, ..., 23)
query I
SELECT strftime(d, '%-H') FROM timestamps ORDER BY d;
----
NULL
1
23
12
10
# %I - Hour (12-hour clock) as a zero-padded decimal number.
query I
SELECT strftime(d, '%I') FROM timestamps ORDER BY d;
----
NULL
01
11
12
10
# %-I - Hour (12-hour clock) as a decimal number. (1, 2, ... 12)
query I
SELECT strftime(d, '%-I') FROM timestamps ORDER BY d;
----
NULL
1
11
12
10
# %p - Locales AM or PM.
query I
SELECT strftime(d, '%p') FROM timestamps ORDER BY d;
----
NULL
AM
PM
PM
AM
# %M - Minute as a zero-padded decimal number.
query I
SELECT strftime(d, '%M') FROM timestamps ORDER BY d;
----
NULL
20
50
01
10
# %-M - Minute as a decimal number. (0, 1, ..., 59)
query I
SELECT strftime(d, '%-M') FROM timestamps ORDER BY d;
----
NULL
20
50
1
10
# %S - Second as a zero-padded decimal number.
query I
SELECT strftime(d, '%S') FROM timestamps ORDER BY d;
----
NULL
30
01
55
10
# %-S - Second as a decimal number. (0, 1, ..., 59)
query I
SELECT strftime(d, '%-S') FROM timestamps ORDER BY d;
----
NULL
30
1
55
10
# %f - Microsecond as a decimal number, zero-padded on the left.
query I
SELECT strftime(d, '%f') FROM timestamps ORDER BY d;
----
NULL
000000
123000
123456
123456
# %g - Millisecond as a decimal number, zero-padded on the left.
query I
SELECT strftime(d, '%g')
FROM timestamps
ORDER BY d;
----
NULL
000
123
123
123
# %n - Nanosecond as a decimal number, zero-padded on the left.
query I
SELECT strftime(d, '%n')
FROM timestamps
ORDER BY d;
----
NULL
000000000
123000000
123456000
123456789
# %z - UTC offset in the form +HHMM or -HHMM.
query I
SELECT strftime(d, '%z') FROM timestamps ORDER BY d;
----
NULL
+00
+00
+00
+00
# %Z - Time zone name.
query I
SELECT strftime(d, '%Z') FROM timestamps ORDER BY d;
----
NULL
(empty)
(empty)
(empty)
(empty)
# %j - Day of the year as a zero-padded decimal number.
query I
SELECT strftime(d, '%j') FROM timestamps ORDER BY d;
----
NULL
001
079
222
223
# %-j - Day of the year as a decimal number. (1, 2, ..., 366)
query I
SELECT strftime(d, '%-j') FROM timestamps ORDER BY d;
----
NULL
1
79
222
223
# %U - Week number of the year (Sunday as the first day of the week).
query I
SELECT strftime(d, '%U') FROM timestamps ORDER BY d;
----
NULL
00
11
32
32
# %W - Week number of the year (Monday as the first day of the week).
query I
SELECT strftime(d, '%W') FROM timestamps ORDER BY d;
----
NULL
00
11
31
32
# %V - ISO Week number of the year (Week 1 contains Jan 4).
query I
SELECT strftime(d, '%V') FROM timestamps ORDER BY d;
----
NULL
01
11
32
33
# %c - Locales appropriate date and time representation.
query I
SELECT strftime(d, '%c') FROM timestamps ORDER BY d;
----
NULL
1992-01-01 01:20:30
1993-03-20 23:50:01
2020-08-09 12:01:55
2020-08-10 10:10:10
# %x - Locales appropriate date representation.
query I
SELECT strftime(d, '%x') FROM timestamps ORDER BY d;
----
NULL
1992-01-01
1993-03-20
2020-08-09
2020-08-10
# X - Locales appropriate time representation.
query I
SELECT strftime(d, '%X') FROM timestamps ORDER BY d;
----
NULL
01:20:30
23:50:01
12:01:55
10:10:10

View File

@@ -0,0 +1,689 @@
# 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)
----

View File

@@ -0,0 +1,865 @@
# name: test/sql/function/timestamp/test_time_bucket_timestamp.test
# description: Test time bucket functionality
# group: [timestamp]
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE timestamps(w INTERVAL, t TIMESTAMP, shift INTERVAL, origin TIMESTAMP);
statement ok
INSERT INTO timestamps VALUES ('10 days', '-infinity', '0 days', '1970-01-05 00:00:00'),
('10 days', '3000-01-02 (BC) 03:16:23.003003', '3 days', '3000-01-01 (BC) 00:00:00'),
('2 months', '1024-04-10 (BC) 12:35:40.003003', '10 days', '1024-03-01 (BC) 00:00:00'),
('10 days', '0044-06-15 (BC) 12:35:40.003003', '6 days', '0044-02-01 (BC) 00:00:00'),
('333 microseconds', '0678-06-30 02:02:03.003003', '0 microseconds', '1970-02-10 00:00:00'),
('333 microseconds', '0794-07-03 02:02:04.003003', '444 microseconds', '1970-10-17 00:05:05.006006'),
('333 microseconds', '1700-01-01 00:00:00', '-444 microseconds', '1970-09-27 00:05:05.006006'),
('333 milliseconds', '1962-12-31 00:00:00', '0 milliseconds', '1970-08-12 00:00:00'),
('333 milliseconds', '1970-01-01 00:00:00', '444 milliseconds', '1970-06-23 00:05:05.006006'),
('333 milliseconds', '1985-12-07 02:02:08.003003', '-444 milliseconds', '1970-01-05 00:05:05.006006'),
('333 seconds', '1989-10-18 02:02:09.003003', '0 seconds', '1970-09-07 00:00:00'),
('333 seconds', '1990-01-21 02:02:10.003003', '444 seconds', '1970-07-06 00:05:05.006006'),
('333 seconds', '1991-02-10 02:02:11.003003', '-444 seconds', '1970-10-09 00:05:05.006006'),
('333 minutes', '1992-09-11 02:02:12.003003', '0 minutes', '1970-04-10 00:00:00'),
('333 minutes', '1994-12-26 02:02:13.003003', '444 minute', '1970-03-05 00:05:05.006006'),
('333 minutes', '1997-05-13 02:02:14.003003', '-444 minute', '2000-01-03 00:00:00'),
('333 hours', '1999-02-14 02:02:15.003003', '0 hours', '2000-01-01 00:00:00'),
('333 hours', '2000-01-01 00:00:00', '444 hours', '1980-11-25 00:05:05.006006'),
('333 hours', '2000-01-03 00:00:00', '-444 hours', '2045-01-05 00:05:05.006006'),
('10 days', '2008-09-17 02:02:18.003003', '0 days', '2009-11-05 00:00:00'),
('1 week', '2010-08-18 02:02:19.003003', '0 days', '2100-09-05 00:00:00'),
('10 days', '2013-03-19 02:02:20.003003', '2 days 4 hours', '2300-10-07 00:05:05.006006'),
('10 days', '2014-11-20 02:02:21.003003', '-2 days 4 hours', '1970-12-07 00:05:05.006006'),
('2 months', '2016-02-21 02:02:22.003003', '0 months', '1970-09-05 00:00:00'),
('2 months', '2018-08-22 02:02:23.003003', '1 month 1 week', '1970-07-01 00:05:05.006006'),
('2 months', '2019-01-23 02:02:24.003003', '-1 month 1 week', '1969-09-01 00:05:05.006006'),
('2 year', '2020-02-24 02:02:25.003003', '6 months', '1970-02-13 00:05:05.006006'),
('2 year', '2022-07-25 02:02:26.003003', '-6 months', '1969-10-09 00:05:05.006006'),
('10 days', '2024-02-25 02:02:26.003003', '1 year', '-infinity'),
('10 days', '2032-09-25 02:02:26.003003', '-1 year', 'infinity'),
('10 days', 'infinity', '0 days', '1970-01-01 00:00:00'),
;
query II
select t, time_bucket('56 seconds'::interval, t) from timestamps;
----
-infinity -infinity
3000-01-02 (BC) 03:16:23.003003 3000-01-02 (BC) 03:15:36
1024-04-10 (BC) 12:35:40.003003 1024-04-10 (BC) 12:35:28
0044-06-15 (BC) 12:35:40.003003 0044-06-15 (BC) 12:34:48
0678-06-30 02:02:03.003003 0678-06-30 02:01:12
0794-07-03 02:02:04.003003 0794-07-03 02:01:12
1700-01-01 00:00:00 1699-12-31 23:59:36
1962-12-31 00:00:00 1962-12-31 00:00:00
1970-01-01 00:00:00 1969-12-31 23:59:28
1985-12-07 02:02:08.003003 1985-12-07 02:02:00
1989-10-18 02:02:09.003003 1989-10-18 02:01:36
1990-01-21 02:02:10.003003 1990-01-21 02:02:08
1991-02-10 02:02:11.003003 1991-02-10 02:02:08
1992-09-11 02:02:12.003003 1992-09-11 02:01:52
1994-12-26 02:02:13.003003 1994-12-26 02:01:20
1997-05-13 02:02:14.003003 1997-05-13 02:01:28
1999-02-14 02:02:15.003003 1999-02-14 02:02:08
2000-01-01 00:00:00 1999-12-31 23:59:44
2000-01-03 00:00:00 2000-01-03 00:00:00
2008-09-17 02:02:18.003003 2008-09-17 02:01:36
2010-08-18 02:02:19.003003 2010-08-18 02:01:36
2013-03-19 02:02:20.003003 2013-03-19 02:01:28
2014-11-20 02:02:21.003003 2014-11-20 02:01:44
2016-02-21 02:02:22.003003 2016-02-21 02:02:08
2018-08-22 02:02:23.003003 2018-08-22 02:01:36
2019-01-23 02:02:24.003003 2019-01-23 02:01:36
2020-02-24 02:02:25.003003 2020-02-24 02:02:16
2022-07-25 02:02:26.003003 2022-07-25 02:02:16
2024-02-25 02:02:26.003003 2024-02-25 02:02:08
2032-09-25 02:02:26.003003 2032-09-25 02:02:00
infinity infinity
query II
select t, time_bucket('3 days'::interval, t) from timestamps;
----
-infinity -infinity
3000-01-02 (BC) 03:16:23.003003 3000-01-02 (BC) 00:00:00
1024-04-10 (BC) 12:35:40.003003 1024-04-10 (BC) 00:00:00
0044-06-15 (BC) 12:35:40.003003 0044-06-14 (BC) 00:00:00
0678-06-30 02:02:03.003003 0678-06-29 00:00:00
0794-07-03 02:02:04.003003 0794-07-03 00:00:00
1700-01-01 00:00:00 1699-12-31 00:00:00
1962-12-31 00:00:00 1962-12-30 00:00:00
1970-01-01 00:00:00 1970-01-01 00:00:00
1985-12-07 02:02:08.003003 1985-12-05 00:00:00
1989-10-18 02:02:09.003003 1989-10-18 00:00:00
1990-01-21 02:02:10.003003 1990-01-19 00:00:00
1991-02-10 02:02:11.003003 1991-02-10 00:00:00
1992-09-11 02:02:12.003003 1992-09-11 00:00:00
1994-12-26 02:02:13.003003 1994-12-24 00:00:00
1997-05-13 02:02:14.003003 1997-05-12 00:00:00
1999-02-14 02:02:15.003003 1999-02-13 00:00:00
2000-01-01 00:00:00 1999-12-31 00:00:00
2000-01-03 00:00:00 2000-01-03 00:00:00
2008-09-17 02:02:18.003003 2008-09-17 00:00:00
2010-08-18 02:02:19.003003 2010-08-17 00:00:00
2013-03-19 02:02:20.003003 2013-03-19 00:00:00
2014-11-20 02:02:21.003003 2014-11-18 00:00:00
2016-02-21 02:02:22.003003 2016-02-20 00:00:00
2018-08-22 02:02:23.003003 2018-08-20 00:00:00
2019-01-23 02:02:24.003003 2019-01-23 00:00:00
2020-02-24 02:02:25.003003 2020-02-23 00:00:00
2022-07-25 02:02:26.003003 2022-07-24 00:00:00
2024-02-25 02:02:26.003003 2024-02-23 00:00:00
2032-09-25 02:02:26.003003 2032-09-23 00:00:00
infinity infinity
query II
select t, time_bucket('3 years'::interval, t) from timestamps;
----
-infinity -infinity
3000-01-02 (BC) 03:16:23.003003 3002-01-01 (BC) 00:00:00
1024-04-10 (BC) 12:35:40.003003 1025-01-01 (BC) 00:00:00
0044-06-15 (BC) 12:35:40.003003 0044-01-01 (BC) 00:00:00
0678-06-30 02:02:03.003003 0677-01-01 00:00:00
0794-07-03 02:02:04.003003 0794-01-01 00:00:00
1700-01-01 00:00:00 1700-01-01 00:00:00
1962-12-31 00:00:00 1961-01-01 00:00:00
1970-01-01 00:00:00 1970-01-01 00:00:00
1985-12-07 02:02:08.003003 1985-01-01 00:00:00
1989-10-18 02:02:09.003003 1988-01-01 00:00:00
1990-01-21 02:02:10.003003 1988-01-01 00:00:00
1991-02-10 02:02:11.003003 1991-01-01 00:00:00
1992-09-11 02:02:12.003003 1991-01-01 00:00:00
1994-12-26 02:02:13.003003 1994-01-01 00:00:00
1997-05-13 02:02:14.003003 1997-01-01 00:00:00
1999-02-14 02:02:15.003003 1997-01-01 00:00:00
2000-01-01 00:00:00 2000-01-01 00:00:00
2000-01-03 00:00:00 2000-01-01 00:00:00
2008-09-17 02:02:18.003003 2006-01-01 00:00:00
2010-08-18 02:02:19.003003 2009-01-01 00:00:00
2013-03-19 02:02:20.003003 2012-01-01 00:00:00
2014-11-20 02:02:21.003003 2012-01-01 00:00:00
2016-02-21 02:02:22.003003 2015-01-01 00:00:00
2018-08-22 02:02:23.003003 2018-01-01 00:00:00
2019-01-23 02:02:24.003003 2018-01-01 00:00:00
2020-02-24 02:02:25.003003 2018-01-01 00:00:00
2022-07-25 02:02:26.003003 2021-01-01 00:00:00
2024-02-25 02:02:26.003003 2024-01-01 00:00:00
2032-09-25 02:02:26.003003 2030-01-01 00:00:00
infinity infinity
query II
select t, time_bucket(null::interval, t) from timestamps;
----
-infinity NULL
3000-01-02 (BC) 03:16:23.003003 NULL
1024-04-10 (BC) 12:35:40.003003 NULL
0044-06-15 (BC) 12:35:40.003003 NULL
0678-06-30 02:02:03.003003 NULL
0794-07-03 02:02:04.003003 NULL
1700-01-01 00:00:00 NULL
1962-12-31 00:00:00 NULL
1970-01-01 00:00:00 NULL
1985-12-07 02:02:08.003003 NULL
1989-10-18 02:02:09.003003 NULL
1990-01-21 02:02:10.003003 NULL
1991-02-10 02:02:11.003003 NULL
1992-09-11 02:02:12.003003 NULL
1994-12-26 02:02:13.003003 NULL
1997-05-13 02:02:14.003003 NULL
1999-02-14 02:02:15.003003 NULL
2000-01-01 00:00:00 NULL
2000-01-03 00:00:00 NULL
2008-09-17 02:02:18.003003 NULL
2010-08-18 02:02:19.003003 NULL
2013-03-19 02:02:20.003003 NULL
2014-11-20 02:02:21.003003 NULL
2016-02-21 02:02:22.003003 NULL
2018-08-22 02:02:23.003003 NULL
2019-01-23 02:02:24.003003 NULL
2020-02-24 02:02:25.003003 NULL
2022-07-25 02:02:26.003003 NULL
2024-02-25 02:02:26.003003 NULL
2032-09-25 02:02:26.003003 NULL
infinity NULL
query I
select time_bucket('3 years'::interval, null::timestamp) from timestamps;
----
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
query III
select w, t, time_bucket(w, t) from timestamps;
----
10 days -infinity -infinity
10 days 3000-01-02 (BC) 03:16:23.003003 3001-12-31 (BC) 00:00:00
2 months 1024-04-10 (BC) 12:35:40.003003 1024-03-01 (BC) 00:00:00
10 days 0044-06-15 (BC) 12:35:40.003003 0044-06-12 (BC) 00:00:00
00:00:00.000333 0678-06-30 02:02:03.003003 0678-06-30 02:02:03.002739
00:00:00.000333 0794-07-03 02:02:04.003003 0794-07-03 02:02:04.002819
00:00:00.000333 1700-01-01 00:00:00 1699-12-31 23:59:59.999937
00:00:00.333 1962-12-31 00:00:00 1962-12-30 23:59:59.838
00:00:00.333 1970-01-01 00:00:00 1969-12-31 23:59:59.739
00:00:00.333 1985-12-07 02:02:08.003003 1985-12-07 02:02:07.872
00:05:33 1989-10-18 02:02:09.003003 1989-10-18 01:58:21
00:05:33 1990-01-21 02:02:10.003003 1990-01-21 02:00:18
00:05:33 1991-02-10 02:02:11.003003 1991-02-10 02:00:54
05:33:00 1992-09-11 02:02:12.003003 1992-09-10 23:42:00
05:33:00 1994-12-26 02:02:13.003003 1994-12-25 22:57:00
05:33:00 1997-05-13 02:02:14.003003 1997-05-12 23:51:00
333:00:00 1999-02-14 02:02:15.003003 1999-02-04 00:00:00
333:00:00 2000-01-01 00:00:00 1999-12-20 03:00:00
333:00:00 2000-01-03 00:00:00 2000-01-03 00:00:00
10 days 2008-09-17 02:02:18.003003 2008-09-17 00:00:00
7 days 2010-08-18 02:02:19.003003 2010-08-16 00:00:00
10 days 2013-03-19 02:02:20.003003 2013-03-15 00:00:00
10 days 2014-11-20 02:02:21.003003 2014-11-15 00:00:00
2 months 2016-02-21 02:02:22.003003 2016-01-01 00:00:00
2 months 2018-08-22 02:02:23.003003 2018-07-01 00:00:00
2 months 2019-01-23 02:02:24.003003 2019-01-01 00:00:00
2 years 2020-02-24 02:02:25.003003 2020-01-01 00:00:00
2 years 2022-07-25 02:02:26.003003 2022-01-01 00:00:00
10 days 2024-02-25 02:02:26.003003 2024-02-16 00:00:00
10 days 2032-09-25 02:02:26.003003 2032-09-21 00:00:00
10 days infinity infinity
query II
select t, time_bucket('4 seconds'::interval, t, '2 seconds'::interval) from timestamps;
----
-infinity -infinity
3000-01-02 (BC) 03:16:23.003003 3000-01-02 (BC) 03:16:22
1024-04-10 (BC) 12:35:40.003003 1024-04-10 (BC) 12:35:38
0044-06-15 (BC) 12:35:40.003003 0044-06-15 (BC) 12:35:38
0678-06-30 02:02:03.003003 0678-06-30 02:02:02
0794-07-03 02:02:04.003003 0794-07-03 02:02:02
1700-01-01 00:00:00 1699-12-31 23:59:58
1962-12-31 00:00:00 1962-12-30 23:59:58
1970-01-01 00:00:00 1969-12-31 23:59:58
1985-12-07 02:02:08.003003 1985-12-07 02:02:06
1989-10-18 02:02:09.003003 1989-10-18 02:02:06
1990-01-21 02:02:10.003003 1990-01-21 02:02:10
1991-02-10 02:02:11.003003 1991-02-10 02:02:10
1992-09-11 02:02:12.003003 1992-09-11 02:02:10
1994-12-26 02:02:13.003003 1994-12-26 02:02:10
1997-05-13 02:02:14.003003 1997-05-13 02:02:14
1999-02-14 02:02:15.003003 1999-02-14 02:02:14
2000-01-01 00:00:00 1999-12-31 23:59:58
2000-01-03 00:00:00 2000-01-02 23:59:58
2008-09-17 02:02:18.003003 2008-09-17 02:02:18
2010-08-18 02:02:19.003003 2010-08-18 02:02:18
2013-03-19 02:02:20.003003 2013-03-19 02:02:18
2014-11-20 02:02:21.003003 2014-11-20 02:02:18
2016-02-21 02:02:22.003003 2016-02-21 02:02:22
2018-08-22 02:02:23.003003 2018-08-22 02:02:22
2019-01-23 02:02:24.003003 2019-01-23 02:02:22
2020-02-24 02:02:25.003003 2020-02-24 02:02:22
2022-07-25 02:02:26.003003 2022-07-25 02:02:26
2024-02-25 02:02:26.003003 2024-02-25 02:02:26
2032-09-25 02:02:26.003003 2032-09-25 02:02:26
infinity infinity
query II
select t, time_bucket('4 days'::interval, t, '6 hours'::interval) from timestamps;
----
-infinity -infinity
3000-01-02 (BC) 03:16:23.003003 3001-12-29 (BC) 06:00:00
1024-04-10 (BC) 12:35:40.003003 1024-04-08 (BC) 06:00:00
0044-06-15 (BC) 12:35:40.003003 0044-06-14 (BC) 06:00:00
0678-06-30 02:02:03.003003 0678-06-26 06:00:00
0794-07-03 02:02:04.003003 0794-06-30 06:00:00
1700-01-01 00:00:00 1699-12-30 06:00:00
1962-12-31 00:00:00 1962-12-28 06:00:00
1970-01-01 00:00:00 1969-12-31 06:00:00
1985-12-07 02:02:08.003003 1985-12-03 06:00:00
1989-10-18 02:02:09.003003 1989-10-15 06:00:00
1990-01-21 02:02:10.003003 1990-01-19 06:00:00
1991-02-10 02:02:11.003003 1991-02-07 06:00:00
1992-09-11 02:02:12.003003 1992-09-09 06:00:00
1994-12-26 02:02:13.003003 1994-12-24 06:00:00
1997-05-13 02:02:14.003003 1997-05-10 06:00:00
1999-02-14 02:02:15.003003 1999-02-13 06:00:00
2000-01-01 00:00:00 1999-12-30 06:00:00
2000-01-03 00:00:00 1999-12-30 06:00:00
2008-09-17 02:02:18.003003 2008-09-13 06:00:00
2010-08-18 02:02:19.003003 2010-08-14 06:00:00
2013-03-19 02:02:20.003003 2013-03-15 06:00:00
2014-11-20 02:02:21.003003 2014-11-17 06:00:00
2016-02-21 02:02:22.003003 2016-02-20 06:00:00
2018-08-22 02:02:23.003003 2018-08-20 06:00:00
2019-01-23 02:02:24.003003 2019-01-19 06:00:00
2020-02-24 02:02:25.003003 2020-02-23 06:00:00
2022-07-25 02:02:26.003003 2022-07-22 06:00:00
2024-02-25 02:02:26.003003 2024-02-22 06:00:00
2032-09-25 02:02:26.003003 2032-09-23 06:00:00
infinity infinity
query II
select t, time_bucket('3 months'::interval, t, '6 days 11 hours'::interval) from timestamps;
----
-infinity -infinity
3000-01-02 (BC) 03:16:23.003003 3001-10-07 (BC) 11:00:00
1024-04-10 (BC) 12:35:40.003003 1024-04-07 (BC) 11:00:00
0044-06-15 (BC) 12:35:40.003003 0044-04-07 (BC) 11:00:00
0678-06-30 02:02:03.003003 0678-04-07 11:00:00
0794-07-03 02:02:04.003003 0794-04-07 11:00:00
1700-01-01 00:00:00 1699-10-07 11:00:00
1962-12-31 00:00:00 1962-10-07 11:00:00
1970-01-01 00:00:00 1969-10-07 11:00:00
1985-12-07 02:02:08.003003 1985-10-07 11:00:00
1989-10-18 02:02:09.003003 1989-10-07 11:00:00
1990-01-21 02:02:10.003003 1990-01-07 11:00:00
1991-02-10 02:02:11.003003 1991-01-07 11:00:00
1992-09-11 02:02:12.003003 1992-07-07 11:00:00
1994-12-26 02:02:13.003003 1994-10-07 11:00:00
1997-05-13 02:02:14.003003 1997-04-07 11:00:00
1999-02-14 02:02:15.003003 1999-01-07 11:00:00
2000-01-01 00:00:00 1999-10-07 11:00:00
2000-01-03 00:00:00 1999-10-07 11:00:00
2008-09-17 02:02:18.003003 2008-07-07 11:00:00
2010-08-18 02:02:19.003003 2010-07-07 11:00:00
2013-03-19 02:02:20.003003 2013-01-07 11:00:00
2014-11-20 02:02:21.003003 2014-10-07 11:00:00
2016-02-21 02:02:22.003003 2016-01-07 11:00:00
2018-08-22 02:02:23.003003 2018-07-07 11:00:00
2019-01-23 02:02:24.003003 2019-01-07 11:00:00
2020-02-24 02:02:25.003003 2020-01-07 11:00:00
2022-07-25 02:02:26.003003 2022-07-07 11:00:00
2024-02-25 02:02:26.003003 2024-01-07 11:00:00
2032-09-25 02:02:26.003003 2032-07-07 11:00:00
infinity infinity
query II
select t, time_bucket(null::interval, t, '2 seconds'::interval) from timestamps;
----
-infinity NULL
3000-01-02 (BC) 03:16:23.003003 NULL
1024-04-10 (BC) 12:35:40.003003 NULL
0044-06-15 (BC) 12:35:40.003003 NULL
0678-06-30 02:02:03.003003 NULL
0794-07-03 02:02:04.003003 NULL
1700-01-01 00:00:00 NULL
1962-12-31 00:00:00 NULL
1970-01-01 00:00:00 NULL
1985-12-07 02:02:08.003003 NULL
1989-10-18 02:02:09.003003 NULL
1990-01-21 02:02:10.003003 NULL
1991-02-10 02:02:11.003003 NULL
1992-09-11 02:02:12.003003 NULL
1994-12-26 02:02:13.003003 NULL
1997-05-13 02:02:14.003003 NULL
1999-02-14 02:02:15.003003 NULL
2000-01-01 00:00:00 NULL
2000-01-03 00:00:00 NULL
2008-09-17 02:02:18.003003 NULL
2010-08-18 02:02:19.003003 NULL
2013-03-19 02:02:20.003003 NULL
2014-11-20 02:02:21.003003 NULL
2016-02-21 02:02:22.003003 NULL
2018-08-22 02:02:23.003003 NULL
2019-01-23 02:02:24.003003 NULL
2020-02-24 02:02:25.003003 NULL
2022-07-25 02:02:26.003003 NULL
2024-02-25 02:02:26.003003 NULL
2032-09-25 02:02:26.003003 NULL
infinity NULL
query I
select time_bucket('3 months'::interval, null::timestamp, '2 seconds'::interval) from timestamps;
----
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
query II
select t, time_bucket('3 months'::interval, t, null::interval) from timestamps;
----
-infinity NULL
3000-01-02 (BC) 03:16:23.003003 NULL
1024-04-10 (BC) 12:35:40.003003 NULL
0044-06-15 (BC) 12:35:40.003003 NULL
0678-06-30 02:02:03.003003 NULL
0794-07-03 02:02:04.003003 NULL
1700-01-01 00:00:00 NULL
1962-12-31 00:00:00 NULL
1970-01-01 00:00:00 NULL
1985-12-07 02:02:08.003003 NULL
1989-10-18 02:02:09.003003 NULL
1990-01-21 02:02:10.003003 NULL
1991-02-10 02:02:11.003003 NULL
1992-09-11 02:02:12.003003 NULL
1994-12-26 02:02:13.003003 NULL
1997-05-13 02:02:14.003003 NULL
1999-02-14 02:02:15.003003 NULL
2000-01-01 00:00:00 NULL
2000-01-03 00:00:00 NULL
2008-09-17 02:02:18.003003 NULL
2010-08-18 02:02:19.003003 NULL
2013-03-19 02:02:20.003003 NULL
2014-11-20 02:02:21.003003 NULL
2016-02-21 02:02:22.003003 NULL
2018-08-22 02:02:23.003003 NULL
2019-01-23 02:02:24.003003 NULL
2020-02-24 02:02:25.003003 NULL
2022-07-25 02:02:26.003003 NULL
2024-02-25 02:02:26.003003 NULL
2032-09-25 02:02:26.003003 NULL
infinity NULL
query IIII
select w, t, shift, time_bucket(w, t, shift) from timestamps;
----
10 days -infinity 00:00:00 -infinity
10 days 3000-01-02 (BC) 03:16:23.003003 3 days 3001-12-24 (BC) 00:00:00
2 months 1024-04-10 (BC) 12:35:40.003003 10 days 1024-03-11 (BC) 00:00:00
10 days 0044-06-15 (BC) 12:35:40.003003 6 days 0044-06-08 (BC) 00:00:00
00:00:00.000333 0678-06-30 02:02:03.003003 00:00:00 0678-06-30 02:02:03.002739
00:00:00.000333 0794-07-03 02:02:04.003003 00:00:00.000444 0794-07-03 02:02:04.00293
00:00:00.000333 1700-01-01 00:00:00 -00:00:00.000444 1699-12-31 23:59:59.999826
00:00:00.333 1962-12-31 00:00:00 00:00:00 1962-12-30 23:59:59.838
00:00:00.333 1970-01-01 00:00:00 00:00:00.444 1969-12-31 23:59:59.85
00:00:00.333 1985-12-07 02:02:08.003003 -00:00:00.444 1985-12-07 02:02:07.761
00:05:33 1989-10-18 02:02:09.003003 00:00:00 1989-10-18 01:58:21
00:05:33 1990-01-21 02:02:10.003003 00:07:24 1990-01-21 02:02:09
00:05:33 1991-02-10 02:02:11.003003 -00:07:24 1991-02-10 01:59:03
05:33:00 1992-09-11 02:02:12.003003 00:00:00 1992-09-10 23:42:00
05:33:00 1994-12-26 02:02:13.003003 07:24:00 1994-12-26 00:48:00
05:33:00 1997-05-13 02:02:14.003003 -07:24:00 1997-05-12 22:00:00
333:00:00 1999-02-14 02:02:15.003003 00:00:00 1999-02-04 00:00:00
333:00:00 2000-01-01 00:00:00 444:00:00 1999-12-24 18:00:00
333:00:00 2000-01-03 00:00:00 -444:00:00 1999-12-29 09:00:00
10 days 2008-09-17 02:02:18.003003 00:00:00 2008-09-17 00:00:00
7 days 2010-08-18 02:02:19.003003 00:00:00 2010-08-16 00:00:00
10 days 2013-03-19 02:02:20.003003 2 days 04:00:00 2013-03-17 04:00:00
10 days 2014-11-20 02:02:21.003003 -2 days 04:00:00 2014-11-13 04:00:00
2 months 2016-02-21 02:02:22.003003 00:00:00 2016-01-01 00:00:00
2 months 2018-08-22 02:02:23.003003 1 month 7 days 2018-08-08 00:00:00
2 months 2019-01-23 02:02:24.003003 -1 month 7 days 2018-12-08 00:00:00
2 years 2020-02-24 02:02:25.003003 6 months 2018-07-01 00:00:00
2 years 2022-07-25 02:02:26.003003 -6 months 2021-07-01 00:00:00
10 days 2024-02-25 02:02:26.003003 1 year 2024-02-21 00:00:00
10 days 2032-09-25 02:02:26.003003 -1 year 2032-09-16 00:00:00
10 days infinity 00:00:00 infinity
query II
select t, time_bucket('11 seconds'::interval, t, '1990-12-10 08:08:10'::timestamp) from timestamps;
----
-infinity -infinity
3000-01-02 (BC) 03:16:23.003003 3000-01-02 (BC) 03:16:19
1024-04-10 (BC) 12:35:40.003003 1024-04-10 (BC) 12:35:30
0044-06-15 (BC) 12:35:40.003003 0044-06-15 (BC) 12:35:37
0678-06-30 02:02:03.003003 0678-06-30 02:01:59
0794-07-03 02:02:04.003003 0794-07-03 02:01:54
1700-01-01 00:00:00 1699-12-31 23:59:53
1962-12-31 00:00:00 1962-12-30 23:59:56
1970-01-01 00:00:00 1969-12-31 23:59:53
1985-12-07 02:02:08.003003 1985-12-07 02:01:59
1989-10-18 02:02:09.003003 1989-10-18 02:02:03
1990-01-21 02:02:10.003003 1990-01-21 02:02:05
1991-02-10 02:02:11.003003 1991-02-10 02:02:05
1992-09-11 02:02:12.003003 1992-09-11 02:02:07
1994-12-26 02:02:13.003003 1994-12-26 02:02:07
1997-05-13 02:02:14.003003 1997-05-13 02:02:07
1999-02-14 02:02:15.003003 1999-02-14 02:02:05
2000-01-01 00:00:00 1999-12-31 23:59:58
2000-01-03 00:00:00 2000-01-02 23:59:57
2008-09-17 02:02:18.003003 2008-09-17 02:02:08
2010-08-18 02:02:19.003003 2010-08-18 02:02:10
2013-03-19 02:02:20.003003 2013-03-19 02:02:11
2014-11-20 02:02:21.003003 2014-11-20 02:02:19
2016-02-21 02:02:22.003003 2016-02-21 02:02:21
2018-08-22 02:02:23.003003 2018-08-22 02:02:21
2019-01-23 02:02:24.003003 2019-01-23 02:02:21
2020-02-24 02:02:25.003003 2020-02-24 02:02:15
2022-07-25 02:02:26.003003 2022-07-25 02:02:25
2024-02-25 02:02:26.003003 2024-02-25 02:02:21
2032-09-25 02:02:26.003003 2032-09-25 02:02:21
infinity infinity
query II
select t, time_bucket('11 days'::interval, t, '1990-01-06 08:08:10'::timestamp) from timestamps;
----
-infinity -infinity
3000-01-02 (BC) 03:16:23.003003 3001-12-27 (BC) 08:08:10
1024-04-10 (BC) 12:35:40.003003 1024-04-06 (BC) 08:08:10
0044-06-15 (BC) 12:35:40.003003 0044-06-14 (BC) 08:08:10
0678-06-30 02:02:03.003003 0678-06-25 08:08:10
0794-07-03 02:02:04.003003 0794-06-29 08:08:10
1700-01-01 00:00:00 1699-12-27 08:08:10
1962-12-31 00:00:00 1962-12-21 08:08:10
1970-01-01 00:00:00 1969-12-27 08:08:10
1985-12-07 02:02:08.003003 1985-12-02 08:08:10
1989-10-18 02:02:09.003003 1989-10-10 08:08:10
1990-01-21 02:02:10.003003 1990-01-17 08:08:10
1991-02-10 02:02:11.003003 1991-02-06 08:08:10
1992-09-11 02:02:12.003003 1992-08-31 08:08:10
1994-12-26 02:02:13.003003 1994-12-15 08:08:10
1997-05-13 02:02:14.003003 1997-05-02 08:08:10
1999-02-14 02:02:15.003003 1999-02-10 08:08:10
2000-01-01 00:00:00 1999-12-26 08:08:10
2000-01-03 00:00:00 1999-12-26 08:08:10
2008-09-17 02:02:18.003003 2008-09-08 08:08:10
2010-08-18 02:02:19.003003 2010-08-13 08:08:10
2013-03-19 02:02:20.003003 2013-03-16 08:08:10
2014-11-20 02:02:21.003003 2014-11-11 08:08:10
2016-02-21 02:02:22.003003 2016-02-16 08:08:10
2018-08-22 02:02:23.003003 2018-08-17 08:08:10
2019-01-23 02:02:24.003003 2019-01-18 08:08:10
2020-02-24 02:02:25.003003 2020-02-18 08:08:10
2022-07-25 02:02:26.003003 2022-07-17 08:08:10
2024-02-25 02:02:26.003003 2024-02-20 08:08:10
2032-09-25 02:02:26.003003 2032-09-20 08:08:10
infinity infinity
query II
select t, time_bucket('7 months'::interval, t, '1990-01-06 08:08:10'::timestamp) from timestamps;
----
-infinity -infinity
3000-01-02 (BC) 03:16:23.003003 3001-10-01 (BC) 00:00:00
1024-04-10 (BC) 12:35:40.003003 1024-02-01 (BC) 00:00:00
0044-06-15 (BC) 12:35:40.003003 0044-02-01 (BC) 00:00:00
0678-06-30 02:02:03.003003 0678-02-01 00:00:00
0794-07-03 02:02:04.003003 0794-03-01 00:00:00
1700-01-01 00:00:00 1699-07-01 00:00:00
1962-12-31 00:00:00 1962-08-01 00:00:00
1970-01-01 00:00:00 1969-08-01 00:00:00
1985-12-07 02:02:08.003003 1985-12-01 00:00:00
1989-10-18 02:02:09.003003 1989-06-01 00:00:00
1990-01-21 02:02:10.003003 1990-01-01 00:00:00
1991-02-10 02:02:11.003003 1990-08-01 00:00:00
1992-09-11 02:02:12.003003 1992-05-01 00:00:00
1994-12-26 02:02:13.003003 1994-09-01 00:00:00
1997-05-13 02:02:14.003003 1997-01-01 00:00:00
1999-02-14 02:02:15.003003 1998-10-01 00:00:00
2000-01-01 00:00:00 1999-12-01 00:00:00
2000-01-03 00:00:00 1999-12-01 00:00:00
2008-09-17 02:02:18.003003 2008-09-01 00:00:00
2010-08-18 02:02:19.003003 2010-06-01 00:00:00
2013-03-19 02:02:20.003003 2012-10-01 00:00:00
2014-11-20 02:02:21.003003 2014-07-01 00:00:00
2016-02-21 02:02:22.003003 2015-09-01 00:00:00
2018-08-22 02:02:23.003003 2018-08-01 00:00:00
2019-01-23 02:02:24.003003 2018-08-01 00:00:00
2020-02-24 02:02:25.003003 2019-10-01 00:00:00
2022-07-25 02:02:26.003003 2022-02-01 00:00:00
2024-02-25 02:02:26.003003 2023-11-01 00:00:00
2032-09-25 02:02:26.003003 2032-08-01 00:00:00
infinity infinity
query II
select t, time_bucket(null::interval, t, '1990-01-06 08:08:10'::timestamp) from timestamps;
----
-infinity NULL
3000-01-02 (BC) 03:16:23.003003 NULL
1024-04-10 (BC) 12:35:40.003003 NULL
0044-06-15 (BC) 12:35:40.003003 NULL
0678-06-30 02:02:03.003003 NULL
0794-07-03 02:02:04.003003 NULL
1700-01-01 00:00:00 NULL
1962-12-31 00:00:00 NULL
1970-01-01 00:00:00 NULL
1985-12-07 02:02:08.003003 NULL
1989-10-18 02:02:09.003003 NULL
1990-01-21 02:02:10.003003 NULL
1991-02-10 02:02:11.003003 NULL
1992-09-11 02:02:12.003003 NULL
1994-12-26 02:02:13.003003 NULL
1997-05-13 02:02:14.003003 NULL
1999-02-14 02:02:15.003003 NULL
2000-01-01 00:00:00 NULL
2000-01-03 00:00:00 NULL
2008-09-17 02:02:18.003003 NULL
2010-08-18 02:02:19.003003 NULL
2013-03-19 02:02:20.003003 NULL
2014-11-20 02:02:21.003003 NULL
2016-02-21 02:02:22.003003 NULL
2018-08-22 02:02:23.003003 NULL
2019-01-23 02:02:24.003003 NULL
2020-02-24 02:02:25.003003 NULL
2022-07-25 02:02:26.003003 NULL
2024-02-25 02:02:26.003003 NULL
2032-09-25 02:02:26.003003 NULL
infinity NULL
query I
select time_bucket('7 months'::interval, null::timestamp, '1990-01-06 08:08:10'::timestamp) from timestamps;
----
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
query II
select t, time_bucket('7 months'::interval, t, null::timestamp) from timestamps;
----
-infinity NULL
3000-01-02 (BC) 03:16:23.003003 NULL
1024-04-10 (BC) 12:35:40.003003 NULL
0044-06-15 (BC) 12:35:40.003003 NULL
0678-06-30 02:02:03.003003 NULL
0794-07-03 02:02:04.003003 NULL
1700-01-01 00:00:00 NULL
1962-12-31 00:00:00 NULL
1970-01-01 00:00:00 NULL
1985-12-07 02:02:08.003003 NULL
1989-10-18 02:02:09.003003 NULL
1990-01-21 02:02:10.003003 NULL
1991-02-10 02:02:11.003003 NULL
1992-09-11 02:02:12.003003 NULL
1994-12-26 02:02:13.003003 NULL
1997-05-13 02:02:14.003003 NULL
1999-02-14 02:02:15.003003 NULL
2000-01-01 00:00:00 NULL
2000-01-03 00:00:00 NULL
2008-09-17 02:02:18.003003 NULL
2010-08-18 02:02:19.003003 NULL
2013-03-19 02:02:20.003003 NULL
2014-11-20 02:02:21.003003 NULL
2016-02-21 02:02:22.003003 NULL
2018-08-22 02:02:23.003003 NULL
2019-01-23 02:02:24.003003 NULL
2020-02-24 02:02:25.003003 NULL
2022-07-25 02:02:26.003003 NULL
2024-02-25 02:02:26.003003 NULL
2032-09-25 02:02:26.003003 NULL
infinity NULL
query IIII
select w, t, origin, time_bucket(w, t, origin) from timestamps;
----
10 days -infinity 1970-01-05 00:00:00 -infinity
10 days 3000-01-02 (BC) 03:16:23.003003 3000-01-01 (BC) 00:00:00 3000-01-01 (BC) 00:00:00
2 months 1024-04-10 (BC) 12:35:40.003003 1024-03-01 (BC) 00:00:00 1024-03-01 (BC) 00:00:00
10 days 0044-06-15 (BC) 12:35:40.003003 0044-02-01 (BC) 00:00:00 0044-06-11 (BC) 00:00:00
00:00:00.000333 0678-06-30 02:02:03.003003 1970-02-10 00:00:00 0678-06-30 02:02:03.002793
00:00:00.000333 0794-07-03 02:02:04.003003 1970-10-17 00:05:05.006006 0794-07-03 02:02:04.002992
00:00:00.000333 1700-01-01 00:00:00 1970-09-27 00:05:05.006006 1699-12-31 23:59:59.999714
00:00:00.333 1962-12-31 00:00:00 1970-08-12 00:00:00 1962-12-30 23:59:59.919
00:00:00.333 1970-01-01 00:00:00 1970-06-23 00:05:05.006006 1969-12-31 23:59:59.807006
00:00:00.333 1985-12-07 02:02:08.003003 1970-01-05 00:05:05.006006 1985-12-07 02:02:07.724006
00:05:33 1989-10-18 02:02:09.003003 1970-09-07 00:00:00 1989-10-18 01:59:24
00:05:33 1990-01-21 02:02:10.003003 1970-07-06 00:05:05.006006 1990-01-21 02:01:11.006006
00:05:33 1991-02-10 02:02:11.003003 1970-10-09 00:05:05.006006 1991-02-10 01:59:50.006006
05:33:00 1992-09-11 02:02:12.003003 1970-04-10 00:00:00 1992-09-10 22:48:00
05:33:00 1994-12-26 02:02:13.003003 1970-03-05 00:05:05.006006 1994-12-25 23:56:05.006006
05:33:00 1997-05-13 02:02:14.003003 2000-01-03 00:00:00 1997-05-12 23:51:00
333:00:00 1999-02-14 02:02:15.003003 2000-01-01 00:00:00 1999-02-02 00:00:00
333:00:00 2000-01-01 00:00:00 1980-11-25 00:05:05.006006 1999-12-21 06:05:05.006006
333:00:00 2000-01-03 00:00:00 2045-01-05 00:05:05.006006 1999-12-31 03:05:05.006006
10 days 2008-09-17 02:02:18.003003 2009-11-05 00:00:00 2008-09-11 00:00:00
7 days 2010-08-18 02:02:19.003003 2100-09-05 00:00:00 2010-08-15 00:00:00
10 days 2013-03-19 02:02:20.003003 2300-10-07 00:05:05.006006 2013-03-15 00:05:05.006006
10 days 2014-11-20 02:02:21.003003 1970-12-07 00:05:05.006006 2014-11-16 00:05:05.006006
2 months 2016-02-21 02:02:22.003003 1970-09-05 00:00:00 2016-01-01 00:00:00
2 months 2018-08-22 02:02:23.003003 1970-07-01 00:05:05.006006 2018-07-01 00:00:00
2 months 2019-01-23 02:02:24.003003 1969-09-01 00:05:05.006006 2019-01-01 00:00:00
2 years 2020-02-24 02:02:25.003003 1970-02-13 00:05:05.006006 2020-02-01 00:00:00
2 years 2022-07-25 02:02:26.003003 1969-10-09 00:05:05.006006 2021-10-01 00:00:00
10 days 2024-02-25 02:02:26.003003 -infinity NULL
10 days 2032-09-25 02:02:26.003003 infinity NULL
10 days infinity 1970-01-01 00:00:00 infinity
statement error
select time_bucket('-3 hours'::interval, '2019-04-05 00:00:00'::timestamp);
----
statement error
select time_bucket('-3 hours'::interval, '2019-04-05 00:00:00'::timestamp, '1 hour 30 minutes':: interval);
----
statement error
select time_bucket('-3 hours'::interval, '2019-04-05 00:00:00'::timestamp, '2019-04-05 00:00:00'::timestamp);
----
statement error
select time_bucket('-1 month'::interval, '2019-04-05 00:00:00'::timestamp);
----
statement error
select time_bucket('-1 month'::interval, '2019-04-05 00:00:00'::timestamp, '1 hour 30 minutes':: interval);
----
statement error
select time_bucket('-1 month'::interval, '2019-04-05 00:00:00'::timestamp, '2018-04-05 00:00:00'::timestamp);
----
statement error
select time_bucket('1 day - 172800 seconds'::interval, '2018-05-05 00:00:00'::timestamp);
----
statement error
select time_bucket('1 day - 172800 seconds'::interval, '2018-05-05 00:00:00'::timestamp, '1 hour 30 minutes':: interval);
----
statement error
select time_bucket('1 day - 172800 seconds'::interval, '2018-05-05 00:00:00'::timestamp, '2018-05-05 00:00:00'::timestamp);
----
statement error
select time_bucket('1 month 1 day'::interval, '2018-05-05 00:00:00'::timestamp);
----
statement error
select time_bucket('1 month 1 day'::interval, '2018-05-05 00:00:00'::timestamp, '1 hour 30 minutes':: interval);
----
statement error
select time_bucket('1 month 1 day'::interval, '2018-05-05 00:00:00'::timestamp, '2018-05-05 00:00:00'::timestamp);
----
statement error
select time_bucket('3 days'::interval, '2019-05-05 00:00:00'::timestamp, '2000000000 months'::interval);
----
statement error
select time_bucket('3 days'::interval, '2019-05-05 00:00:00'::timestamp, '-2000000000 months'::interval);
----
statement error
select time_bucket('3 months'::interval, '2019-05-05 00:00:00'::timestamp, '2000000000 months'::interval);
----
statement error
select time_bucket('3 months'::interval, '2019-05-05 00:00:00'::timestamp, '-2000000000 months'::interval);
----
statement error
select time_bucket('1 microseconds'::interval, '290309-12-21 (BC) 23:59:59.999999'::timestamp);
----
query I
select time_bucket('1 microseconds'::interval, '290309-12-22 (BC) 00:00:00'::timestamp);
----
290309-12-22 (BC) 00:00:00
statement error
select time_bucket('1 microseconds'::interval, '294247-01-10 04:00:54.775807'::timestamp);
----
query I
select time_bucket('1 microseconds'::interval, '294247-01-10 04:00:54.775806'::timestamp);
----
294247-01-10 04:00:54.775806
query I
select time_bucket('1 month 1 day'::interval, null::timestamp);
----
NULL
query I
select time_bucket('1 month 1 day'::interval, null::timestamp, '6 days'::interval);
----
NULL
query I
select time_bucket('1 month 1 day'::interval, null::timestamp, '2022-12-20 10:00:00'::timestamp);
----
NULL
query I
select time_bucket('-1 month'::interval, null::timestamp);
----
NULL
query I
select time_bucket('-1 month'::interval, null::timestamp, '6 days'::interval);
----
NULL
query I
select time_bucket('-1 month'::interval, '2022-12-22 10:00:00'::timestamp, null::interval);
----
NULL
query I
select time_bucket('-1 month'::interval, null::timestamp, '2022-12-20 10:00:00'::timestamp);
----
NULL
query I
select time_bucket('-1 month'::interval, '2022-12-22'::timestamp, null::timestamp);
----
NULL

View File

@@ -0,0 +1,680 @@
# name: test/sql/function/timestamp/test_try_strptime.test
# description: Test try_strptime function
# group: [timestamp]
statement ok
PRAGMA enable_verification
query I
SELECT try_strptime('21 June, 2018', '%d %B, %Y')
----
2018-06-21 00:00:00
query I
SELECT try_strptime('21/10/2018', '%d/%m/%Y')
----
2018-10-21 00:00:00
query I
SELECT try_strptime('2018-20-10', '%Y-%d-%m')
----
2018-10-20 00:00:00
query I
SELECT try_strptime('20182010', '%Y%d%m')
----
2018-10-20 00:00:00
query I
SELECT try_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 try_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 try_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 try_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 try_strptime('Mon 30, December 30, 7:3:5 PM', '%a %d, %B %y, %I:%M:%S %p')
----
2030-12-30 19:03:05
# for try_strptime there is no difference between %- and %
query I
SELECT try_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 try_strptime('mon', '%a')
----
1900-01-01 00:00:00
query I
SELECT try_strptime('tuesday', '%A')
----
1900-01-01 00:00:00
query I
SELECT try_strptime('jun', '%b')
----
1900-06-01 00:00:00
# First Monday of Monday weeks is Jan 7
query I
SELECT try_strptime('1', '%W')
----
1900-01-01 00:00:00
# First Sunday of Sunday weeks is Jan 7
query I
SELECT try_strptime('1', '%U')
----
1900-01-07 00:00:00
# Default ISO year is 1900, which starts on a Monday
query I
SELECT try_strptime('1', '%V')
----
1900-01-01 00:00:00
query II
SELECT try_strptime('30', '%U'), strftime('1900-07-29'::DATE, '%U')
----
1900-07-29 00:00:00 30
query II
SELECT try_strptime('30', '%W'), strftime('1900-07-23'::DATE, '%W')
----
1900-07-23 00:00:00 30
query II
SELECT try_strptime('30', '%V'), strftime('1900-07-23'::DATE, '%V')
----
1900-07-23 00:00:00 30
# Ignored
query I
SELECT try_strptime('6', '%w')
----
1900-01-01 00:00:00
query I
SELECT try_strptime('6', '%u')
----
1900-01-01 00:00:00
# Thursday after 1st Sunday
query II
SELECT try_strptime('1-4', '%U-%w'), strftime('1900-01-11'::DATE, '%U-%w')
----
1900-01-11 00:00:00 01-4
query II
SELECT try_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 try_strptime('1-4', '%W-%w'), strftime('1900-01-04'::DATE, '%W-%w')
----
1900-01-04 00:00:00 01-4
query II
SELECT try_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 try_strptime('30', '%j'), strftime('1900-01-30'::DATE, '%-j')
----
1900-01-30 00:00:00 30
# day of year AND month
query I
SELECT try_strptime('1992-01-30 30', '%Y-%m-%d %j')
----
1992-01-30 00:00:00
# Year-Sunday Week-Weekday
query II
SELECT try_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 try_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 try_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 try_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, Monday Week 0, Friday
query II
SELECT try_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-ISO, Week 1, Friday
query II
SELECT try_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-Sunday Week-Weekday Mismatch should defer to the day
query I
SELECT try_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 try_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 try_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, try_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, try_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, try_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 try_strptime('', '')
----
statement error
SELECT try_strptime(NULL, '')
----
query I
SELECT try_strptime('', NULL)
----
NULL
# Spaces match multiple spaces (Issue #3418)
query I
SELECT try_strptime('Jun 30 2003 2:03:10AM', '%b %d %Y %-I:%M:%S%p');
----
2003-06-30 02:03:10
# UTC offset - produces TIMESTAMPTZ
query I
select try_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 try_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 try_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 try_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 try_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 try_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 try_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 try_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 try_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 try_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
# Don't swallow non-spaces
query I
SELECT try_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 try_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
query I
SELECT try_strptime('Mon Oct 17 2022 22:00:00 GMT+0000 (GMT)', '%a %b %d %Y %X GMT%z (%Z') as broken;
----
NULL
#
# Multiple patterns
#
query I
SELECT try_strptime('10/28/1910', ['%d-%m-%Y', '%m-%d-%Y', '%d/%m/%Y', '%m/%d/%Y'])
----
1910-10-28 00:00:00
query I
SELECT try_strptime('10.28.1910', ['%d-%m-%Y', '%m-%d-%Y', '%d/%m/%Y', '%m/%d/%Y'])
----
NULL
#
# Most errors for strptime produce NULLs
#
# incorrect usage
query I
select try_strptime('2020-12-31 21:25:58.745232+0', '%Y-%m-%d %H:%M:%S.%f%z');
----
NULL
query I
select try_strptime('2020-12-31 21:25:58.745232+0X', '%Y-%m-%d %H:%M:%S.%f%z');
----
NULL
query I
select try_strptime('2020-12-31 21:25:58.745232+X0', '%Y-%m-%d %H:%M:%S.%f%z');
----
NULL
query I
select try_strptime('2020-12-31 21:25:58.745232+000', '%Y-%m-%d %H:%M:%S.%f%z');
----
NULL
query I
select try_strptime('2020-12-31 21:25:58.745232X00', '%Y-%m-%d %H:%M:%S.%f%z');
----
NULL
# different errors
# month out of range
query I
SELECT try_strptime('2018-20-10', '%Y-%m-%d')
----
NULL
# day out of range
query I
SELECT try_strptime('2018-10-100', '%Y-%m-%d')
----
NULL
# year without century out of range
query I
SELECT try_strptime('969-10-10', '%y-%m-%d')
----
NULL
# literal part does not match
query I
SELECT try_strptime('2000/10/10', '%Y-%m-%d')
----
NULL
# incorrect date
query I
SELECT try_strptime('2001-02-30', '%Y-%m-%d')
----
NULL
# incorrect date
query I
SELECT try_strptime('2000-10-hello', '%Y-%m-%d')
----
NULL
# incorrect hour
query I
SELECT try_strptime('2000-10-01 24:00:00', '%Y-%m-%d %H:%M:%S')
----
NULL
# incorrect hour with 12 hour clock
query I
SELECT try_strptime('2000-10-01 00:00:00 AM', '%Y-%m-%d %I:%M:%S %p')
----
NULL
query I
SELECT try_strptime('2000-10-01 13:00:00 AM', '%Y-%m-%d %I:%M:%S %p')
----
NULL
# incorrect minute
query I
SELECT try_strptime('2000-10-01 23:60:00', '%Y-%m-%d %H:%M:%S')
----
NULL
# incorrect seconds
query I
SELECT try_strptime('2000-10-01 23:59:60', '%Y-%m-%d %H:%M:%S')
----
NULL
# incorrect microseconds
query I
SELECT try_strptime('2000-10-01 23:59:59.10000000', '%Y-%m-%d %H:%M:%S.%f')
----
NULL
# huge number
query I
SELECT try_strptime('2000-10-01 23:59:59.1000000000000000000000000000', '%Y-%m-%d %H:%M:%S.%f')
----
NULL
# empty string
query I
SELECT try_strptime('', '%Y-%m-%d %H:%M:%S.%f')
----
NULL
# empty string with am/pm
query I
SELECT try_strptime('', '%p')
----
NULL
query I
SELECT try_strptime('a', '%p')
----
NULL
# incorrect am/pm
query I
SELECT try_strptime('mp', '%p')
----
NULL
query I
SELECT try_strptime('pp', '%p')
----
NULL
query I
SELECT try_strptime('zm', '%p')
----
NULL
# incorrect abbreviated weekday name
query I
SELECT try_strptime('moa', '%a')
----
NULL
# incorrect weekday name
query I
SELECT try_strptime('moaday', '%A')
----
NULL
query I
SELECT try_strptime('mondayy', '%A')
----
NULL
# incorrect abbreviated month name
query I
SELECT try_strptime('juk', '%b')
----
NULL
# incorrect weekday name
query I
SELECT try_strptime('juke', '%B')
----
NULL
query I
SELECT try_strptime('junee', '%B')
----
NULL
# day of year out of range
query I
SELECT try_strptime('500', '%j')
----
NULL
query I
SELECT try_strptime('500', '%-j')
----
NULL
query I
SELECT try_strptime('0', '%j')
----
NULL
query I
SELECT try_strptime('0', '%-j')
----
NULL
# week numbers out of range
query I
SELECT try_strptime('60', '%U')
----
NULL
query I
SELECT try_strptime('60', '%W')
----
NULL
query I
SELECT try_strptime('60', '%V')
----
NULL
# weekday out of range
query I
SELECT try_strptime('9', '%w')
----
NULL
query I
SELECT try_strptime('9', '%u')
----
NULL
# Multiple offset types
query I
SELECT try_strptime('20 19', '%U %W')
----
NULL
query I
SELECT try_strptime('20 19', '%U %V')
----
NULL
query I
SELECT try_strptime('20 2021', '%U %G')
----
NULL
query I
SELECT try_strptime('20 19', '%U %j')
----
NULL
query I
SELECT try_strptime('20 19', '%W %U')
----
NULL
query I
SELECT try_strptime('20 19', '%W %V')
----
NULL
query I
SELECT try_strptime('20 2021', '%W %G')
----
NULL
query I
SELECT try_strptime('20 19', '%W %j')
----
NULL
query I
SELECT try_strptime('20 19', '%V %U')
----
NULL
query I
SELECT try_strptime('20 19', '%V %W')
----
NULL
query I
SELECT try_strptime('20 19', '%V %j')
----
NULL
query I
SELECT try_strptime('2021 19', '%G %U')
----
NULL
query I
SELECT try_strptime('2021 19', '%G %W')
----
NULL
query I
SELECT try_strptime('2021 19', '%G %j')
----
NULL
# Years override ISO offsets
query I
SELECT try_strptime('2021 1950', '%G %Y')
----
1950-01-01 00:00:00
query I
SELECT try_strptime('2021 1950', '%Y %G')
----
2021-01-01 00:00:00
query I
SELECT try_strptime('20 1950', '%V %Y')
----
1950-01-01 00:00:00
query I
SELECT try_strptime('2021 19', '%Y %V')
----
NULL
# AM/PM out of range
query I
SELECT try_strptime('Mon 30, December 30, 20:3:5 PM', '%a %d, %B %y, %H:%M:%S %p')
----
NULL
# microseconds out of range
query I
SELECT try_strptime('9999999', '%f')
----
NULL
# millisecond out of range
query I
SELECT try_strptime('9999', '%g')
----
NULL
# Invalid format strings are still errors
# unrecognized specifier
statement error
SELECT try_strptime('21/10/2018', '%-q/%m/%Y')
----
Invalid Input Error: Failed to parse format specifier
# Non-constant format strings are still errors
statement error
SELECT try_strptime('2000/10/10', random()::varchar)
----
Invalid Input Error: strptime format must be a constant