Some parts in the output code are omitted for clarity reasons.
Description
This UDF is used as a template for all cases when there is a subtraction between a DATE,TIMESTAMP, and any other type (except Intervals).
Custom UDF overloads
DATEDIFF_UDF(date, date)
Parameters
FIRST_PARAM: The first DATE of the operation.
SECOND_PARAM: The DATE to be subtracted.
CREATE OR REPLACE FUNCTION PUBLIC.DATEDIFF_UDF(FIRST_PARAM DATE, SECOND_PARAM DATE)RETURNS INTEGERLANGUAGE SQLIMMUTABLECOMMENT='{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}'AS$$ FIRST_PARAM - SECOND_PARAM$$;
DATEDIFF_UDF(date, timestamp)
Parameters
FIRST_PARAM: The first DATE of the operation.
SECOND_PARAM: The TIMESTAMP to be subtracted.
CREATE OR REPLACE FUNCTION PUBLIC.DATEDIFF_UDF(FIRST_PARAM DATE, SECOND_PARAM TIMESTAMP)RETURNS INTEGERLANGUAGE SQLIMMUTABLECOMMENT='{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}'AS$$ FIRST_PARAM - SECOND_PARAM::DATE$$;
DATEDIFF_UDF(date, integer)
Parameters
FIRST_PARAM: The first DATE of the operation.
SECOND_PARAM: The INTEGER to be subtracted.
CREATE OR REPLACE FUNCTION PUBLIC.DATEDIFF_UDF(FIRST_PARAM DATE, SECOND_PARAM INTEGER)RETURNS DATELANGUAGE SQLIMMUTABLECOMMENT='{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}'AS$$ DATEADD(day,SECOND_PARAM*-1 ,FIRST_PARAM)$$;
DATEDIFF_UDF(timestamp, timestamp)
Parameters
FIRST_PARAM: The first TIMESTAMP of the operation.
SECOND_PARAM: The TIMESTAMP to be subtracted.
CREATE OR REPLACE FUNCTION PUBLIC.DATEDIFF_UDF(FIRST_PARAM TIMESTAMP, SECOND_PARAM TIMESTAMP)RETURNS INTEGERLANGUAGE SQLIMMUTABLECOMMENT='{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}'AS$$ DATEDIFF(day,SECOND_PARAM ,FIRST_PARAM)$$;
DATEDIFF_UDF(timestamp, date)
Parameters
FIRST_PARAM: The first TIMESTAMP of the operation.
SECOND_PARAM: The DATE to be subtracted.
CREATE OR REPLACE FUNCTION PUBLIC.DATEDIFF_UDF(FIRST_PARAM TIMESTAMP, SECOND_PARAM DATE)RETURNS INTEGERLANGUAGE SQLIMMUTABLECOMMENT='{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}'AS$$ DATEDIFF(day,SECOND_PARAM ,FIRST_PARAM)$$;
DATEDIFF_UDF(timestamp, number)
Parameters
FIRST_PARAM: The first TIMESTAMP of the operation.
SECOND_PARAM: The NUMBER to be subtracted.
CREATE OR REPLACE FUNCTION PUBLIC.DATEDIFF_UDF(FIRST_PARAM TIMESTAMP, SECOND_PARAM NUMBER)RETURNS TIMESTAMPLANGUAGE SQLIMMUTABLECOMMENT='{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}'AS$$ DATEADD(day,SECOND_PARAM*-1,FIRST_PARAM)$$;
Usage example
The unknown is a column whose type could not be resolved, it could be a timestamp, date integer, or number.
--disableDateAsTimestamp
Flag to indicate whether SYSDATE should be transformed into CURRENT_DATEorCURRENT_TIMESTAMP. This will also affect all DATE columns that will be transformed to TIMESTAMP.
--Create TableCREATE OR REPLACETABLEtimes (AsTimeStamp TIMESTAMP(6),AsDate TIMESTAMP/*** SSC-FDM-OR0042 - DATE TYPE COLUMN HAS A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/)COMMENT ='{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}';--Subtraction operationsSELECTPUBLIC.DATEDIFF_UDF( !!!RESOLVE EWI!!! /*** SSC-EWI-OR0036 - TYPES RESOLUTION ISSUES, ARITHMETIC OPERATION '-' MAY NOT BEHAVE CORRECTLY BETWEEN DATE AND unknown ***/!!! AsDate, unknown) FROMtimes,unknown_table;SELECTPUBLIC.DATEDIFF_UDF( !!!RESOLVE EWI!!! /*** SSC-EWI-OR0036 - TYPES RESOLUTION ISSUES, ARITHMETIC OPERATION '-' MAY NOT BEHAVE CORRECTLY BETWEEN unknown AND Timestamp ***/!!! unknown, AsTimeStamp) FROMtimes;SELECTPUBLIC.DATEDIFF_UDF( !!!RESOLVE EWI!!! /*** SSC-EWI-OR0036 - TYPES RESOLUTION ISSUES, ARITHMETIC OPERATION '-' MAY NOT BEHAVE CORRECTLY BETWEEN Timestamp AND unknown ***/!!! AsTimeStamp, unknown) FROMtimes;SELECTPUBLIC.DATEDIFF_UDF( !!!RESOLVE EWI!!! /*** SSC-EWI-OR0036 - TYPES RESOLUTION ISSUES, ARITHMETIC OPERATION '-' MAY NOT BEHAVE CORRECTLY BETWEEN unknown AND DATE ***/!!! unknown, AsDate) FROMtimes;
Known Issues
1. Functional differences for timestamps
Sometimes the Snowflake value returned by the UDF may differ from the Oracle one due to the time. Consider the following example