DATEDIFF UDF
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
DATE_DIFF_UDF(date, date)
Parameters
FIRST_PARAM: The first
DATE
of the operation.SECOND_PARAM: The
DATE
to be subtracted.
CREATE OR REPLACE FUNCTION PUBLIC.DATE_DIFF_UDF(FIRST_PARAM DATE, SECOND_PARAM DATE)
RETURNS INTEGER
LANGUAGE SQL
IMMUTABLE
AS
$$
FIRST_PARAM - SECOND_PARAM
$$;
DATE_DIFF_UDF(date, timestamp)
Parameters
FIRST_PARAM: The first
DATE
of the operation.SECOND_PARAM: The
TIMESTAMP
to be subtracted.
CREATE OR REPLACE FUNCTION PUBLIC.DATE_DIFF_UDF(FIRST_PARAM DATE, SECOND_PARAM TIMESTAMP)
RETURNS INTEGER
LANGUAGE SQL
IMMUTABLE
AS
$$
FIRST_PARAM - SECOND_PARAM::DATE
$$;
DATE_DIFF_UDF(date, integer)
Parameters
FIRST_PARAM: The first
DATE
of the operation.SECOND_PARAM: The
INTEGER
to be subtracted.
CREATE OR REPLACE FUNCTION PUBLIC.DATE_DIFF_UDF(FIRST_PARAM DATE, SECOND_PARAM INTEGER)
RETURNS DATE
LANGUAGE SQL
IMMUTABLE
AS
$$
DATEADD(day,SECOND_PARAM*-1 ,FIRST_PARAM)
$$;
DATE_DIFF_UDF(timestamp, timestamp)
Parameters
FIRST_PARAM: The first
TIMESTAMP
of the operation.SECOND_PARAM: The
TIMESTAMP
to be subtracted.
CREATE OR REPLACE FUNCTION PUBLIC.DATE_DIFF_UDF(FIRST_PARAM TIMESTAMP, SECOND_PARAM TIMESTAMP)
RETURNS INTEGER
LANGUAGE SQL
IMMUTABLE
AS
$$
DATEDIFF(day,SECOND_PARAM ,FIRST_PARAM)
$$;
DATE_DIFF_UDF(timestamp, date)
Parameters
FIRST_PARAM: The first
TIMESTAMP
of the operation.SECOND_PARAM: The
DATE
to be subtracted.
CREATE OR REPLACE FUNCTION PUBLIC.DATE_DIFF_UDF(FIRST_PARAM TIMESTAMP, SECOND_PARAM DATE)
RETURNS INTEGER
LANGUAGE SQL
IMMUTABLE
AS
$$
DATEDIFF(day,SECOND_PARAM ,FIRST_PARAM)
$$;
DATE_DIFF_UDF(timestamp, number)
Parameters
FIRST_PARAM: The first
TIMESTAMP
of the operation.SECOND_PARAM: The
NUMBER
to be subtracted.
CREATE OR REPLACE FUNCTION PUBLIC.DATE_DIFF_UDF(FIRST_PARAM TIMESTAMP, SECOND_PARAM NUMBER)
RETURNS TIMESTAMP
LANGUAGE SQL
IMMUTABLE
AS
$$
DATEADD(day,SECOND_PARAM*-1,FIRST_PARAM)
$$;
Usage example
Oracle
--Create Table
CREATE TABLE times(AsTimeStamp TIMESTAMP, AsDate DATE);
--Subtraction operations
SELECT AsDate - unknown FROM times, unknown_table;
SELECT unknown - AsTimeStamp FROM times;
SELECT AsTimeStamp - unknown FROM times;
SELECT unknown - AsDate FROM times;
Snowflake
--Create Table
CREATE OR REPLACE TABLE times (AsTimeStamp TIMESTAMP(6),
AsDate TIMESTAMP /*** MSC-WARNING - MSCEWI3060 - DEFAULT VALUE FOR SYSDATE IS CURRENT_TIMESTAMP. COLUMN WAS TRANSFORMED TO TIMESTAMP TO PRESERVE INFORMATION. ***/
);
--Subtraction operations
--** MSC-WARNING - MSCEWI1050 - MISSING DEPENDENT OBJECT "unknown_table" **
SELECT
--** MSC-WARNING - MSCEWI1020 - CUSTOM UDF 'DATE_DIFF_UDF' INSERTED. **
PUBLIC.DATE_DIFF_UDF(
--** MSC-WARNING - MSCEWI3061 - COLUMN WAS TRANSFORMED FROM DATE TO TIMESTAMP. SOME OPERATIONS MAY BE AFFECTED **
--** MSC-WARNING - MSCEWI3036 - TYPES RESOLUTION ISSUES, ARITHMETIC OPERATION '-' MAY NOT BEHAVE CORRECTLY BETWEEN DATE AND unknown **
AsDate, unknown) FROM
times,
unknown_table;
SELECT
--** MSC-WARNING - MSCEWI1020 - CUSTOM UDF 'DATE_DIFF_UDF' INSERTED. **
PUBLIC.DATE_DIFF_UDF(
--** MSC-WARNING - MSCEWI3036 - TYPES RESOLUTION ISSUES, ARITHMETIC OPERATION '-' MAY NOT BEHAVE CORRECTLY BETWEEN unknown AND Timestamp **
unknown, AsTimeStamp) FROM
times;
SELECT
--** MSC-WARNING - MSCEWI1020 - CUSTOM UDF 'DATE_DIFF_UDF' INSERTED. **
PUBLIC.DATE_DIFF_UDF(
--** MSC-WARNING - MSCEWI3036 - TYPES RESOLUTION ISSUES, ARITHMETIC OPERATION '-' MAY NOT BEHAVE CORRECTLY BETWEEN Timestamp AND unknown **
AsTimeStamp, unknown) FROM
times;
SELECT
--** MSC-WARNING - MSCEWI1020 - CUSTOM UDF 'DATE_DIFF_UDF' INSERTED. **
PUBLIC.DATE_DIFF_UDF(
--** MSC-WARNING - MSCEWI3036 - TYPES RESOLUTION ISSUES, ARITHMETIC OPERATION '-' MAY NOT BEHAVE CORRECTLY BETWEEN unknown AND DATE **
unknown,
--** MSC-WARNING - MSCEWI3061 - COLUMN WAS TRANSFORMED FROM DATE TO TIMESTAMP. SOME OPERATIONS MAY BE AFFECTED **
AsDate) FROM
times;
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
Oracle
-- CREATE TABLE UNKNOWN_TABLE(Unknown timestamp);
-- INSERT INTO UNKNOWN_TABLE VALUES (TO_TIMESTAMP('01/10/09, 12:00 P.M.', 'dd/mm/yy, hh:mi P.M.'));
CREATE TABLE TIMES(AsTimeStamp TIMESTAMP);
INSERT INTO TIMES VALUES (TO_TIMESTAMP('05/11/21, 11:00 A.M.', 'dd/mm/yy, hh:mi A.M.'));
SELECT AsTimeStamp - unknown FROM times, unknown_table;v
Snowflake
-- CREATE TABLE UNKNOWN_TABLE(Unknown timestamp);
-- INSERT INTO UNKNOWN_TABLE VALUES (TO_TIMESTAMP('01/10/09, 12:00 P.M.', 'dd/mm/yy, hh:mi P.M.'));
CREATE OR REPLACE TABLE TIMES (AsTimeStamp TIMESTAMP(6)
);
INSERT INTO TIMES
VALUES (TO_TIMESTAMP('05/11/21, 11:00 A.M.', 'dd/mm/yy, hh:mi A.M.'));
--** MSC-WARNING - MSCEWI1050 - MISSING DEPENDENT OBJECT "unknown_table" **
SELECT
--** MSC-WARNING - MSCEWI1020 - CUSTOM UDF 'DATE_DIFF_UDF' INSERTED. **
PUBLIC.DATE_DIFF_UDF(
--** MSC-WARNING - MSCEWI3036 - TYPES RESOLUTION ISSUES, ARITHMETIC OPERATION '-' MAY NOT BEHAVE CORRECTLY BETWEEN Timestamp AND unknown **
AsTimeStamp, unknown) FROM
times,
unknown_table;
-- ** MSC-ERROR - MSCEWI1001 - UNRECOGNIZED TOKEN ON LINE 7 COLUMN 55 OF THE SOURCE CODE STARTING AT 'v'. EXPECTED 'STATEMENT' GRAMMAR. **
-- v
Related EWIs
MSCEWI1020: CUSTOM UDF INSERTED.
Last updated
Was this helpful?