should be it
This commit is contained in:
182
external/duckdb/test/sql/function/timestamp/age.test
vendored
Normal file
182
external/duckdb/test/sql/function/timestamp/age.test
vendored
Normal 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
|
||||
69
external/duckdb/test/sql/function/timestamp/current_time.test
vendored
Normal file
69
external/duckdb/test/sql/function/timestamp/current_time.test
vendored
Normal 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
|
||||
36
external/duckdb/test/sql/function/timestamp/current_timestamp.test
vendored
Normal file
36
external/duckdb/test/sql/function/timestamp/current_timestamp.test
vendored
Normal 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
|
||||
388
external/duckdb/test/sql/function/timestamp/date_diff.test_slow
vendored
Normal file
388
external/duckdb/test/sql/function/timestamp/date_diff.test_slow
vendored
Normal 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;
|
||||
----
|
||||
614
external/duckdb/test/sql/function/timestamp/date_sub.test_slow
vendored
Normal file
614
external/duckdb/test/sql/function/timestamp/date_sub.test_slow
vendored
Normal 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;
|
||||
----
|
||||
56
external/duckdb/test/sql/function/timestamp/epoch.test
vendored
Normal file
56
external/duckdb/test/sql/function/timestamp/epoch.test
vendored
Normal 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
|
||||
315
external/duckdb/test/sql/function/timestamp/make_date.test
vendored
Normal file
315
external/duckdb/test/sql/function/timestamp/make_date.test
vendored
Normal 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
|
||||
66
external/duckdb/test/sql/function/timestamp/test_date_diff_epoch.test
vendored
Normal file
66
external/duckdb/test/sql/function/timestamp/test_date_diff_epoch.test
vendored
Normal 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
|
||||
959
external/duckdb/test/sql/function/timestamp/test_date_part.test
vendored
Normal file
959
external/duckdb/test/sql/function/timestamp/test_date_part.test
vendored
Normal 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
|
||||
120
external/duckdb/test/sql/function/timestamp/test_extract.test
vendored
Normal file
120
external/duckdb/test/sql/function/timestamp/test_extract.test
vendored
Normal 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
|
||||
|
||||
37
external/duckdb/test/sql/function/timestamp/test_extract_ms.test
vendored
Normal file
37
external/duckdb/test/sql/function/timestamp/test_extract_ms.test
vendored
Normal 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
|
||||
147
external/duckdb/test/sql/function/timestamp/test_icu_age.test
vendored
Normal file
147
external/duckdb/test/sql/function/timestamp/test_icu_age.test
vendored
Normal 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
|
||||
|
||||
576
external/duckdb/test/sql/function/timestamp/test_icu_dateadd.test
vendored
Normal file
576
external/duckdb/test/sql/function/timestamp/test_icu_dateadd.test
vendored
Normal 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
|
||||
145
external/duckdb/test/sql/function/timestamp/test_icu_datediff.test
vendored
Normal file
145
external/duckdb/test/sql/function/timestamp/test_icu_datediff.test
vendored
Normal 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
|
||||
822
external/duckdb/test/sql/function/timestamp/test_icu_datepart.test
vendored
Normal file
822
external/duckdb/test/sql/function/timestamp/test_icu_datepart.test
vendored
Normal 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
|
||||
301
external/duckdb/test/sql/function/timestamp/test_icu_datesub.test
vendored
Normal file
301
external/duckdb/test/sql/function/timestamp/test_icu_datesub.test
vendored
Normal 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
|
||||
248
external/duckdb/test/sql/function/timestamp/test_icu_datetrunc.test
vendored
Normal file
248
external/duckdb/test/sql/function/timestamp/test_icu_datetrunc.test
vendored
Normal 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
|
||||
407
external/duckdb/test/sql/function/timestamp/test_icu_makedate.test
vendored
Normal file
407
external/duckdb/test/sql/function/timestamp/test_icu_makedate.test
vendored
Normal 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
|
||||
306
external/duckdb/test/sql/function/timestamp/test_icu_strftime.test
vendored
Normal file
306
external/duckdb/test/sql/function/timestamp/test_icu_strftime.test
vendored
Normal 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');
|
||||
603
external/duckdb/test/sql/function/timestamp/test_icu_strptime.test
vendored
Normal file
603
external/duckdb/test/sql/function/timestamp/test_icu_strptime.test
vendored
Normal 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
|
||||
1369
external/duckdb/test/sql/function/timestamp/test_icu_time_bucket_timestamptz.test
vendored
Normal file
1369
external/duckdb/test/sql/function/timestamp/test_icu_time_bucket_timestamptz.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
25
external/duckdb/test/sql/function/timestamp/test_last_modified.test
vendored
Normal file
25
external/duckdb/test/sql/function/timestamp/test_last_modified.test
vendored
Normal 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
|
||||
29
external/duckdb/test/sql/function/timestamp/test_now.test
vendored
Normal file
29
external/duckdb/test/sql/function/timestamp/test_now.test
vendored
Normal 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
|
||||
|
||||
43
external/duckdb/test/sql/function/timestamp/test_now_prepared.test
vendored
Normal file
43
external/duckdb/test/sql/function/timestamp/test_now_prepared.test
vendored
Normal 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
|
||||
398
external/duckdb/test/sql/function/timestamp/test_strftime_timestamp.test
vendored
Normal file
398
external/duckdb/test/sql/function/timestamp/test_strftime_timestamp.test
vendored
Normal 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 - Locale’s 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 - Locale’s 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 - Locale’s 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 - Locale’s 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
|
||||
398
external/duckdb/test/sql/function/timestamp/test_strftime_timestamp_ns.test
vendored
Normal file
398
external/duckdb/test/sql/function/timestamp/test_strftime_timestamp_ns.test
vendored
Normal 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 - Locale’s 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 - Locale’s 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 - Locale’s 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 - Locale’s 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
|
||||
689
external/duckdb/test/sql/function/timestamp/test_strptime.test
vendored
Normal file
689
external/duckdb/test/sql/function/timestamp/test_strptime.test
vendored
Normal 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)
|
||||
----
|
||||
865
external/duckdb/test/sql/function/timestamp/test_time_bucket_timestamp.test
vendored
Normal file
865
external/duckdb/test/sql/function/timestamp/test_time_bucket_timestamp.test
vendored
Normal 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
|
||||
680
external/duckdb/test/sql/function/timestamp/test_try_strptime.test
vendored
Normal file
680
external/duckdb/test/sql/function/timestamp/test_try_strptime.test
vendored
Normal 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
|
||||
|
||||
Reference in New Issue
Block a user