In SQL Server you can use DATEADD function to add the specified number of units to a datetime value. In Oracle you have to use an INTERVAL expression.
SQL Server:
-- Add 1 day to the current datetime SELECT DATEADD(DAY, 1, GETDATE()); # 2023-02-11 17:19:59.360
Oracle:
-- Add 1 day to the current datetime SELECT SYSTIMESTAMP(3) + INTERVAL '1' DAY FROM dual; # 2023-02-11 17:19:59.360
You can map unit values between SQL Server DATEADD and Oracle INTERVAL literals as follows:
Unit | SQL Server DATEADD | Oracle INTERVAL |
Year | year, y, yy, yyyy | year |
Quarter | quarter, qq, q | |
Month | month, mm, m | month |
Dayofyear | dayofyear, dy | |
Day | day, dd, d | day |
Week | week, wk, ww | |
Hour | hour, hh | hour |
Minute | minute, mi, n | minute |
Second | second, ss, s | second |
Millisecond | millisecond, ms | |
Microsecond | microsecond, mcs | |
Nanosecond | nanosecond, ns |
By default, the DAY INTERVAL precision is 2 in Oracle, so the following query fails:
Oracle:
-- Exceeding the default precision SELECT SYSTIMESTAMP + INTERVAL '100' DAY FROM dual; # ERROR at line 1: # ORA-01873: the leading precision of the interval is too small
So you have to specify the maximum precision DAY(3) explicitly:
-- Specifying DAY(3) precision SELECT SYSTIMESTAMP + INTERVAL '100' DAY(3) FROM dual; # 21-MAY-23 05.25.39.329000000 PM +01:00
At the same time, PL/SQL does not allow you to specify the precision:
DECLARE dt TIMESTAMP; BEGIN dt := INTERVAL '100' DAY(3) + SYSTIMESTAMP; END; / # ERROR at line 4: # ORA-06550: line 4, column 27: # PLS-00103: Encountered the symbol "("
And the following code works in PL/SQL while does not work in Oracle SQL:
DECLARE dt TIMESTAMP; BEGIN dt := INTERVAL '100' DAY + SYSTIMESTAMP; END; / # PL/SQL procedure successfully completed.
For more information, see SQL Server to Oracle Migration.