github.com/matrixorigin/matrixone@v0.7.0/test/distributed/cases/function/func_datetime_date_add.test (about) 1 #隐式调用 2 SELECT CAST('2006-09-26' AS DATE) + INTERVAL 1 DAY; 3 SELECT CAST('2006-09-26' AS DATE) + INTERVAL 1 MONTH; 4 SELECT CAST('2006-09-26' AS DATE) + INTERVAL 1 YEAR; 5 SELECT CAST('2006-09-26' AS DATE) + INTERVAL 1 WEEK; 6 7 8 9 create table t1 (a int, b varchar(10)); 10 insert into t1 values (1, '2001-01-01'),(2, '2002-02-02'); 11 select '2007-01-01' + interval a day from t1; 12 select b + interval a day from t1; 13 drop table t1; 14 15 16 #SELECT, 不同数据类型,EXTREME VALUE 17 18 SELECT ADDDATE(DATE'2021-01-01', INTERVAL 1 DAY); 19 SELECT ADDDATE(DATE'2021-01-01', INTERVAL 1 HOUR); 20 SELECT ADDDATE(TIMESTAMP'2021-01-01 00:00:00', INTERVAL 1 DAY); 21 SELECT ADDDATE(TIMESTAMP'2021-01-01 00:00:00', INTERVAL 1 HOUR); 22 SELECT '2021-01-01 00:00:00' + INTERVAL '1' DAY AS is_tomorrow, DATE(ts) 23 FROM (SELECT ADDDATE(DATE'2000-01-01', INTERVAL 1 DAY) AS ts) AS dt; 24 25 SELECT ADDDATE(TIME'00:00:00', INTERVAL 1 HOUR); 26 SELECT ADDDATE('2021-01-01', INTERVAL 1 DAY); 27 SELECT ADDDATE('2021-01-01', INTERVAL 1 HOUR); 28 SELECT ADDDATE('2021-01-01 00:00:00', INTERVAL 1 DAY); 29 SELECT ADDDATE('2021-01-01 00:00:00', INTERVAL 1 HOUR); 30 SELECT ADDDATE('00:00:00', INTERVAL 1 DAY); 31 SELECT ADDDATE('00:00:00', INTERVAL 1 HOUR); 32 33 select date_add("1997-12-31 23:59:59",INTERVAL 1 SECOND); 34 select date_add("1997-12-31 23:59:59",INTERVAL 1 MINUTE); 35 select date_add("1997-12-31 23:59:59",INTERVAL 1 HOUR); 36 select date_add("1997-12-31 23:59:59",INTERVAL 1 DAY); 37 select date_add("1997-12-31 23:59:59",INTERVAL 1 MONTH); 38 select date_add("1997-12-31 23:59:59",INTERVAL 1 YEAR); 39 select date_add("1997-12-31 23:59:59",INTERVAL "1:1" MINUTE_SECOND); 40 select date_add("1997-12-31 23:59:59",INTERVAL "1:1" HOUR_MINUTE); 41 select date_add("1997-12-31 23:59:59",INTERVAL "1:1" DAY_HOUR); 42 select date_add("1997-12-31 23:59:59",INTERVAL "1 1" YEAR_MONTH); 43 select date_add("1997-12-31 23:59:59",INTERVAL "1:1:1" HOUR_SECOND); 44 select date_add("1997-12-31 23:59:59",INTERVAL "1 1:1" DAY_MINUTE); 45 select date_add("1997-12-31 23:59:59",INTERVAL "1 1:1:1" DAY_SECOND); 46 select date_add("1997-12-31 23:59:59",INTERVAL 100000 SECOND); 47 select date_add("1997-12-31 23:59:59",INTERVAL -100000 MINUTE); 48 select date_add("1997-12-31 23:59:59",INTERVAL 100000 HOUR); 49 select date_add("1997-12-31 23:59:59",INTERVAL -100000 DAY); 50 select date_add("1997-12-31 23:59:59",INTERVAL 100000 MONTH); 51 select date_add("1997-12-31 23:59:59",INTERVAL -100000 YEAR); 52 select date_add("1997-12-31 23:59:59",INTERVAL "10000:1" MINUTE_SECOND); 53 54 55 select date_add("1997-12-31 23:59:59",INTERVAL "-10000:1" HOUR_MINUTE); 56 57 58 select date_add("1997-12-31 23:59:59",INTERVAL "10000:1" DAY_HOUR); 59 60 select date_add("1997-12-31 23:59:59",INTERVAL "-100 1" YEAR_MONTH); 61 62 63 select date_add("1997-12-31 23:59:59",INTERVAL "10000:99:99" HOUR_SECOND); 64 65 66 select date_add("1997-12-31 23:59:59",INTERVAL " -10000 99:99" DAY_MINUTE); 67 68 69 select date_add("1997-12-31 23:59:59",INTERVAL "10000 99:99:99" DAY_SECOND); 70 select date_add("1997-12-31",INTERVAL 1 SECOND); 71 select date_add("1997-12-31",INTERVAL 1 DAY); 72 select date_add(NULL,INTERVAL 100000 SECOND); 73 select date_add("1997-12-31 23:59:59",INTERVAL NULL SECOND); 74 select date_add("1997-12-31 23:59:59",INTERVAL NULL MINUTE_SECOND); 75 select date_add("9999-12-31 23:59:59",INTERVAL 1 SECOND); 76 select date_add('1998-01-30',Interval 1 month); 77 select date_add('1998-01-30',Interval '2:1' year_month); 78 select date_add('1996-02-29',Interval '1' year); 79 select date_add("1997-12-31",INTERVAL 1 SECOND); 80 select date_add("1997-12-31",INTERVAL "1 1" YEAR_MONTH); 81 82 #函数嵌套 83 -- @bvt:issue#3203 84 SELECT DATE_ADD(to_date('9999-12-30 23:59:00','%Y-%m-%d %H:%i:%s'), INTERVAL 1 MINUTE); 85 -- @bvt:issue 86 87 88 SELECT extract(week from DATE_ADD('2020-12-30 23:59:00', INTERVAL 1 year)); 89 90 91 #不同数据类型 92 CREATE TABLE t1 (datetime datetime, timestamp timestamp, date date); 93 INSERT INTO t1 values ("2001-01-02 03:04:05", "2002-01-02 03:04:05", "2003-01-02"); 94 select date_add(datetime, INTERVAL 1 SECOND) from t1; 95 select date_add(datetime, INTERVAL 1 YEAR) from t1; 96 select date_add(date,INTERVAL 1 SECOND) from t1; 97 select date_add(date,INTERVAL 1 MINUTE) from t1; 98 select date_add(date,INTERVAL 1 HOUR) from t1; 99 select date_add(date,INTERVAL 1 DAY) from t1; 100 select date_add(date,INTERVAL 1 MONTH) from t1; 101 select date_add(date,INTERVAL 1 YEAR) from t1; 102 select date_add(date,INTERVAL "1:1" MINUTE_SECOND) from t1; 103 select date_add(date,INTERVAL "1:1" HOUR_MINUTE) from t1; 104 select date_add(date,INTERVAL "1:1" DAY_HOUR) from t1; 105 select date_add(date,INTERVAL "1 1" YEAR_MONTH) from t1; 106 select date_add(date,INTERVAL "1:1:1" HOUR_SECOND) from t1; 107 select date_add(date,INTERVAL "1 1:1" DAY_MINUTE) from t1; 108 select date_add(date,INTERVAL "1 1:1:1" DAY_SECOND) from t1; 109 select date_add(date,INTERVAL "1" WEEK) from t1; 110 select date_add(date,INTERVAL "1" QUARTER) from t1; 111 drop table t1; 112 113 114 #0.5 doesn't support time 115 #CREATE TABLE t1(time time); 116 #INSERT INTO t1 values ("06:07:08"); 117 #select date_add(time,INTERVAL 1 SECOND) from t1; 118 #drop table t1; 119 120 121 #EXTREME VALUE 122 select DATE_ADD('20071108181000', INTERVAL 1 DAY); 123 124 125 select DATE_ADD(20071108181000, INTERVAL 1 DAY); 126 127 select DATE_ADD('20071108', INTERVAL 1 DAY); 128 129 130 select DATE_ADD(20071108, INTERVAL 1 DAY); 131 132 select date_add('1000-01-01 00:00:00', interval '1.03:02:01.05' day_microsecond); 133 134 135 select date_add('1000-01-01 00:00:00', interval '1.02' day_microsecond); 136 137 138 select date_add("0199-12-31 23:59:59",INTERVAL 2 SECOND); 139 select date_add("2001-01-01 23:59:59",INTERVAL -2000 YEAR); 140 141 #EXTREME VALUE 142 143 144 SELECT 145 date_add('1995-01-05', INTERVAL '9223372036854775807-02' YEAR_MONTH) as result; 146 SELECT 147 date_add('1995-01-05', INTERVAL '9223372036854775808-02' YEAR_MONTH) as result; 148 SELECT 149 date_add('1995-01-05', INTERVAL '9223372036854775808-02' DAY) as result; 150 SELECT 151 date_add('1995-01-05', INTERVAL '9223372036854775808-02' WEEK) as result; 152 SELECT 153 date_add('1995-01-05', INTERVAL '9223372036854775808-02' SECOND) as result; 154 SELECT 155 date_add('1995-01-05', INTERVAL '9223372036854775700-02' YEAR_MONTH) as result; 156 157 SELECT 158 date_add('1995-01-05', INTERVAL 9223372036854775806 SECOND) as result; 159 SELECT 160 date_add('1995-01-05', INTERVAL 9223372036854775806 MINUTE) as result; 161 SELECT 162 date_add('1995-01-05', INTERVAL 9223372036854775806 HOUR) as result; 163 SELECT 164 date_add('1995-01-05', INTERVAL -9223372036854775806 SECOND) as result; 165 SELECT 166 date_add('1995-01-05', INTERVAL -9223372036854775806 MINUTE) as result; 167 SELECT 168 date_add('1995-01-05', INTERVAL -9223372036854775806 HOUR) as result; 169 170 #NULL 171 select date_add("2001-01-01 23:59:59",null); 172 select date_add(null, null); 173 drop table if exists t1; 174 create table t1 (a int, b date); 175 insert into t1 values(1, "2010-10-30"), (2, NULL); 176 select * from t1; 177 select date_add(b, interval 1 day) from t1; 178 drop table t1; 179 180 #INSERT 181 create table t1 (a date); 182 insert into t1 select (DATE_ADD('20071108', INTERVAL 1 DAY)); 183 insert into t1 select (date_add('1998-01-30',Interval 1 month)); 184 select distinct a from t1; 185 drop table t1; 186 187 #WHERE & 逻辑运算 188 189 drop table if exists t1; 190 create table t1(a INT, b date); 191 insert into t1 values(1, "2012-10-12"),(2, "2004-04-24"),(3, "2008-12-04"),(4, "2012-03-23"); 192 select * from t1 where date_add(b, INTERVAL 1 day)="2012-10-13"; 193 drop table t1; 194 195 196 #WHERE & 逻辑运算 197 drop table if exists t1; 198 drop table if exists t2; 199 create table t1(a INT, b date); 200 create table t2(a INT, b date); 201 insert into t1 values(1, "2012-10-11"),(2, "2004-04-24"),(3, "2008-12-04"),(4, "2012-03-23"); 202 insert into t2 values(1, "2011-10-12"),(2, "1994-10-04"),(3, "2018-06-04"),(4, "2012-10-12"); 203 SELECT t1.a, t2.a FROM t1 JOIN t2 ON (date_add(t1.b, INTERVAL 1 day) = date_add(t2.b, INTERVAL 1 year)); 204 drop table t1; 205 drop table t2; 206 207 208 209 #HAVING & 算术运算 210 211 212 drop table if exists t1; 213 create table t1(a INT, b datetime); 214 insert into t1 values(1, "2017-06-15 09:34:21"),(1, "2019-06-25 10:12:21"),(2, "2019-06-25 18:20:49"),(3, "2019-06-25 18:20:49"); 215 select b from t1 group by b having (date_add(t1.b, INTERVAL 1 day)-date_add(t1.b, INTERVAL 1 hour))>10; 216 drop table t1; 217 218 SELECT 219 DATE_SUB('2007-08-03', INTERVAL 1 MINUTE) AS field_str1, 220 DATE_SUB('2007-08-03 17:33:00', INTERVAL 1 MINUTE) AS field1_str2, 221 DATE_SUB(DATE('2007-08-03'), INTERVAL 1 DAY) AS field_date, 222 DATE_SUB(CAST('2007-08-03 17:33:00' AS DATETIME), INTERVAL 1 MINUTE) AS field_datetime; 223 224 SELECT 225 OCT(DATE_SUB('2007-08-03', INTERVAL 1 MINUTE)) AS field_str1, 226 OCT(DATE_SUB('2007-08-03 17:33:00', INTERVAL 1 MINUTE)) AS field1_str2, 227 OCT(DATE_SUB(DATE('2007-08-03'), INTERVAL 1 DAY)) AS field_date, 228 OCT(DATE_SUB(CAST('2007-08-03 17:33:00' AS DATETIME), INTERVAL 1 MINUTE)) AS field_datetime; 229 230 231 select date_sub("1998-01-01 00:00:00.000001",INTERVAL "1 1:1:1.000002" DAY_MICROSECOND); 232 select date_sub("1998-01-01 00:00:00.000001",INTERVAL "1:1:1.000002" HOUR_MICROSECOND); 233 select date_sub("1998-01-01 00:00:00.000001",INTERVAL "1:1.000002" MINUTE_MICROSECOND); 234 select date_sub("1998-01-01 00:00:00.000001",INTERVAL "1.000002" SECOND_MICROSECOND); 235 select date_sub("1998-01-01 00:00:00.000001",INTERVAL "000002" MICROSECOND); 236 select date_sub("1998-01-01 00:00:00",INTERVAL 1 SECOND); 237 select date_sub("1998-01-01 00:00:00",INTERVAL 1 MINUTE); 238 select date_sub("1998-01-01 00:00:00",INTERVAL 1 HOUR); 239 select date_sub("1998-01-01 00:00:00",INTERVAL 1 DAY); 240 select date_sub("1998-01-01 00:00:00",INTERVAL 1 MONTH); 241 select date_sub("1998-01-01 00:00:00",INTERVAL 1 YEAR); 242 select date_sub("1998-01-01 00:00:00",INTERVAL "1:1" MINUTE_SECOND); 243 select date_sub("1998-01-01 00:00:00",INTERVAL "1:1" HOUR_MINUTE); 244 select date_sub("1998-01-01 00:00:00",INTERVAL "1:1" DAY_HOUR); 245 select date_sub("1998-01-01 00:00:00",INTERVAL "1 1" YEAR_MONTH); 246 select date_sub("1998-01-01 00:00:00",INTERVAL "1:1:1" HOUR_SECOND); 247 select date_sub("1998-01-01 00:00:00",INTERVAL "1 1:1" DAY_MINUTE); 248 select date_sub("1998-01-01 00:00:00",INTERVAL "1 1:1:1" DAY_SECOND); 249 select date_sub("0050-01-01 00:00:01",INTERVAL 2 SECOND); 250 select date_sub("0199-01-01 00:00:01",INTERVAL 2 SECOND); 251 select date_add("0199-12-31 23:59:59",INTERVAL 2 SECOND); 252 select date_sub("0200-01-01 00:00:01",INTERVAL 2 SECOND); 253 select date_sub("0200-01-01 00:00:01",INTERVAL 1 SECOND); 254 select date_sub("0200-01-01 00:00:01",INTERVAL 2 SECOND); 255 select date_add("2001-01-01 23:59:59",INTERVAL -2000 YEAR); 256 257 -- @bvt:issue#3319 258 select date_sub("50-01-01 00:00:01",INTERVAL 2 SECOND); 259 select date_sub("90-01-01 00:00:01",INTERVAL 2 SECOND); 260 -- @bvt:issue 261 262 select date_sub("0069-01-01 00:00:01",INTERVAL 2 SECOND); 263 select date_sub("0169-01-01 00:00:01",INTERVAL 2 SECOND); 264 265 select DATE_SUB(NOW(), INTERVAL 9999 YEAR); 266 267 268 CREATE TABLE t1 (a DATETIME(6)); 269 INSERT INTO t1 VALUES ('1000-01-01 01:00:00.000000'); 270 INSERT INTO t1 VALUES ('1000-01-01 01:00:00.000001'); 271 INSERT INTO t1 VALUES ('2001-01-01 00:00:00.000000'); 272 INSERT INTO t1 VALUES ('2001-01-01 00:00:00.000001'); 273 INSERT INTO t1 VALUES ('2001-01-01 01:00:00.000000'); 274 INSERT INTO t1 VALUES ('2001-01-01 01:00:00.000001'); 275 SELECT DATE_SUB(a, INTERVAL 1 MINUTE) FROM t1 ORDER BY a; 276 SELECT a, DATE_SUB(a, INTERVAL 1.1 SECOND) FROM t1 ORDER BY a; 277 SELECT a, DATE_SUB(a, INTERVAL 1.000009 SECOND) FROM t1 ORDER BY a; 278 SELECT a, DATE_SUB(a, INTERVAL -0.1 SECOND) FROM t1 ORDER BY a; 279 SELECT DATE_SUB(CAST(a AS DATETIME), INTERVAL 1 MINUTE) FROM t1 ORDER BY a; 280 SELECT DATE_SUB(CAST(a AS DATETIME), INTERVAL 1 MICROSECOND) FROM t1 ORDER BY a; 281 drop table t1; 282 283 284 CREATE TABLE `t2` ( 285 `DATE_ADD(a, INTERVAL 1 SECOND)` datetime(6) DEFAULT NULL, 286 `DATE_SUB(a, INTERVAL 1 SECOND)` datetime(6) DEFAULT NULL, 287 `DATE_ADD(CAST(a AS DATETIME), INTERVAL 1 SECOND)` datetime DEFAULT NULL, 288 `DATE_SUB(CAST(a AS DATETIME), INTERVAL 1 SECOND)` datetime DEFAULT NULL, 289 `DATE_ADD(CAST(a AS DATETIME), INTERVAL 1 MICROSECOND)` datetime(6) DEFAULT NULL, 290 `DATE_SUB(CAST(a AS DATETIME), INTERVAL 1 MICROSECOND)` datetime(6) DEFAULT NULL 291 ); 292 DROP TABLE t2; 293 294