Skip to content
Open
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
SELECT DATE_ADD('2026-05-07', INTERVAL 3 DAY);
DATE_ADD(2026-05-07, INTERVAL 3 day)
2026-05-10
SELECT DATE_ADD('2026-05-07', INTERVAL 3 HOUR);
DATE_ADD(2026-05-07, INTERVAL 3 hour)
2026-05-07 03:00:00
SELECT DATE_ADD('2026-05-07', INTERVAL 3 MINUTE);
DATE_ADD(2026-05-07, INTERVAL 3 minute)
2026-05-07 00:03:00
SELECT DATE_ADD('2026-05-07', INTERVAL 3 SECOND);
DATE_ADD(2026-05-07, INTERVAL 3 second)
2026-05-07 00:00:03
SELECT DATE_ADD('2026-05-07', INTERVAL 3 MONTH);
DATE_ADD(2026-05-07, INTERVAL 3 month)
2026-08-07
SELECT DATE_ADD('2026-05-07', INTERVAL 3 YEAR);
DATE_ADD(2026-05-07, INTERVAL 3 year)
2029-05-07
SELECT DATE_ADD('2026-05-07', INTERVAL 3 WEEK);
DATE_ADD(2026-05-07, INTERVAL 3 week)
2026-05-28
SELECT DATE_ADD('2026-05-07', INTERVAL 3 QUARTER);
DATE_ADD(2026-05-07, INTERVAL 3 quarter)
2027-02-07
SELECT DATE_SUB('2026-05-07', INTERVAL 5+1 DAY);
DATE_SUB(2026-05-07, INTERVAL 5 + 1 day)
2026-05-01
SELECT DATE_SUB('2026-05-07', INTERVAL 5-1 DAY);
DATE_SUB(2026-05-07, INTERVAL 5 - 1 day)
2026-05-03
SELECT DATE_SUB('2026-05-07', INTERVAL 2*3 DAY);
DATE_SUB(2026-05-07, INTERVAL 2 * 3 day)
2026-05-01
SELECT DATE_SUB('2026-05-07', INTERVAL 10/2 DAY);
DATE_SUB(2026-05-07, INTERVAL 10 / 2 day)
2026-05-02
SELECT DATE_SUB('2026-05-07', INTERVAL 10%3 DAY);
DATE_SUB(2026-05-07, INTERVAL 10 % 3 day)
2026-05-06
SELECT DATE_SUB('2026-05-07', INTERVAL 10 MOD 3 DAY);
DATE_SUB(2026-05-07, INTERVAL 10 % 3 day)
2026-05-06
SELECT DATE_SUB('2026-05-07', INTERVAL 10 DIV 3 DAY);
DATE_SUB(2026-05-07, INTERVAL 10 div 3 day)
2026-05-04
SELECT DATE_SUB('2026-05-07', INTERVAL -3 DAY);
DATE_SUB(2026-05-07, INTERVAL -3 day)
2026-05-10
SELECT DATE_ADD('2026-05-07', INTERVAL -3 DAY);
DATE_ADD(2026-05-07, INTERVAL -3 day)
2026-05-04
SELECT DATE_SUB('2026-05-07', INTERVAL (1+2)%3 DAY);
DATE_SUB(2026-05-07, INTERVAL +(1 + 2) % 3 day)
2026-05-07
SELECT DATE_SUB('2026-05-07', INTERVAL (DAYOFWEEK('2026-05-07')+5)%7 DAY);
DATE_SUB(2026-05-07, INTERVAL +(DAYOFWEEK(2026-05-07) + 5) % 7 day)
2026-05-04
SELECT DATE_SUB('2026-05-07', INTERVAL (DAYOFWEEK('2026-05-07')+5)%7+7 DAY);
DATE_SUB(2026-05-07, INTERVAL +(DAYOFWEEK(2026-05-07) + 5) % 7 + 7 day)
2026-04-27
SELECT DATE_ADD('2026-05-07', INTERVAL (3+4)%5 DAY);
DATE_ADD(2026-05-07, INTERVAL +(3 + 4) % 5 day)
2026-05-09
SELECT DATE_ADD('2026-05-07', INTERVAL 3%2+7%3 HOUR);
DATE_ADD(2026-05-07, INTERVAL 3 % 2 + 7 % 3 hour)
2026-05-07 02:00:00
SELECT DATE_SUB('2026-05-07', INTERVAL 10%3 HOUR);
DATE_SUB(2026-05-07, INTERVAL 10 % 3 hour)
2026-05-06 23:00:00
SELECT DATE_SUB('2026-05-07', INTERVAL 100%7 MINUTE);
DATE_SUB(2026-05-07, INTERVAL 100 % 7 minute)
2026-05-06 23:58:00
SELECT '2026-05-07' - INTERVAL 3 DAY;
2026-05-07 - INTERVAL 3 day
2026-05-04
SELECT '2026-05-07' + INTERVAL 3 DAY;
2026-05-07 + INTERVAL 3 day
2026-05-10
SELECT '2026-05-07' - INTERVAL 5+1 DAY;
2026-05-07 - INTERVAL 5 + 1 day
2026-05-01
SELECT '2026-05-07' + INTERVAL 2*3 DAY;
2026-05-07 + INTERVAL 2 * 3 day
2026-05-13
SELECT '2026-05-07' - INTERVAL (1+2)%3 DAY;
2026-05-07 - INTERVAL +(1 + 2) % 3 day
2026-05-07
SELECT '2026-05-07' + INTERVAL (3+4)%5 DAY;
2026-05-07 + INTERVAL +(3 + 4) % 5 day
2026-05-09
SELECT DATE_SUB('2026-05-07', INTERVAL ABS(-3) DAY);
DATE_SUB(2026-05-07, INTERVAL ABS(-3) day)
2026-05-04
SELECT DATE_ADD('2026-05-07', INTERVAL ABS(-5)%3 DAY);
DATE_ADD(2026-05-07, INTERVAL ABS(-5) % 3 day)
2026-05-09
drop table if exists t1;
create table t1(id int, d date, offset_days int);
insert into t1 values(1, '2026-05-07', 3),(2, '2026-05-07', 7),(3, '2026-05-07', 14);
select id, DATE_SUB(d, INTERVAL offset_days DAY) from t1;
id DATE_SUB(d, INTERVAL offset_days day)
1 2026-05-04
2 2026-04-30
3 2026-04-23
select id, DATE_ADD(d, INTERVAL offset_days DAY) from t1;
id DATE_ADD(d, INTERVAL offset_days day)
1 2026-05-10
2 2026-05-14
3 2026-05-21
drop table t1;
drop table if exists t1;
create table t1(id int, d date);
insert into t1 values(1, '2026-05-04'),(2, '2026-05-07'),(3, '2026-05-10'),(4, '2026-05-14');
select * from t1 where d >= DATE_SUB('2026-05-07', INTERVAL 3 DAY) and d <= DATE_ADD('2026-05-07', INTERVAL 3 DAY);
id d
1 2026-05-04
2 2026-05-07
3 2026-05-10
drop table t1;
SELECT DATE_SUB('2026-05-07', INTERVAL (DAYOFWEEK('2026-05-07')+5)%7 DAY) as this_week_start;
this_week_start
2026-05-04
SELECT DATE_SUB('2026-05-07', INTERVAL (DAYOFWEEK('2026-05-07')+5)%7+7 DAY) as last_week_start;
last_week_start
2026-04-27
drop table if exists events;
create table events(id int, event_date date, val int);
insert into events values(1,'2026-05-05',10),(2,'2026-05-06',20),(3,'2026-05-07',30);
insert into events values(4,'2026-04-28',40),(5,'2026-04-29',50),(6,'2026-04-30',60);
insert into events values(7,'2026-04-21',70);
select
sum(case when event_date >= DATE_SUB('2026-05-07', INTERVAL (DAYOFWEEK('2026-05-07')+5)%7 DAY) then val else 0 end) as this_week_sum,
sum(case when event_date >= DATE_SUB('2026-05-07', INTERVAL (DAYOFWEEK('2026-05-07')+5)%7+7 DAY)
and event_date < DATE_SUB('2026-05-07', INTERVAL (DAYOFWEEK('2026-05-07')+5)%7 DAY) then val else 0 end) as last_week_sum
from events;
this_week_sum last_week_sum
60 150
drop table events;
drop table if exists t1;
create table t1(id int, dt datetime, ts timestamp);
insert into t1 values(1, '2026-05-07 10:00:00', '2026-05-07 10:00:00');
select DATE_ADD(dt, INTERVAL 2 HOUR), DATE_SUB(ts, INTERVAL 30 MINUTE) from t1;
DATE_ADD(dt, INTERVAL 2 hour) DATE_SUB(ts, INTERVAL 30 minute)
2026-05-07 12:00:00 2026-05-07 09:30:00
select DATE_ADD(dt, INTERVAL 10%3 HOUR), DATE_SUB(ts, INTERVAL (2+1)%2 HOUR) from t1;
DATE_ADD(dt, INTERVAL 10 % 3 hour) DATE_SUB(ts, INTERVAL +(2 + 1) % 2 hour)
2026-05-07 11:00:00 2026-05-07 09:00:00
drop table t1;
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
-- DATE_ADD/DATE_SUB with various INTERVAL units
SELECT DATE_ADD('2026-05-07', INTERVAL 3 DAY);
SELECT DATE_ADD('2026-05-07', INTERVAL 3 HOUR);
SELECT DATE_ADD('2026-05-07', INTERVAL 3 MINUTE);
SELECT DATE_ADD('2026-05-07', INTERVAL 3 SECOND);
SELECT DATE_ADD('2026-05-07', INTERVAL 3 MONTH);
SELECT DATE_ADD('2026-05-07', INTERVAL 3 YEAR);
SELECT DATE_ADD('2026-05-07', INTERVAL 3 WEEK);
SELECT DATE_ADD('2026-05-07', INTERVAL 3 QUARTER);

