MCPcopy Create free account
hub / github.com/Meituan-Dianping/SQLAdvisor / date_add_interval

Function date_add_interval

sql/sql_time.cc:1131–1237  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1129#define MAX_DAY_NUMBER 3652424L
1130
1131bool date_add_interval(MYSQL_TIME *ltime, interval_type int_type, INTERVAL interval)
1132{
1133 long period, sign;
1134
1135 ltime->neg= 0;
1136
1137 sign= (interval.neg ? -1 : 1);
1138
1139 switch (int_type) {
1140 case INTERVAL_SECOND:
1141 case INTERVAL_SECOND_MICROSECOND:
1142 case INTERVAL_MICROSECOND:
1143 case INTERVAL_MINUTE:
1144 case INTERVAL_HOUR:
1145 case INTERVAL_MINUTE_MICROSECOND:
1146 case INTERVAL_MINUTE_SECOND:
1147 case INTERVAL_HOUR_MICROSECOND:
1148 case INTERVAL_HOUR_SECOND:
1149 case INTERVAL_HOUR_MINUTE:
1150 case INTERVAL_DAY_MICROSECOND:
1151 case INTERVAL_DAY_SECOND:
1152 case INTERVAL_DAY_MINUTE:
1153 case INTERVAL_DAY_HOUR:
1154 {
1155 longlong sec, days, daynr, microseconds, extra_sec;
1156 ltime->time_type= MYSQL_TIMESTAMP_DATETIME; // Return full date
1157 microseconds= ltime->second_part + sign*interval.second_part;
1158 extra_sec= microseconds/1000000L;
1159 microseconds= microseconds%1000000L;
1160
1161 sec=((ltime->day-1)*3600*24L+ltime->hour*3600+ltime->minute*60+
1162 ltime->second +
1163 sign* (longlong) (interval.day*3600*24L +
1164 interval.hour*LL(3600)+interval.minute*LL(60)+
1165 interval.second))+ extra_sec;
1166 if (microseconds < 0)
1167 {
1168 microseconds+= LL(1000000);
1169 sec--;
1170 }
1171 days= sec/(3600*LL(24));
1172 sec-= days*3600*LL(24);
1173 if (sec < 0)
1174 {
1175 days--;
1176 sec+= 3600*LL(24);
1177 }
1178 ltime->second_part= (uint) microseconds;
1179 ltime->second= (uint) (sec % 60);
1180 ltime->minute= (uint) (sec/60 % 60);
1181 ltime->hour= (uint) (sec/3600);
1182 daynr= calc_daynr(ltime->year,ltime->month,1) + days;
1183 /* Day number from year 0 to 9999-12-31 */
1184 if ((ulonglong) daynr > MAX_DAY_NUMBER)
1185 goto invalid_date;
1186 get_date_from_daynr((long) daynr, &ltime->year, &ltime->month,
1187 &ltime->day);
1188 break;

Callers 1

Calls 4

calc_daynrFunction · 0.85
get_date_from_daynrFunction · 0.85
calc_days_in_yearFunction · 0.85
push_warning_printfFunction · 0.85

Tested by

no test coverage detected