-- DATE_SUB with simple arithmetic in INTERVAL
SELECT DATE_SUB('2026-05-07', INTERVAL 5+1 DAY);
SELECT DATE_SUB('2026-05-07', INTERVAL 5-1 DAY);
SELECT DATE_SUB('2026-05-07', INTERVAL 2*3 DAY);
SELECT DATE_SUB('2026-05-07', INTERVAL 10/2 DAY);
SELECT DATE_SUB('2026-05-07', INTERVAL 10%3 DAY);
SELECT DATE_SUB('2026-05-07', INTERVAL 10 MOD 3 DAY);
SELECT DATE_SUB('2026-05-07', INTERVAL 10 DIV 3 DAY);

-- Negative interval
SELECT DATE_SUB('2026-05-07', INTERVAL -3 DAY);
SELECT DATE_ADD('2026-05-07', INTERVAL -3 DAY);

-- (expr) % N pattern (issue #24235 original case)
SELECT DATE_SUB('2026-05-07', INTERVAL (1+2)%3 DAY);
SELECT DATE_SUB('2026-05-07', INTERVAL (DAYOFWEEK('2026-05-07')+5)%7 DAY);
SELECT DATE_SUB('2026-05-07', INTERVAL (DAYOFWEEK('2026-05-07')+5)%7+7 DAY);
SELECT DATE_ADD('2026-05-07', INTERVAL (3+4)%5 DAY);
SELECT DATE_ADD('2026-05-07', INTERVAL 3%2+7%3 HOUR);

-- Mixed arithmetic with modulo in different units
SELECT DATE_SUB('2026-05-07', INTERVAL 10%3 HOUR);
SELECT DATE_SUB('2026-05-07', INTERVAL 100%7 MINUTE);

-- date +/- INTERVAL syntax
SELECT '2026-05-07' - INTERVAL 3 DAY;
SELECT '2026-05-07' + INTERVAL 3 DAY;
SELECT '2026-05-07' - INTERVAL 5+1 DAY;
SELECT '2026-05-07' + INTERVAL 2*3 DAY;
SELECT '2026-05-07' - INTERVAL (1+2)%3 DAY;
SELECT '2026-05-07' + INTERVAL (3+4)%5 DAY;

-- INTERVAL with function call as operand
SELECT DATE_SUB('2026-05-07', INTERVAL ABS(-3) DAY);
SELECT DATE_ADD('2026-05-07', INTERVAL ABS(-5)%3 DAY);

-- INTERVAL with table
drop table if exists t1;
create table t1(id int, d date, offset_days int);
insert into t1 values(1, '2026-05-07', 3),(2, '2026-05-07', 7),(3, '2026-05-07', 14);
select id, DATE_SUB(d, INTERVAL offset_days DAY) from t1;
select id, DATE_ADD(d, INTERVAL offset_days DAY) from t1;
drop table t1;

-- INTERVAL in WHERE clause
drop table if exists t1;
create table t1(id int, d date);
insert into t1 values(1, '2026-05-04'),(2, '2026-05-07'),(3, '2026-05-10'),(4, '2026-05-14');
select * from t1 where d >= DATE_SUB('2026-05-07', INTERVAL 3 DAY) and d <= DATE_ADD('2026-05-07', INTERVAL 3 DAY);
drop table t1;

-- NL2SQL typical pattern: current week calculation using DAYOFWEEK + modulo
SELECT DATE_SUB('2026-05-07', INTERVAL (DAYOFWEEK('2026-05-07')+5)%7 DAY) as this_week_start;
SELECT DATE_SUB('2026-05-07', INTERVAL (DAYOFWEEK('2026-05-07')+5)%7+7 DAY) as last_week_start;

-- Full NL2SQL pattern: this week vs last week with table
drop table if exists events;
create table events(id int, event_date date, val int);
insert into events values(1,'2026-05-05',10),(2,'2026-05-06',20),(3,'2026-05-07',30);
insert into events values(4,'2026-04-28',40),(5,'2026-04-29',50),(6,'2026-04-30',60);
insert into events values(7,'2026-04-21',70);
select
sum(case when event_date >= DATE_SUB('2026-05-07', INTERVAL (DAYOFWEEK('2026-05-07')+5)%7 DAY) then val else 0 end) as this_week_sum,
sum(case when event_date >= DATE_SUB('2026-05-07', INTERVAL (DAYOFWEEK('2026-05-07')+5)%7+7 DAY)
and event_date < DATE_SUB('2026-05-07', INTERVAL (DAYOFWEEK('2026-05-07')+5)%7 DAY) then val else 0 end) as last_week_sum
from events;
drop table events;

-- INTERVAL with various date types
drop table if exists t1;
create table t1(id int, dt datetime, ts timestamp);
insert into t1 values(1, '2026-05-07 10:00:00', '2026-05-07 10:00:00');
select DATE_ADD(dt, INTERVAL 2 HOUR), DATE_SUB(ts, INTERVAL 30 MINUTE) from t1;
select DATE_ADD(dt, INTERVAL 10%3 HOUR), DATE_SUB(ts, INTERVAL (2+1)%2 HOUR) from t1;
drop table t1;
Loading
Loading