SnowConvert AI - Oracle - SnowConvert AI カスタム UDFs¶
説明¶
Oracleの組み込み関数や機能の中には、Snowflakeでは利用できないものや動作が異なるものがあります。これらの違いを最小限にするため、一部の関数は SnowConvert AI カスタム UDFs に置き換えられます。
これらの UDFs は、移行中に、 出力 フォルダー内の UDF ヘルパー フォルダーに自動的に作成されます。カスタム UDF ごとに1つのファイルがあります。
BFILENAME UDF¶
説明¶
この関数は、Oracle BFILENAME() のディレクトリ名とファイル名のパラメーターを STRING として受け取り、 \ を用いてそれらを連結して返します。BFILE は VARCHAR に変換されるので、 BFILENAME の結果はテキストとして扱われます。
警告
オペレーティングシステムのファイル連結文字に対応するように、 \ を変更する必要があります。
カスタム UDF オーバーロード¶
BFILENAME_UDF(string, string)¶
ディレクトリパスとファイル名を連結します。
パラメーター
DIRECTORYNAME: ディレクトリパスを表す
STRING。FILENAME: ファイル名を表す
STRING。
UDF¶
CREATE OR REPLACE FUNCTION PUBLIC.BFILENAME_UDF (DIRECTORYNAME STRING, FILENAME STRING)
RETURNS STRING
LANGUAGE SQL
IMMUTABLE
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}'
AS
$$
DIRECTORYNAME || '\\' || FILENAME
$$;
Oracle¶
--Create Table
CREATE TABLE bfile_table ( col1 BFILE );
--Insert Bfilename
INSERT INTO bfile_table VALUES ( BFILENAME('mydirectory', 'myfile.png') );
--Select
SELECT * FROM bfile_table;
結果¶
COL1 |
|---|
[BFILE:myfile.png] |
Snowflake¶
--Create Table
CREATE OR REPLACE TABLE bfile_table ( col1
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0105 - ADDITIONAL WORK IS NEEDED FOR BFILE COLUMN USAGE. BUILD_STAGE_FILE_URL FUNCTION IS A RECOMMENDED WORKAROUND ***/!!!
VARCHAR
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;
--Insert Bfilename
INSERT INTO bfile_table
VALUES (PUBLIC.BFILENAME_UDF('mydirectory', 'myfile.png') );
--Select
SELECT * FROM
bfile_table;
結果¶
COL1 |
|---|
mydirectory\myfile.png |
既知の問題¶
1.DBMS_LOB 組み込みパッケージにアクセスできません¶
Snowflakeでは LOB データ型がサポートされていないため、 DBMS_LOB 関数に相当するものはなく、回避策もまだ実装されていません。
CAST_DATE UDF¶
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明¶
このカスタム UDF は、プロシージャや関数の内部で文字列を DATE にキャストする際に、形式の違いによって発生するランタイム例外を回避するために追加されました。
カスタム UDF オーバーロード¶
CAST_DATE_UDF(datestr)¶
STRING から DATE を作成します。
パラメーター
DATESTR:
DATEを特定の形式で表すSTRING。
UDF¶
CREATE OR REPLACE FUNCTION PUBLIC.CAST_DATE_UDF(DATESTR STRING)
RETURNS DATE
LANGUAGE SQL
IMMUTABLE
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}'
AS
$$
SELECT TO_DATE(DATESTR,'YYYY-MM-DD"T"HH24:MI:SS.FF')
$$;
Oracle¶
--Create Table
CREATE TABLE jsdateudf_table( col1 DATE );
--Create Procedure
CREATE OR REPLACE PROCEDURE jsdateudf_proc ( par1 DATE )
IS
BEGIN
INSERT INTO jsdateudf_table VALUES(par1);
END;
--Insert Date
CALL jsdateudf_proc('20-03-1996');
--Select
SELECT * FROM jsdateudf_table;
結果¶
COL1 |
|---|
1996-03-20 00:00:00.000 |
Snowflake¶
--Create Table
CREATE OR REPLACE TABLE jsdateudf_table ( col1 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"}}'
;
--Create Procedure
CREATE OR REPLACE PROCEDURE jsdateudf_proc (par1 TIMESTAMP /*** SSC-FDM-OR0042 - DATE TYPE COLUMN HAS A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
BEGIN
INSERT INTO jsdateudf_table
VALUES(:par1);
END;
$$;
--Insert Date
CALL jsdateudf_proc('20-03-1996');
--Select
SELECT * FROM
jsdateudf_table;
結果¶
COL1 |
|---|
1996-03-20 |
既知の問題¶
1.Oracle DATE には TIMESTAMP が含まれています¶
Oracleの DATE には空の TIMESTAMP (00:00:00.000)が含まれていますが、Snowflakeの DATE には含まれていないことを考慮してください。 SnowConvert AI では、 SysdateAsCurrentTimestamp フラグで DATE から TIMESTAMP に変換できます。
関連 EWIs¶
SSC-FDM-OR0042: タイムスタンプに変換された日付タイプの動作が異なります
DATE_TO_JULIANDAYS_UDF¶
説明¶
DATE_TO_JULIANDAYS_UDF()関数は DATE を受け取り、1月1日4712 BC からの日数を返します。この関数は、Oracle TO_CHAR(DATE,'J')と同等です。
カスタム UDF オーバーロード¶
DATE_TO_JULIANDAYS_UDF(date)¶
パラメーター
INPUT_DATE: 操作の
DATE。
UDF¶
CREATE OR REPLACE FUNCTION PUBLIC.DATE_TO_JULIAN_DAYS_UDF(input_date DATE)
RETURNS NUMBER
IMMUTABLE
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}'
AS
$$
DATEDIFF(DAY,TO_DATE('00000101','YYYYMMDD'),TO_DATE('01/01/4712','DD/MM/YYYY')) +
DATEDIFF(DAY,TO_DATE('00000101','YYYYMMDD'),input_date) + 38
// Note: The 38 on the equation marks the differences in days between calendars and must be updated on the year 2099
$$
;
使用例¶
Oracle¶
--Create Table
CREATE TABLE datetojulian_table (col1 DATE);
INSERT INTO datetojulian_table VALUES (DATE '2020-01-01');
INSERT INTO datetojulian_table VALUES (DATE '1900-12-31');
INSERT INTO datetojulian_table VALUES (DATE '1904-02-29');
INSERT INTO datetojulian_table VALUES (DATE '1903-03-01');
INSERT INTO datetojulian_table VALUES (DATE '2000-12-31');
--Select
SELECT TO_CHAR(col1, 'J') FROM datetojulian_table;
Snowflake¶
--Create Table
CREATE OR REPLACE TABLE datetojulian_table (col1 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"}}'
;
INSERT INTO datetojulian_table
VALUES (DATE '2020-01-01');
INSERT INTO datetojulian_table
VALUES (DATE '1900-12-31');
INSERT INTO datetojulian_table
VALUES (DATE '1904-02-29');
INSERT INTO datetojulian_table
VALUES (DATE '1903-03-01');
INSERT INTO datetojulian_table
VALUES (DATE '2000-12-31');
--Select
SELECT
PUBLIC.DATE_TO_JULIAN_DAYS_UDF(col1)
FROM
datetojulian_table;
既知の問題¶
問題は見つかりませんでした。
関連 EWIs¶
SSC-FDM-OR0042: タイムスタンプに変換された日付タイプの動作が異なります
DATEADD UDF¶
説明¶
この UDF は、 DATE または TIMESTAMP タイプと FLOAT タイプの間に追加がある場合のすべてのテンプレートとして使用されます。
カスタム UDF オーバーロード¶
DATEADD_UDF(date, float)¶
パラメーター
FIRST_PARAM: 操作の最初の
DATE。SECOND_PARAM: 追加される
FLOAT。
UDF¶
CREATE OR REPLACE FUNCTION PUBLIC.DATEADD_UDF(FIRST_PARAM DATE, SECOND_PARAM FLOAT)
RETURNS DATE
LANGUAGE SQL
IMMUTABLE
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}'
AS
$$
SELECT FIRST_PARAM + SECOND_PARAM::NUMBER
$$;
DATEADD_UDF(float, date)¶
パラメーター
FIRST_PARAM: 追加される
FLOAT。SECOND_PARAM: 操作の
DATE。
UDF¶
CREATE OR REPLACE FUNCTION PUBLIC.DATEADD_UDF(FIRST_PARAM FLOAT, SECOND_PARAM DATE)
RETURNS DATE
LANGUAGE SQL
IMMUTABLE
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}'
AS
$$
SELECT FIRST_PARAM::NUMBER + SECOND_PARAM
$$;
DATEADD_UDF(timestamp, float)¶
パラメーター
FIRST_PARAM: 操作の最初の
TIMESTAMP。SECOND_PARAM: 追加される
FLOAT。
UDF¶
CREATE OR REPLACE FUNCTION PUBLIC.DATEADD_UDF(FIRST_PARAM TIMESTAMP, SECOND_PARAM FLOAT)
RETURNS TIMESTAMP
LANGUAGE SQL
IMMUTABLE
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}'
AS
$$
SELECT DATEADD(day, SECOND_PARAM,FIRST_PARAM)
$$;
DATEADD_UDF(float, timestamp)¶
パラメーター
FIRST_PARAM: 操作の
FLOAT。SECOND_PARAM: 操作の
TIMESTAMP。
UDF¶
CREATE OR REPLACE FUNCTION PUBLIC.DATEADD_UDF(FIRST_PARAM FLOAT, SECOND_PARAM TIMESTAMP)
RETURNS TIMESTAMP
LANGUAGE SQL
IMMUTABLE
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}'
AS
$$
SELECT DATEADD(day, FIRST_PARAM,SECOND_PARAM)
$$;
使用例¶
Oracle¶
SELECT
TO_TIMESTAMP('03/08/2009, 12:47 AM', 'dd/mm/yy, hh:mi AM')+62.40750856543442
FROM DUAL;
結果¶
TO_TIMESTAMP('03/08/2009,12:47AM','DD/MM/YY,HH:MIAM')+62.40750856543442 |
|---|
2009-10-04 10:33:49.000 |
Snowflake¶
SELECT
PUBLIC.DATEADD_UDF(TO_TIMESTAMP('03/08/2009, 12:47 AM', 'dd/mm/yy, hh:mi AM'), 62.40750856543442)
FROM DUAL;
結果¶
|PUBLIC.DATEADD_UDF(
TO_TIMESTAMP('03/08/2009, 12:47 AM', 'DD/MM/YY, HH12:MI AM'), 62.40750856543442) |
|---|
2009-10-04 00:47:00.000 |
既知の問題¶
1.時間精度の違い¶
日付またはタイムスタンプと浮動小数点数の間で操作が行われる場合、時間はOracleと異なる場合があります。この問題を解決するためのアクションアイテムがあります。
関連 EWIs¶
関連する EWIs なし。
DATEDIFF UDF¶
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明¶
この UDF は、 DATE、 TIMESTAMP、およびその他のタイプ(Intervalsを除く)との間に減算がある場合のすべてのテンプレートとして使用されます。
カスタム UDF オーバーロード¶
DATEDIFF_UDF(date, date)¶
パラメーター
FIRST_PARAM: 操作の最初の
DATE。SECOND_PARAM: 減算される
DATE。
UDF¶
CREATE OR REPLACE FUNCTION PUBLIC.DATEDIFF_UDF(FIRST_PARAM DATE, SECOND_PARAM DATE)
RETURNS INTEGER
LANGUAGE SQL
IMMUTABLE
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}'
AS
$$
FIRST_PARAM - SECOND_PARAM
$$;
DATEDIFF_UDF(date, timestamp)¶
パラメーター
FIRST_PARAM: 操作の最初の
DATE。SECOND_PARAM: 減算される
TIMESTAMP。
UDF¶
CREATE OR REPLACE FUNCTION PUBLIC.DATEDIFF_UDF(FIRST_PARAM DATE, SECOND_PARAM TIMESTAMP)
RETURNS INTEGER
LANGUAGE SQL
IMMUTABLE
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}'
AS
$$
FIRST_PARAM - SECOND_PARAM::DATE
$$;
DATEDIFF_UDF(date, integer)¶
パラメーター
FIRST_PARAM: 操作の最初の
DATE。SECOND_PARAM: 減算される
INTEGER。
UDF¶
CREATE OR REPLACE FUNCTION PUBLIC.DATEDIFF_UDF(FIRST_PARAM DATE, SECOND_PARAM INTEGER)
RETURNS DATE
LANGUAGE SQL
IMMUTABLE
COMMENT = '{"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)¶
パラメーター
FIRST_PARAM: 操作の最初の
TIMESTAMP。SECOND_PARAM: 減算される
TIMESTAMP。
UDF¶
CREATE OR REPLACE FUNCTION PUBLIC.DATEDIFF_UDF(FIRST_PARAM TIMESTAMP, SECOND_PARAM TIMESTAMP)
RETURNS INTEGER
LANGUAGE SQL
IMMUTABLE
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}'
AS
$$
DATEDIFF(day,SECOND_PARAM ,FIRST_PARAM)
$$;
DATEDIFF_UDF(timestamp, date)¶
パラメーター
FIRST_PARAM: 操作の最初の
TIMESTAMP。SECOND_PARAM: 減算される
DATE。
UDF¶
CREATE OR REPLACE FUNCTION PUBLIC.DATEDIFF_UDF(FIRST_PARAM TIMESTAMP, SECOND_PARAM DATE)
RETURNS INTEGER
LANGUAGE SQL
IMMUTABLE
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}'
AS
$$
DATEDIFF(day,SECOND_PARAM ,FIRST_PARAM)
$$;
DATEDIFF_UDF(timestamp, number)¶
パラメーター
FIRST_PARAM: 操作の最初の
TIMESTAMP。SECOND_PARAM: 減算される
NUMBER。
UDF¶
CREATE OR REPLACE FUNCTION PUBLIC.DATEDIFF_UDF(FIRST_PARAM TIMESTAMP, SECOND_PARAM NUMBER)
RETURNS TIMESTAMP
LANGUAGE SQL
IMMUTABLE
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}'
AS
$$
DATEADD(day,SECOND_PARAM*-1,FIRST_PARAM)
$$;
使用例¶
注釈
unknownはタイプが解決できなかった列で、タイムスタンプ、日付の整数、数値の可能性があります。
注釈
--disableDateAsTimestamp
SYSDATE を CURRENT_DATE または CURRENT_TIMESTAMP に変換すべきかどうかを示すフラグ。これは、 TIMESTAMP に変換されるすべての DATE 列にも影響します。
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 /*** SSC-FDM-OR0042 - DATE TYPE COLUMN HAS A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "07/16/2025", "domain": "no-domain-provided" }}'
;
--Subtraction operations
SELECT
PUBLIC.DATEDIFF_UDF(
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0036 - TYPES RESOLUTION ISSUES, ARITHMETIC OPERATION '-' MAY NOT BEHAVE CORRECTLY BETWEEN DATE AND unknown ***/!!!
AsDate, unknown) FROM
times,
unknown_table;
SELECT
PUBLIC.DATEDIFF_UDF(
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0036 - TYPES RESOLUTION ISSUES, ARITHMETIC OPERATION '-' MAY NOT BEHAVE CORRECTLY BETWEEN unknown AND TIMESTAMP ***/!!!
unknown, AsTimeStamp) FROM
times;
SELECT
PUBLIC.DATEDIFF_UDF(
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0036 - TYPES RESOLUTION ISSUES, ARITHMETIC OPERATION '-' MAY NOT BEHAVE CORRECTLY BETWEEN TIMESTAMP AND unknown ***/!!!
AsTimeStamp, unknown) FROM
times;
SELECT
PUBLIC.DATEDIFF_UDF(
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0036 - TYPES RESOLUTION ISSUES, ARITHMETIC OPERATION '-' MAY NOT BEHAVE CORRECTLY BETWEEN unknown AND DATE ***/!!!
unknown, AsDate) FROM
times;
既知の問題¶
1.タイムスタンプの機能差¶
UDF から返されるSnowflakeの値が、時間の関係でOracleの値と異なる場合があります。次の例を考えてみましょう
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;
結果¶
ASTIMESTAMP-UNKNOWN |
|---|
4417 23:0:0.0 |
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)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;
INSERT INTO TIMES
VALUES (TO_TIMESTAMP('05/11/21, 11:00 A.M.', 'dd/mm/yy, hh:mi A.M.'));
SELECT
PUBLIC.DATEDIFF_UDF(
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0036 - TYPES RESOLUTION ISSUES, ARITHMETIC OPERATION '-' MAY NOT BEHAVE CORRECTLY BETWEEN TIMESTAMP AND unknown ***/!!!
AsTimeStamp, unknown) FROM
times,
unknown_table;
結果¶
PUBLIC.DATEDIFF_UDF( ASTIMESTAMP, UNKNOWN) |
|---|
4418 |
関連 EWIs¶
SSC-EWI-OR0036:型解決の問題で、文字列と日付の間の算術演算が正しく動作しないことがあります。
SSC-FDM-OR0042:日付型をタイムスタンプに変換すると異なる動作をします。
JSON_VALUE UDF¶
Oracle JSON_VALUE 関数をSnowflakeに変換するための翻訳リファレンス
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明¶
Oracleのドキュメントによると、この関数は SQL/JSON パス式 を使用して、 JSON インスタンスの一部に関する情報をリクエストします。戻り値は常にスカラー値で、そうでなければ関数はデフォルト値で NULL を返します。
JSON_VALUE
( expr [ FORMAT JSON ], [ JSON_basic_path_expression ]
[ JSON_value_returning_clause ] [ JSON_value_on_error_clause ]
[ JSON_value_on_empty_clause ][ JSON_value_on_mismatch_clause ]
)
JSON_VALUE_UDF は、 Stefan Goessner が開発したオリジナルの JavaScript 実装の修正バージョンを使用した、 JSONPath 仕様のSnowflake実装です。
サンプルソースパターン¶
セットアップデータ¶
これらのクエリを実行すると、 JSON_VALUE パターンセクションのクエリが実行されます。
Oracle¶
CREATE TABLE MY_TAB (
my_json VARCHAR(5000)
);
INSERT INTO MY_TAB VALUES ('{
"store": {
"book": [
{ "category": "reference",
"author": "Nigel Rees",
"title": "Sayings of the Century",
"price": 8.95
},
{ "category": "fiction",
"author": "Evelyn Waugh",
"title": "Sword of Honour",
"price": 12.99
},
{ "category": "fiction",
"author": "Herman Melville",
"title": "Moby Dick",
"isbn": "0-553-21311-3",
"price": 8.99
},
{ "category": "fiction",
"author": "J. R. R. Tolkien",
"title": "The Lord of the Rings",
"isbn": "0-395-19395-8",
"price": 22.99
}
],
"bicycle": {
"color": "red",
"price": 19.95
}
}
}');
Snowflake¶
CREATE OR REPLACE TABLE MY_TAB (
my_json VARCHAR(5000)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;
INSERT INTO MY_TAB
VALUES ('{
"store": {
"book": [
{ "category": "reference",
"author": "Nigel Rees",
"title": "Sayings of the Century",
"price": 8.95
},
{ "category": "fiction",
"author": "Evelyn Waugh",
"title": "Sword of Honour",
"price": 12.99
},
{ "category": "fiction",
"author": "Herman Melville",
"title": "Moby Dick",
"isbn": "0-553-21311-3",
"price": 8.99
},
{ "category": "fiction",
"author": "J. R. R. Tolkien",
"title": "The Lord of the Rings",
"isbn": "0-395-19395-8",
"price": 22.99
}
],
"bicycle": {
"color": "red",
"price": 19.95
}
}
}');
JSON_VALUE パターン¶
Oracle¶
-- 'Sayings of the Century'
SELECT JSON_VALUE(MY_JSON, '$..book[0].title') AS VALUE FROM MY_TAB;
-- NULL
-- gets books in positions 0, 1, 2 and 3 but returns null (default behavior) since a non scalar value was returned
SELECT JSON_VALUE(MY_JSON, '$..book[0,1 to 3,3]') AS VALUE FROM MY_TAB;
-- 'Sayings of the Century'
SELECT JSON_VALUE(MY_JSON, '$.store.book[*]?(@.category == "reference").title') AS VALUE FROM MY_TAB;
-- 'MY ERROR MESSAGE'
-- triggers error because the result is a non scalar value (is an object)
SELECT JSON_VALUE(MY_JSON, '$..book[0]' DEFAULT 'MY ERROR MESSAGE' ON ERROR DEFAULT 'MY EMPTY MESSAGE' ON EMPTY) AS VALUE FROM MY_TAB;
-- 'MY EMPTY MESSAGE'
-- triggers the on empty class because does not exists in the first book element
SELECT JSON_VALUE(MY_JSON, '$..book[0].isbn' DEFAULT 'MY ERROR MESSAGE' ON ERROR DEFAULT 'MY EMPTY MESSAGE' ON EMPTY) AS VALUE FROM MY_TAB;
-- Oracle error message: ORA-40462: JSON_VALUE evaluated to no value
-- this is a custom message from the UDF when no match is found and the ON ERROR clause is set to ERROR
SELECT JSON_VALUE(MY_JSON, '$..book[0].isbn' ERROR ON ERROR) AS VALUE FROM MY_TAB;
-- NULL
SELECT JSON_VALUE(MY_JSON, '$..book[0].isbn' NULL ON ERROR) AS VALUE FROM MY_TAB;
-- Oracle error message: ORA-40462: JSON_VALUE evaluated to no value
-- this is a custom message from the UDF when no match is found and the ON EMPTY clause is set to ERROR
SELECT JSON_VALUE(MY_JSON, '$..book[0].isbn' ERROR ON EMPTY) AS VALUE FROM MY_TAB;
-- NULL
SELECT JSON_VALUE(MY_JSON, '$..book[0].isbn' NULL ON EMPTY) AS VALUE FROM MY_TAB;
-- 'Sayings of the Century'
SELECT JSON_VALUE(MY_JSON, '$..book[0].title' RETURNING VARCHAR2) AS VALUE FROM MY_TAB;
-- 'Sayin'
SELECT JSON_VALUE(MY_JSON, '$..book[0].title' RETURNING VARCHAR2(5) TRUNCATE) AS VALUE FROM MY_TAB;
-- 'Sayings of the Century'
SELECT JSON_VALUE(MY_JSON, '$..book[0].title' RETURNING CLOB) AS VALUE FROM MY_TAB;
-- NULL
-- This is because the title field is a string and the function expects a number result type
SELECT JSON_VALUE(MY_JSON, '$..book[0].title' RETURNING NUMBER) AS VALUE FROM MY_TAB;
-- 420
-- This is because the title field is a string and the function expects a number result type
SELECT JSON_VALUE(MY_JSON, '$..book[0].title' RETURNING NUMBER DEFAULT 420 ON ERROR) AS VALUE FROM MY_TAB;
-- Oracle error message: ORA-01858: a non-numeric character was found where a numeric was expected
SELECT JSON_VALUE(MY_JSON, '$..book[0].title' RETURNING DATE ERROR ON ERROR) AS VALUE FROM MY_TAB;
-- ORA-40450: invalid ON ERROR clause
SELECT JSON_VALUE(MY_JSON, '$..book[0].title' ERROR ON MISMATCH) AS VALUE FROM MY_TAB;
結果¶
JSON パス |
クエリ結果 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Snowflake¶
-- 'Sayings of the Century'
SELECT
JSON_VALUE_UDF(MY_JSON, '$..book[0].title', NULL, NULL, NULL) AS VALUE FROM
MY_TAB;
-- NULL
-- gets books in positions 0, 1, 2 and 3 but returns null (default behavior) since a non scalar value was returned
SELECT
JSON_VALUE_UDF(MY_JSON, '$..book[0,1 to 3,3]', NULL, NULL, NULL) AS VALUE FROM
MY_TAB;
-- 'Sayings of the Century'
SELECT
JSON_VALUE_UDF(MY_JSON, '$.store.book[*]?(@.category == "reference").title', NULL, NULL, NULL) AS VALUE FROM
MY_TAB;
-- 'MY ERROR MESSAGE'
-- triggers error because the result is a non scalar value (is an object)
SELECT
JSON_VALUE_UDF(MY_JSON, '$..book[0]', NULL, 'MY ERROR MESSAGE' :: VARIANT, 'MY EMPTY MESSAGE' :: VARIANT) AS VALUE FROM
MY_TAB;
-- 'MY EMPTY MESSAGE'
-- triggers the on empty class because does not exists in the first book element
SELECT
JSON_VALUE_UDF(MY_JSON, '$..book[0].isbn', NULL, 'MY ERROR MESSAGE' :: VARIANT, 'MY EMPTY MESSAGE' :: VARIANT) AS VALUE FROM
MY_TAB;
-- Oracle error message: ORA-40462: JSON_VALUE evaluated to no value
-- this is a custom message from the UDF when no match is found and the ON ERROR clause is set to ERROR
SELECT
JSON_VALUE_UDF(MY_JSON, '$..book[0].isbn', NULL, 'SSC_ERROR_ON_ERROR' :: VARIANT, NULL) AS VALUE FROM
MY_TAB;
-- NULL
SELECT
JSON_VALUE_UDF(MY_JSON, '$..book[0].isbn', NULL, 'SSC_NULL_ON_ERROR' :: VARIANT, NULL) AS VALUE FROM
MY_TAB;
-- Oracle error message: ORA-40462: JSON_VALUE evaluated to no value
-- this is a custom message from the UDF when no match is found and the ON EMPTY clause is set to ERROR
SELECT
JSON_VALUE_UDF(MY_JSON, '$..book[0].isbn', NULL, NULL, 'SSC_ERROR_ON_EMPTY' :: VARIANT) AS VALUE FROM
MY_TAB;
-- NULL
SELECT
JSON_VALUE_UDF(MY_JSON, '$..book[0].isbn', NULL, NULL, 'SSC_NULL_ON_EMPTY' :: VARIANT) AS VALUE FROM
MY_TAB;
-- 'Sayings of the Century'
SELECT
JSON_VALUE_UDF(MY_JSON, '$..book[0].title', 'string', NULL, NULL) AS VALUE FROM
MY_TAB;
-- 'Sayin'
SELECT
LEFT(JSON_VALUE_UDF(MY_JSON, '$..book[0].title', 'string', NULL, NULL), 5) AS VALUE FROM
MY_TAB;
-- 'Sayings of the Century'
SELECT
JSON_VALUE_UDF(MY_JSON, '$..book[0].title', 'string', NULL, NULL) AS VALUE FROM
MY_TAB;
-- NULL
-- This is because the title field is a string and the function expects a number result type
SELECT
JSON_VALUE_UDF(MY_JSON, '$..book[0].title', 'number', NULL, NULL) AS VALUE FROM
MY_TAB;
-- 420
-- This is because the title field is a string and the function expects a number result type
SELECT
JSON_VALUE_UDF(MY_JSON, '$..book[0].title', 'number', 420 :: VARIANT, NULL) AS VALUE FROM
MY_TAB;
-- Oracle error message: ORA-01858: a non-numeric character was found where a numeric was expected
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-0021 - RETURNING CLAUSE NOT SUPPORTED IN SNOWFLAKE ***/!!!
JSON_VALUE_UDF(MY_JSON, '$..book[0].title', NULL, 'SSC_ERROR_ON_ERROR' :: VARIANT, NULL) AS VALUE FROM
MY_TAB;
-- ORA-40450: invalid ON ERROR clause
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-0021 - ON MISMATCH CLAUSE NOT SUPPORTED IN SNOWFLAKE ***/!!!
SON_VALUE_UDF(MY_JSON, '$..book[0].title', NULL, NULL, NULL) AS VALUE FROM
MY_TAB;
結果¶
JSON パス |
クエリ結果 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
NOT SUPPORTED |
|
NOT SUPPORTED |
既知の問題¶
1.Returning Type句は完全にサポートされていません¶
現在、 RETURNING TYPE 句の機能を翻訳する際にサポートされているタイプは、 VARCHAR2、 CLOB、 NUMBER のみです。
元の JSON_VALUE 関数でサポートされている他のすべてのタイプについては、 JSON_VALUE_UDF は RETURNING TYPE 句が指定されていないかのように動作します。
サポートされていないタイプ:
DATETIMESTAMP [WITH TIME ZONE]SDO_GEOMETRYCUSTOM TYPE
2.ON MISMATCH 句はサポートされていません¶
現在、 ON MISMATCH 句はサポートされておらず、代わりに警告 EWI が表示されます。したがって、翻訳されたコードは、 ON MISMATCH 句が元々指定されていなかったかのように動作します。
3.複雑なフィルターはサポートされていません¶
複数の式を持つ複雑なフィルターはサポートされていないためnullを返します。
例えば、先ほどと同じデータで、この JSON パス $.store.book[*]?(@.category == "reference").title がサポートされており、 'Sayings of the Century' を返します。
しかし、 $.store.book[*]?(@.category == "reference" && @.price < 10).title は、フィルターに複数の式が使用されているため、 null を返します。
関連 EWIs¶
SSC-EWI-0021:Snowflakeではサポートされていません。
JULIAN TO GREGORIAN DATE UDF¶
説明¶
このユーザー定義関数(UDF)は、ユリウス日付形式をグレゴリオ日付形式に変換するために使用されます。ユリウス日付は、 JD Edwards World、天文学、または通常の形式など、3つの異なる形式で受信することができます。
カスタム UDF オーバーロード¶
JULIAN_TO_GREGORIAN_DATE_UDF(julianDate, formatSelected)¶
グレゴリオ日付形式 YYYY-MM-DD の文字列を返します。
パラメーター:¶
JulianDate: キャストされるユリウス日付。CYYDDD (Cは世紀)または YYYYDDD のいずれかになります。
formatSelected: ユリウス日付の処理形式を表します。また、これは CHAR であり、以下の形式を受け入れることができます。
利用可能な形式 |
CHAR の文字表現 |
説明 |
|---|---|---|
標準化された天文学 |
'J' |
デフォルトの形式です。このキャストは、 US の天文応用部門の将来の変換を念頭に置いています。この場合のユリウス日付形式は YYYYDDD です。 |
JD Edwards World |
'E' |
この場合、受け取る予定のユリウス日付は CYYDDD になります(ここで、Cは世紀を表し、対応する数値に19を加算して計算されます)。 |
序数日付 |
'R' |
序数日付は、簡潔な日付を表す数字の配列です。形式は YYYYDDD で、年の部分は変更できないため簡単に読むことができます。 |
UDF¶
CREATE OR REPLACE FUNCTION PUBLIC.JULIAN_TO_GREGORIAN_DATE_UDF(JULIAN_DATE CHAR(7), FORMAT_SELECTED CHAR(1))
RETURNS variant
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}'
AS
$$
const CONST_FOR_MODIFIED_JULIAN_DATE = 0.5;
const BEGINNING_OF_GREG_CALENTAR = 2299161;
const CONST_AFTER_GREG_VALUE = 1867216.25;
const DIVIDENT_TO_GET_CENTURY = 36524.25;
const LEAP_YEAR_CONSTANT = 4;
const CONST_TO_GET_DAY_OF_MONTH = 30.6001;
//Functions definitions
function julianToGregorian(julianDate){
const JD = julianDate + CONST_FOR_MODIFIED_JULIAN_DATE; //setting modified julian date
const Z = Math.floor(JD); //setting fractional part of julian day
const F = JD - Z; //fractional part of the julian date
let A, alpha, B, C, D, E, year, month, day;
//verification for the beginning of gregorian calendar
if(Z < BEGINNING_OF_GREG_CALENTAR){
A=Z;
} else {
//alpha is for dates after the beginning of gregorian calendar
alpha = Math.floor((Z-CONST_AFTER_GREG_VALUE) / DIVIDENT_TO_GET_CENTURY);
A=Z+1+alpha - Math.floor(alpha/LEAP_YEAR_CONSTANT);
}
B = A + 1524;
C = Math.floor((B-122.1)/365.25);
D = Math.floor(365.25*C);
E = Math.floor((B-D)/CONST_TO_GET_DAY_OF_MONTH);
day= Math.floor(B-D-Math.floor(CONST_TO_GET_DAY_OF_MONTH*E)+F);
month=(E<14)? E -1: E-13;
year=(month>2)? C-4716: C-4715;
return new Date(year, month-1, day);
}
function cyydddToGregorian(julianDate){
var c=Math.floor(julianDate/1000);
var yy=(c<80)? c+2000: c+1900;
var ddd=julianDate%1000;
var date= new Date(yy, 0);
date.setDate(ddd);
return date;
}
function ordinalDate(ordinalDate){
const year = parseInt(ordinalDate.toString().substring(0,4));
const dayOfYear = parseInt(ordinalDate.toString().substring(4));
const date = new Date(year, 0); //Set date to the first day of year
date.setDate(dayOfYear);
return date;
}
function formatDate(toFormatDate){
toFormatDate = toFormatDate.toDateString();
let year = toFormatDate.split(" ")[3];
let month = toFormatDate.split(" ")[1];
let day = toFormatDate.split(" ")[2];
return new Date(month + day + ", " + Math.abs(year)).toISOString().split('T')[0]
}
switch(FORMAT_SELECTED){
case 'E':
//JD Edwards World formar, century added - CYYDDD
var result = formatDate(cyydddToGregorian(parseInt(JULIAN_DATE)));
return result;
break;
case 'J':
//astronomical format YYYYDDD
return formatDate(julianToGregorian(parseInt(JULIAN_DATE)));
break;
case 'R':
//ordinal date format YYYYDDD
return formatDate(ordinalDate(parseInt(JULIAN_DATE)));
break;
default: return null;
}
$$
;
使用例¶
Oracle¶
select to_date('2020001', 'J') from dual;
結果¶
TO_DATE('2020001', 'J') |
|---|
18-JUN-18 |
フォーマットされた結果¶
TO_CHAR(TO_DATE('2020001', 'J'), 'YYYY-MON-DD') |
|---|
0818-JUN-18 |
注意: 日付は、年のすべての桁を視覚化するために形式化する必要があります。
Snowflake¶
select
PUBLIC.JULIAN_TO_GREGORIAN_DATE_UDF('2020001', 'J')
from dual;
結果¶
JULIAN_TO_GREGORIAN_DATE_UDF('2020001', 'J') |
|---|
「0818-06-18」 |
既知の問題¶
その他の形式: ユリウス日付がサポートされていない形式で形式化されている場合、出力に違いが生じます。
日付のSnowflake関数がサポートされていないため、B.C.日付の範囲が矛盾している可能性があります。
関連 EWIs¶
関連する EWIs なし。
MONTHS BETWEEN UDF [DEPRECATED]¶
危険
この UDF は廃止されました。Oracle MONTHS_BETWEEN()の現在の変換は Snowflake MONTHS_BETWEEN()です。
説明¶
MONTHS_BETWEENは、日付date1とdate2の間の月数を返します。(Oracle MONTHS_BETWEEN SQL 言語リファレンス)
MONTHS_BETWEEN(date1, date2)
Oracle MONTHS_BETWEEN とSnowflake MONTHS_BETWEEN 関数には、いくつかの機能的な違いがあります。これらの違いを最小化し、Oracle MONTHS_BETWEEN 関数をよりよく複製するために、カスタム UDF を追加しました。
カスタム UDF オーバーロード¶
MONTHS_BETWEEN_UDF(timestamp_ltz, timestamp_ltz)¶
パラメーター
FIRST_DATE: 操作の最初の
TIMESTAMP_LTZ。SECOND_DATE: 操作の2番目の
TIMESTAMP_LTZ。
UDF¶
CREATE OR REPLACE FUNCTION MONTHS_BETWEEN_UDF(FIRST_DATE TIMESTAMP_LTZ, SECOND_DATE TIMESTAMP_LTZ)
RETURNS NUMBER
IMMUTABLE
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}'
AS
$$
ROUND(MONTHS_BETWEEN(FIRST_DATE, SECOND_DATE))
$$
;
Oracle¶
SELECT
MONTHS_BETWEEN('2000-03-20 22:01:11', '1996-03-20 10:01:11'),
MONTHS_BETWEEN('1996-03-20 22:01:11', '2000-03-20 10:01:11'),
MONTHS_BETWEEN('1982-05-11 22:31:19', '1900-01-25 15:21:15'),
MONTHS_BETWEEN('1999-12-25 01:15:16', '1900-12-11 02:05:16')
FROM DUAL;
結果¶
MONTHS_BETWEEN('2000-03-2022:01:11','1996-03-2010:01:11') |
MONTHS_BETWEEN('1996-03-2022:01:11','2000-03-2010:01:11') |
MONTHS_BETWEEN('1982-05-1122:31:19','1900-01-2515:21:15') |
MONTHS_BETWEEN('1999-12-2501:15:16','1900-12-1102:05:16') |
|---|---|---|---|
48 |
-48 |
987.558021206690561529271206690561529271 |
1188.450492831541218637992831541218637993 |
Snowflake¶
SELECT
MONTHS_BETWEEN('2000-03-20 22:01:11', '1996-03-20 10:01:11'),
MONTHS_BETWEEN('1996-03-20 22:01:11', '2000-03-20 10:01:11'),
MONTHS_BETWEEN('1982-05-11 22:31:19', '1900-01-25 15:21:15'),
MONTHS_BETWEEN('1999-12-25 01:15:16', '1900-12-11 02:05:16')
FROM DUAL;
結果¶
MONTHS_BETWEEN_UDF('2000-03-20 22:01:11', '1996-03-20 10:01:11') |
MONTHS_BETWEEN_UDF('1996-03-20 22:01:11', '2000-03-20 10:01:11') |
MONTHS_BETWEEN_UDF('1982-05-11 22:31:19', '1900-01-25 15:21:15') |
MONTHS_BETWEEN_UDF('1999-12-25 01:15:16', '1900-12-11 02:05:16') |
|---|---|---|---|
48.000000 |
-48.000000 |
987.558024 |
1188.450497 |
既知の問題¶
1.精度はOracleと異なる場合があります¶
結果によっては小数点の桁数が異なる場合があります。
関連 EWIs¶
関連 EWIs はありません。
REGEXP LIKE UDF¶
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明¶
REGEXP_LIKEは正規表現マッチングを行います。この条件は、入力文字セットで定義された文字を使用して文字列を評価します。(Oracle言語リファレンス REGEXP_LIKE 条件)
REGEXP_LIKE(source_char, pattern [, match_param ])
Oracle REGEXP_LIKE とSnowflake REGEXP_LIKE 条件には、いくつかの機能的な違いがあります。これらの違いを最小化し、Oracle REGEXP_LIKE 関数をよりよく複製するために、カスタム UDF を追加しました。主なアイデアは、バックスラッシュ記号が必要な正規表現からバックスラッシュ記号をエスケープすることです。これらは、バックスラッシュを伴う場合にエスケープする必要がある特殊文字です: 'd'、'D'、'w'、'W'、's'、'S'、'A'、'Z'、'n'。また、 後方参照式 (「指定された数」のキャプチャグループによって最近マッチしたものと同じテキストにマッチする)は、エスケープする必要があります。
カスタム UDF オーバーロード¶
REGEXP_LIKE_UDF(string, string)¶
パラメーター¶
COL: は検索値となる文字式です。
PATTERN: は正規表現です。
UDF¶
CREATE OR REPLACE FUNCTION REGEXP_LIKE_UDF(COL STRING, PATTERN STRING)
RETURNS BOOLEAN
LANGUAGE JAVASCRIPT
IMMUTABLE
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}'
AS
$$
return COL.match(new RegExp(PATTERN));
$$;
Oracle¶
Snowflake¶
REGEXP_LIKE_UDF(string, string, string)¶
パラメーター¶
COL: は検索値となる文字式です。
PATTERN: は正規表現です。
MATCHPARAM: 条件のデフォルトのマッチング動作を変更する文字式です。次のテーブルは、Oracle文字とその説明、および UDF における等価文字です。
マッチパラメーター |
説明 |
UDF の同等物 |
|---|---|---|
'i' |
条件の決定された照合が大文字と小文字を区別する場合でも、大文字と小文字を区別しない一致を指定します。 |
'i' |
'c' |
条件の決定された照合が大文字と小文字を区別しない、またはアクセントを区別しない場合でも、大文字と小文字を区別し、アクセントを区別する一致を指定します。 |
同等物はありません。パラメーターから削除されます。 |
'n' |
任意の文字に一致するワイルドカード文字であるピリオド(.)が改行文字に一致するようにします。このパラメーターを省略した場合、ピリオドは改行文字と一致しません。 |
's' |
'm' |
ソース文字列を複数行として扱います。Oracleは、 |
'm' |
'x' |
空白文字を無視します。デフォルトでは、空白文字はそれ自体に一致します。 |
同等物はありません。パラメーターから削除されます。 |
UDF¶
CREATE OR REPLACE FUNCTION REGEXP_LIKE_UDF(COL STRING, PATTERN STRING, MATCHPARAM STRING)
RETURNS BOOLEAN
LANGUAGE JAVASCRIPT
IMMUTABLE
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}'
AS
$$
return COL.match(new RegExp(PATTERN, MATCHPARAM));
$$;
Oracle¶
Snowflake¶
既知の問題¶
1. UDF マッチパラメーターが期待通りに動作しない可能性があります¶
Oracleのマッチパラメーターで使用可能なすべての文字がユーザー定義関数で同等の機能を持っていないため、クエリ結果はOracleと比較して機能的に異なる場合があります。
2.UDF パターンパラメーターでは、正規表現として「\\」のみは使用できません¶
パターンパラメーターとして使用される正規表現が「\\」のみである場合、次のような例外がスローされます: JavaScript 実行エラー: キャッチされない SyntaxError: 無効な正規表現: //: \ REGEXP_LIKE_UDF パターンの末尾、'return COL.match(new RegExp(PATTERN));' 位置17スタックトレース: REGEXP_LIKE_UDF
TIMESTAMP DIFF UDF¶
説明¶
Snowflakeでは、 - オペランドを使用した TIMESTAMP データ型間の加算演算はサポートされていません。この機能を複製するために、カスタム UDF を追加しました。
カスタム UDF オーバーロード¶
TIMESTAMP_DIFF_UDF(timestamp, timestamp)¶
パラメーター
LEFT_TS: 操作の最初の
TIMESTAMP。RIGHT_TS: 追加される
TIMESTAMP。
UDF¶
CREATE OR REPLACE FUNCTION TIMESTAMP_DIFF_UDF(LEFT_TS TIMESTAMP, RIGHT_TS TIMESTAMP )
RETURNS VARCHAR
LANGUAGE SQL
IMMUTABLE
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}'
AS
$$
WITH RESULTS(days,hours,min,sec,millisecond,sign) AS
(
SELECT
abs(TRUNC(x/1000/3600/24)) days,
abs(TRUNC(x/1000/60 / 60)-trunc(x/1000/3600/24)*24) hours,
abs(TRUNC(MOD(x/1000,3600)/60)) min,
abs(TRUNC(MOD(x/1000,60))) sec,
abs(TRUNC(MOD(x,1000))) millisecond,
SIGN(x)
FROM (SELECT TIMESTAMPDIFF(millisecond, RIGHT_TS, LEFT_TS) x ,SIGN(TIMESTAMPDIFF(millisecond, RIGHT_TS, LEFT_TS)) sign))
SELECT
IFF(SIGN>0,'+','-') || TRIM(TO_CHAR(days,'000000000')) || ' ' || TO_CHAR(hours,'00') || ':' || TRIM(TO_CHAR(min,'00')) || ':' || TRIM(TO_CHAR(sec,'00')) || '.' || TRIM(TO_CHAR(millisecond,'00000000'))
from RESULTS
$$;
Oracle¶
--Create Table
CREATE TABLE timestampdiff_table (col1 TIMESTAMP, col2 TIMESTAMP);
--Insert data
INSERT INTO timestampdiff_table VALUES ('2000-03-20 22:01:11', '1996-03-20 10:01:11');
INSERT INTO timestampdiff_table VALUES ('1996-03-20 22:01:11', '2000-03-20 10:01:11');
INSERT INTO timestampdiff_table VALUES ('1982-05-11 22:31:19', '1900-01-25 15:21:15');
INSERT INTO timestampdiff_table VALUES ('1999-12-25 01:15:16', '1900-12-11 02:05:16');
--Select
SELECT col1 - col2 FROM timestampdiff_table;
結果¶
COL1-COL2 |
|---|
1461 12:0:0.0 |
-1460 12:0:0.0 |
30056 7:10:4.0 |
36172 23:10:0.0 |
Snowflake¶
--Create Table
CREATE OR REPLACE TABLE timestampdiff_table (col1 TIMESTAMP(6),
col2 TIMESTAMP(6)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;
--Insert data
INSERT INTO timestampdiff_table
VALUES ('2000-03-20 22:01:11', '1996-03-20 10:01:11');
INSERT INTO timestampdiff_table
VALUES ('1996-03-20 22:01:11', '2000-03-20 10:01:11');
INSERT INTO timestampdiff_table
VALUES ('1982-05-11 22:31:19', '1900-01-25 15:21:15');
INSERT INTO timestampdiff_table
VALUES ('1999-12-25 01:15:16', '1900-12-11 02:05:16');
--Select
SELECT
PUBLIC.TIMESTAMP_DIFF_UDF( col1, col2) FROM
timestampdiff_table;
結果¶
TIMESTAMP_DIFF_UDF( COL1, COL2) |
|---|
+000001461 12:00:00.00000000 |
-000001460 12:00:00.00000000 |
+000030056 07:10:04.00000000 |
+000036172 23:10:00.00000000 |
既知の問題¶
1.TIMESTAMP 形式がOracleと異なる場合があります¶
TIMESTAMP 形式がOracleと異なる場合があります。TIMESTAMP データ型を使用する場合は、TIMESTAMP_OUTPUT_FORMAT 設定 を考慮してください。
関連 EWIs¶
関連 EWIs はありません。
TRUNC (date) UDF¶
説明¶
TRUNC(date)関数は、形式モデルfmtで指定された単位に時刻部分が切り捨てられたdateを返します。(Oracle TRUNC(date) SQL 言語リファレンス)
TRUNC(date [, fmt ])
Oracle TRUNC とSnowflake TRUNC 関数の日付引数にはいくつかの機能的な違いがあります。
以下のケースを処理するために TRUNC_UDF ヘルパーが追加されます。
1.この形式はSnowflakeではサポートされていません。
2.この形式はSnowflakeにも存在しますが、動作は異なります。
3.ツールは第1引数のデータ型を判別できません。
4.形式はリテラルではなく、列または式として提供されます。
カスタム UDF オーバーロード¶
TRUNC_UDF(date)¶
入力されたタイムスタンプに対して、明示的な DATE の キャスト を適用します。
パラメーター
INPUT: 切り捨てる必要があるタイムゾーン(TIMESTAMP_LTZ) 付きのタイムスタンプ。
警告
UDF のデフォルトパラメーターは TIMESTAMP_LTZ です。ユーザーが使用するデフォルトの TIMESTAMP に合わせて、TIMESTAMP_TZ または TIMESTAMP_NTZ に変更する必要があるかもしれません。
UDF¶
CREATE OR REPLACE FUNCTION PUBLIC.TRUNC_UDF(INPUT TIMESTAMP_LTZ)
RETURNS DATE
IMMUTABLE
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}'
AS
$$
INPUT::DATE
$$;
Oracle¶
SELECT
TRUNC(
TO_TIMESTAMP ( '20-Mar-1996 21:01:11 ', 'DD-Mon-YYYY HH24:MI:SS' )
)
"Date" FROM DUAL;
結果¶
Date |
|---|
1996-03-20 00:00:00.000 |
Snowflake¶
SELECT
TRUNC(
TO_TIMESTAMP ( '20-Mar-1996 21:01:11 ', 'DD-Mon-YYYY HH24:MI:SS' ), 'DD'
)
"Date" FROM DUAL;
結果¶
DATE |
|---|
1996-03-20 |
TRUNC_UDF(date, fmt)¶
DATE_FROM_PARTS() 関数 を使用して、使用する形式カテゴリに応じて新しい日付を手動で作成します。
パラメーター
DATE_TO_TRUNC: 切り捨てる必要があるタイムゾーン(TIMESTAMP_LTZ) 付きのタイムスタンプ。
DATE_FMT: 日付形式としての VARCHAR。Oracleで サポートされている形式 と同じです。
警告
UDF のデフォルトパラメーターは TIMESTAMP_LTZ です。ユーザーが使用するデフォルトの TIMESTAMP に合わせて、TIMESTAMP_TZ または TIMESTAMP_NTZ に変更する必要があるかもしれません。
UDF¶
CREATE OR REPLACE FUNCTION PUBLIC.TRUNC_UDF(DATE_TO_TRUNC TIMESTAMP_LTZ, DATE_FMT VARCHAR(5))
RETURNS DATE
IMMUTABLE
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}'
AS
$$
CAST(CASE
WHEN UPPER(DATE_FMT) IN ('CC','SCC') THEN DATE_FROM_PARTS(CAST(LEFT(CAST(YEAR(DATE_TO_TRUNC) as CHAR(4)),2) || '01' as INTEGER),1,1)
WHEN UPPER(DATE_FMT) IN ('SYYYY','YYYY','YEAR','SYEAR','YYY','YY','Y') THEN DATE_FROM_PARTS(YEAR(DATE_TO_TRUNC),1,1)
WHEN UPPER(DATE_FMT) IN ('IYYY','IYY','IY','I') THEN
CASE DAYOFWEEK(DATE_FROM_PARTS(YEAR(DATE_TO_TRUNC),1,1))
WHEN 0 THEN DATEADD(DAY, 1, DATE_FROM_PARTS(YEAR(DATE_TO_TRUNC),1,1))
WHEN 1 THEN DATEADD(DAY, 0, DATE_FROM_PARTS(YEAR(DATE_TO_TRUNC),1,1))
WHEN 2 THEN DATEADD(DAY, -1, DATE_FROM_PARTS(YEAR(DATE_TO_TRUNC),1,1))
WHEN 3 THEN DATEADD(DAY, -2, DATE_FROM_PARTS(YEAR(DATE_TO_TRUNC),1,1))
WHEN 4 THEN DATEADD(DAY, -3, DATE_FROM_PARTS(YEAR(DATE_TO_TRUNC),1,1))
WHEN 5 THEN DATEADD(DAY, 3, DATE_FROM_PARTS(YEAR(DATE_TO_TRUNC),1,1))
WHEN 6 THEN DATEADD(DAY, 2, DATE_FROM_PARTS(YEAR(DATE_TO_TRUNC),1,1))
END
WHEN UPPER(DATE_FMT) IN ('MONTH','MON','MM','RM') THEN DATE_FROM_PARTS(YEAR(DATE_TO_TRUNC),MONTH(DATE_TO_TRUNC),1)
WHEN UPPER(DATE_FMT)IN ('Q') THEN DATE_FROM_PARTS(YEAR(DATE_TO_TRUNC),(QUARTER(DATE_TO_TRUNC)-1)*3+1,1)
WHEN UPPER(DATE_FMT) IN ('WW') THEN DATEADD(DAY, 0-MOD(TIMESTAMPDIFF(DAY,DATE_FROM_PARTS(YEAR(DATE_TO_TRUNC),1,1),DATE_TO_TRUNC),7), DATE_TO_TRUNC)
WHEN UPPER(DATE_FMT) IN ('IW') THEN DATEADD(DAY, 0-MOD(TIMESTAMPDIFF(DAY,(CASE DAYOFWEEK(DATE_FROM_PARTS(YEAR(DATE_TO_TRUNC),1,1))
WHEN 0 THEN DATEADD(DAY, 1, DATE_FROM_PARTS(YEAR(DATE_TO_TRUNC),1,1))
WHEN 1 THEN DATEADD(DAY, 0, DATE_FROM_PARTS(YEAR(DATE_TO_TRUNC),1,1))
WHEN 2 THEN DATEADD(DAY, -1, DATE_FROM_PARTS(YEAR(DATE_TO_TRUNC),1,1))
WHEN 3 THEN DATEADD(DAY, -2, DATE_FROM_PARTS(YEAR(DATE_TO_TRUNC),1,1))
WHEN 4 THEN DATEADD(DAY, -3, DATE_FROM_PARTS(YEAR(DATE_TO_TRUNC),1,1))
WHEN 5 THEN DATEADD(DAY, 3, DATE_FROM_PARTS(YEAR(DATE_TO_TRUNC),1,1))
WHEN 6 THEN DATEADD(DAY, 2, DATE_FROM_PARTS(YEAR(DATE_TO_TRUNC),1,1))
END), DATE_TO_TRUNC),7), DATE_TO_TRUNC)
WHEN UPPER(DATE_FMT) IN ('W') THEN DATEADD(DAY, 0-MOD(TIMESTAMPDIFF(DAY,DATE_FROM_PARTS(YEAR(DATE_TO_TRUNC),MONTH(DATE_TO_TRUNC),1),DATE_TO_TRUNC),7), DATE_TO_TRUNC)
WHEN UPPER(DATE_FMT) IN ('DDD', 'DD','J') THEN DATE_TO_TRUNC
WHEN UPPER(DATE_FMT) IN ('DAY', 'DY','D') THEN DATEADD(DAY, 0-DAYOFWEEK(DATE_TO_TRUNC), DATE_TO_TRUNC)
WHEN UPPER(DATE_FMT) IN ('HH', 'HH12','HH24') THEN DATE_TO_TRUNC
WHEN UPPER(DATE_FMT) IN ('MI') THEN DATE_TO_TRUNC
END AS DATE)
$$
;
TRUNC 形式シナリオ¶
警告
結果の形式は、データベース用に構成された DateTime 出力形式に依存します。
1.ネイティブ対応形式¶
Oracle¶
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'YYYY') FROM DUAL UNION ALL
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'YEAR') FROM DUAL UNION ALL
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'YYY') FROM DUAL UNION ALL
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'YY') FROM DUAL UNION ALL
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'Y') FROM DUAL UNION ALL
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'Q') FROM DUAL UNION ALL
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'MONTH') FROM DUAL UNION ALL
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'MON') FROM DUAL UNION ALL
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'MM') FROM DUAL UNION ALL
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'DD') FROM DUAL UNION ALL
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'HH') FROM DUAL UNION ALL
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'MI') FROM DUAL;
結果¶
TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'YYYY') |
|---|
01-JAN-22 |
01-JAN-22 |
01-JAN-22 |
01-JAN-22 |
01-JAN-22 |
01-APR-22 |
01-APR-22 |
01-APR-22 |
01-APR-22 |
20-APR-22 |
20-APR-22 |
20-APR-22 |
Snowflake¶
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'YYYY') FROM DUAL UNION ALL
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'YEAR') FROM DUAL UNION ALL
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'YYY') FROM DUAL UNION ALL
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'YY') FROM DUAL UNION ALL
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'Y') FROM DUAL UNION ALL
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'Q') FROM DUAL UNION ALL
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'MONTH') FROM DUAL UNION ALL
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'MON') FROM DUAL UNION ALL
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'MM') FROM DUAL UNION ALL
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'DD') FROM DUAL UNION ALL
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'HH') FROM DUAL UNION ALL
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'MI') FROM DUAL;
結果¶
TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'YYYY') |
|---|
2022-01-01 |
2022-01-01 |
2022-01-01 |
2022-01-01 |
2022-01-01 |
2022-04-01 |
2022-04-01 |
2022-04-01 |
2022-04-01 |
2022-04-20 |
2022-04-20 |
2022-04-20 |
2.別の形式にマッピングされた形式¶
Oracle¶
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS')) FROM DUAL UNION ALL
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'SYYYY') FROM DUAL UNION ALL
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'SYEAR') FROM DUAL UNION ALL
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'RM') FROM DUAL UNION ALL
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'IW') FROM DUAL UNION ALL
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'DDD') FROM DUAL UNION ALL
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'J') FROM DUAL UNION ALL
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'HH12') FROM DUAL UNION ALL
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'HH24') FROM DUAL;
結果¶
TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS')) |
|---|
20-APR-22 |
01-JAN-22 |
01-JAN-22 |
01-APR-22 |
18-APR-22 |
20-APR-22 |
20-APR-22 |
20-APR-22 |
20-APR-22 |
Snowflake¶
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'), 'DD') FROM DUAL UNION ALL
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'), 'YYYY') FROM DUAL UNION ALL
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'), 'YEAR') FROM DUAL UNION ALL
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'), 'MM') FROM DUAL UNION ALL
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'), 'WK') FROM DUAL UNION ALL
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'), 'DD') FROM DUAL UNION ALL
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'), 'D') FROM DUAL UNION ALL
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'), 'HH') FROM DUAL UNION ALL
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'), 'HH') FROM DUAL;
結果¶
TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'), 'DD') |
|---|
2022-04-20 |
2022-01-01 |
2022-01-01 |
2022-04-01 |
2022-04-18 |
2022-04-20 |
2022-04-20 |
2022-04-20 |
2022-04-20 |
3.日の形式¶
Oracle¶
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'DAY') FROM DUAL UNION ALL
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'DY') FROM DUAL UNION ALL
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'D') FROM DUAL;
結果¶
TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'DAY') |
|---|
17-APR-22 |
17-APR-22 |
17-APR-22 |
Snowflake¶
SELECT
TRUNC_UDF(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'DAY') FROM DUAL UNION ALL
SELECT
TRUNC_UDF(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'DY') FROM DUAL UNION ALL
SELECT
TRUNC_UDF(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'D') FROM DUAL;
結果¶
TRUNC_UDF(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'DAY') |
|---|
2022-04-17 |
2022-04-17 |
2022-04-17 |
4.サポートされていない形式¶
Oracle¶
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'CC') FROM DUAL UNION ALL
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'SCC') FROM DUAL UNION ALL
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'IYYY') FROM DUAL UNION ALL
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'IY') FROM DUAL UNION ALL
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'I') FROM DUAL UNION ALL
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'WW') FROM DUAL UNION ALL
SELECT TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'W') FROM DUAL;
結果¶
TRUNC(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'CC') |
|---|
01-JAN-01 |
01-JAN-01 |
03-JAN-22 |
03-JAN-22 |
03-JAN-22 |
16-APR-22 |
15-APR-22 |
Snowflake¶
SELECT
TRUNC_UDF(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'CC') FROM DUAL UNION ALL
SELECT
TRUNC_UDF(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'SCC') FROM DUAL UNION ALL
SELECT
TRUNC_UDF(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'IYYY') FROM DUAL UNION ALL
SELECT
TRUNC_UDF(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'IY') FROM DUAL UNION ALL
SELECT
TRUNC_UDF(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'I') FROM DUAL UNION ALL
SELECT
TRUNC_UDF(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'WW') FROM DUAL UNION ALL
SELECT
TRUNC_UDF(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'W') FROM DUAL;
結果¶
TRUNC_UDF(TO_DATE('20/04/2022 13:21:10','DD/MM/YYYY HH24:MI:SS'),'CC') |
|---|
2001-01-01 |
2001-01-01 |
2022-01-03 |
2022-01-03 |
2022-01-03 |
2022-04-16 |
2022-04-15 |
注釈
TRUNC 関数が、サポートされていない形式または SnowConvert AI で扱えないパラメーターで使用された場合。問題を避けるため、形式が有効な形式に置き換えられるか、 TRUNC_UDF が追加されます。
既知の問題¶
1.Oracle DATE には TIMESTAMP が含まれています¶
Oracleの DATE には空の TIMESTAMP (00:00:00.000)が含まれていますが、Snowflakeの DATE には含まれていないことを考慮してください。
関連 EWIs¶
関連 EWIs はありません。
TRUNC (数値) UDF¶
説明¶
TRUNC(数値)関数はn1をn2小数点以下の桁数で切り捨てたものを返します。n2が省略された場合、n1は0位に切り捨てられます。n2を負にすると、n2の小数点の左側の桁を切り捨てます(ゼロにします)。(Oracle TRUNC (数値) SQL 言語リファレンス)
TRUNC(n1 [, n2 ])
最初の列が認識できないデータ型を持つ ケースを扱うために、数値用の ୧TRUNC_UDF が追加されます。
例:
SELECT TRUNC(column1) FROM DUAL;
column1 の定義がツールに提供されていない場合。その後、 TRUNC_UDF が追加され、実行時に TRUNC_UDF のオーバーロードによって、数値型か日付型かのケースが処理されます。
TRUNC (DATE) セクションを参照してください。
以下のセクションでは、 TRUNC_UDF が完全な数値を扱うことを証明します。
カスタム UDF オーバーロード¶
TRUNC_UDF(n1)¶
Snowflake TRUNC 関数 を入力番号で呼び出します。このオーバーロードは、移行中に情報が利用できない場合に備えて、さまざまなタイプのパラメーターシナリオを処理するために存在します。
パラメーター
INPUT: 切り捨てる必要のある
NUMBER。
UDF¶
CREATE OR REPLACE FUNCTION PUBLIC.TRUNC_UDF(INPUT NUMBER)
RETURNS INT
IMMUTABLE
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}'
AS
$$
TRUNC(INPUT)
$$;
Oracle¶
--TRUNC(NUMBER)
SELECT
TRUNC ( 1.000001 ),
TRUNC ( 15.79 ),
TRUNC ( -975.975 ),
TRUNC ( 135.135 )
FROM DUAL;
結果¶
TRUNC(1.000001) |
TRUNC(15.79) |
TRUNC(-975.975) |
TRUNC(135.135) |
|---|---|---|---|
1 |
15 |
-975 |
135 |
Snowflake¶
--TRUNC(NUMBER)
SELECT
TRUNC ( 1.000001 ),
TRUNC ( 15.79 ),
TRUNC ( -975.975 ),
TRUNC ( 135.135 )
FROM DUAL;
結果¶
TRUNC_UDF(1.000001) |
TRUNC_UDF(15.79) |
TRUNC_UDF(-975.975) |
TRUNC_UDF(135.135) |
|---|---|---|---|
1 |
15 |
-975 |
135 |
TRUNC_UDF(n1, n2)¶
Snowflake TRUNC 関数 を入力番号とスケールで呼び出します。このオーバーロードは、移行中に情報が利用できない場合に備えて、さまざまなタイプのパラメーターシナリオを処理するために存在します。
パラメーター
INPUT: 切り捨てる必要のある
NUMBER。SCALE: 小数点以下の出力桁数を表します。
UDF¶
CREATE OR REPLACE FUNCTION PUBLIC.TRUNC_UDF(INPUT NUMBER, SCALE NUMBER)
RETURNS INT
IMMUTABLE
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}'
AS
$$
TRUNC(INPUT, SCALE)
$$;
Oracle¶
--TRUNC(NUMBER, SCALE)
SELECT
TRUNC ( 1.000001, -2 ),
TRUNC ( 1.000001, -1 ),
TRUNC ( 1.000001, 0 ),
TRUNC ( 1.000001, 1 ),
TRUNC ( 1.000001, 2 ),
TRUNC ( 15.79, -2),
TRUNC ( 15.79, -1),
TRUNC ( 15.79, 0),
TRUNC ( 15.79, 1 ),
TRUNC ( 15.79, 50 ),
TRUNC ( -9.6, -2 ),
TRUNC ( -9.6, -1 ),
TRUNC ( -9.6, 0 ),
TRUNC ( -9.6, 1 ),
TRUNC ( -9.6, 2 ),
TRUNC ( -975.975, -3 ),
TRUNC ( -975.975, -2 ),
TRUNC ( -975.975, -1 ),
TRUNC ( -975.975, 0 ),
TRUNC ( -975.975, 1 ),
TRUNC ( -975.975, 2 ),
TRUNC ( -975.975, 3 ),
TRUNC ( -975.975, 5 ),
TRUNC ( 135.135, -10 ),
TRUNC ( 135.135, -2 ),
TRUNC ( 135.135, 0 ),
TRUNC ( 135.135, 1 ),
TRUNC ( 135.135, 2 ),
TRUNC ( 135.135, 3 ),
TRUNC ( 135.135, 5 )
FROM DUAL;
結果¶
TRUNC(1.000001,-2) |
TRUNC(1.000001,-1) |
TRUNC(1.000001,0) |
TRUNC(1.000001,1) |
TRUNC(1.000001,2) |
TRUNC(15.79,-2) |
TRUNC(15.79,-1) |
TRUNC(15.79,0) |
TRUNC(15.79,1) |
TRUNC(15.79,50) |
TRUNC(-9.6,-2) |
TRUNC(-9.6,-1) |
TRUNC(-9.6,0) |
TRUNC(-9.6,1) |
TRUNC(-9.6,2) |
TRUNC(-975.975,-3) |
TRUNC(-975.975,-2) |
TRUNC(-975.975,-1) |
TRUNC(-975.975,0) |
TRUNC(-975.975,1) |
TRUNC(-975.975,2) |
TRUNC(-975.975,3) |
TRUNC(-975.975,5) |
TRUNC(135.135,-10) |
TRUNC(135.135,-2) |
TRUNC(135.135,0) |
TRUNC(135.135,1) |
TRUNC(135.135,2) |
TRUNC(135.135,3) |
TRUNC(135.135,5) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 |
0 |
1 |
1 |
1 |
0 |
10 |
15 |
15.7 |
15.79 |
0 |
0 |
-9 |
-9.6 |
-9.6 |
0 |
-900 |
-970 |
-975 |
-975.9 |
-975.97 |
-975.975 |
-975.975 |
0 |
100 |
135 |
135.1 |
135.13 |
135.135 |
135.135 |
Snowflake¶
--TRUNC(NUMBER, SCALE)
SELECT
TRUNC ( 1.000001, -2 ),
TRUNC ( 1.000001, -1 ),
TRUNC ( 1.000001, 0 ),
TRUNC ( 1.000001, 1 ),
TRUNC ( 1.000001, 2 ),
TRUNC ( 15.79, -2),
TRUNC ( 15.79, -1),
TRUNC ( 15.79, 0),
TRUNC ( 15.79, 1 ),
TRUNC ( 15.79, 50 ),
TRUNC ( -9.6, -2 ),
TRUNC ( -9.6, -1 ),
TRUNC ( -9.6, 0 ),
TRUNC ( -9.6, 1 ),
TRUNC ( -9.6, 2 ),
TRUNC ( -975.975, -3 ),
TRUNC ( -975.975, -2 ),
TRUNC ( -975.975, -1 ),
TRUNC ( -975.975, 0 ),
TRUNC ( -975.975, 1 ),
TRUNC ( -975.975, 2 ),
TRUNC ( -975.975, 3 ),
TRUNC ( -975.975, 5 ),
TRUNC ( 135.135, -10 ),
TRUNC ( 135.135, -2 ),
TRUNC ( 135.135, 0 ),
TRUNC ( 135.135, 1 ),
TRUNC ( 135.135, 2 ),
TRUNC ( 135.135, 3 ),
TRUNC ( 135.135, 5 )
FROM DUAL;
結果¶
TRUNC_UDF ( 1.000001, -2 ) |
TRUNC_UDF ( 1.000001, -1 ) |
TRUNC_UDF ( 1.000001, 0 ) |
TRUNC_UDF ( 1.000001, 1 ) |
TRUNC_UDF ( 1.000001, 2 ) |
TRUNC_UDF ( 15.79, -2) |
TRUNC_UDF ( 15.79, -1) |
TRUNC_UDF ( 15.79, 0) |
TRUNC_UDF ( 15.79, 1 ) |
TRUNC_UDF ( 15.79, 50 ) |
TRUNC_UDF ( -9.6, -2 ) |
TRUNC_UDF ( -9.6, -1 ) |
TRUNC_UDF ( -9.6, 0 ) |
TRUNC_UDF ( -9.6, 1 ) |
TRUNC_UDF ( -9.6, 2 ) |
TRUNC_UDF ( -975.975, -3 ) |
TRUNC_UDF ( -975.975, -2 ) |
TRUNC_UDF ( -975.975, -1 ) |
TRUNC_UDF ( -975.975, 0 ) |
TRUNC_UDF ( -975.975, 1 ) |
TRUNC_UDF ( -975.975, 2 ) |
TRUNC_UDF ( -975.975, 3 ) |
TRUNC_UDF ( -975.975, 5 ) |
TRUNC_UDF ( 135.135, -10 ) |
TRUNC_UDF ( 135.135, -2 ) |
TRUNC_UDF ( 135.135, 0 ) |
TRUNC_UDF ( 135.135, 1 ) |
TRUNC_UDF ( 135.135, 2 ) |
TRUNC_UDF ( 135.135, 3 ) |
TRUNC_UDF ( 135.135, 5 ) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 |
0 |
1 |
1.0 |
1.00 |
0 |
10 |
15 |
15.7 |
15.79 |
0 |
0 |
-9 |
-9.6 |
-9.6 |
0 |
-900 |
-970 |
-975 |
-975.9 |
-975.97 |
-975.975 |
-975.975 |
0 |
100 |
135 |
135.1 |
135.13 |
135.135 |
135.135 |
既知の問題¶
問題は見つかりませんでした。
関連 EWIs¶
関連 EWIs はありません。
SnowConvert AI - Oracle - INTERVAL UDFs¶
INTERVAL UDFs の実行に必要なコード¶
いずれかのINTERVAL UDFs を実行するには、事前に以下のコードを実行する必要があります。
CREATE OR REPLACE FUNCTION PUBLIC.INTERVAL2MONTHS_UDF
(INPUT_VALUE VARCHAR())
RETURNS INTEGER
IMMUTABLE
AS
$$
CASE WHEN SUBSTR(INPUT_VALUE,1,1) = '-' THEN
12 * CAST(SUBSTR(INPUT_VALUE,1 , POSITION('-', INPUT_VALUE,2)-1) AS INTEGER)
- CAST(SUBSTR(INPUT_VALUE,POSITION('-', INPUT_VALUE)+1) AS INTEGER)
ELSE
12 * CAST(SUBSTR(INPUT_VALUE,1 , POSITION('-', INPUT_VALUE,2)-1) AS INTEGER)
+ CAST(SUBSTR(INPUT_VALUE,POSITION('-', INPUT_VALUE)+1) AS INTEGER)
END
$$;
CREATE OR REPLACE FUNCTION PUBLIC.INTERVAL2SECONDS_UDF
(INPUT_PART VARCHAR(30), INPUT_VALUE VARCHAR())
RETURNS DECIMAL(20,6)
IMMUTABLE
AS
$$
CASE WHEN SUBSTR(INPUT_VALUE,1,1) = '-' THEN
DECODE(INPUT_PART,
'DAY', 86400 * INPUT_VALUE,
'DAY TO HOUR', 86400 * CAST(SUBSTR(INPUT_VALUE, 1, POSITION(' ', INPUT_VALUE)-1) AS DECIMAL(10,0))
- 3600 * CAST(SUBSTR(INPUT_VALUE, POSITION(' ', INPUT_VALUE)+1) AS DECIMAL(10,0)),
'DAY TO MINUTE', 86400 * CAST(SUBSTR(INPUT_VALUE, 1, POSITION(' ', INPUT_VALUE)-1) AS INTEGER)
- 3600 * CAST(SUBSTR(INPUT_VALUE, POSITION(' ', INPUT_VALUE)+1, POSITION(':', INPUT_VALUE)-POSITION(' ', INPUT_VALUE)-1) AS INTEGER)
- 60 * CAST(SUBSTR(INPUT_VALUE, POSITION(':', INPUT_VALUE)+1) AS INTEGER),
'DAY TO SECOND', 86400 * CAST(SUBSTR(INPUT_VALUE, 1, POSITION(' ', INPUT_VALUE)-1) AS INTEGER)
- 3600 * CAST(SUBSTR(INPUT_VALUE, POSITION(' ', INPUT_VALUE)+1, POSITION(':', INPUT_VALUE)-POSITION(' ', INPUT_VALUE)-1) AS INTEGER)
- 60 * CAST(SUBSTR(INPUT_VALUE, POSITION(':', INPUT_VALUE)+1, POSITION(':', INPUT_VALUE, POSITION(':', INPUT_VALUE)+1) - POSITION(':', INPUT_VALUE) - 1) AS INTEGER)
- CAST(SUBSTR(INPUT_VALUE,POSITION(':', INPUT_VALUE, POSITION(':', INPUT_VALUE)+1)+1) AS DECIMAL(10,6)),
'DAY TO SECOND(3)', 86400 * CAST(SUBSTR(INPUT_VALUE, 1, POSITION(' ', INPUT_VALUE)-1) AS INTEGER)
- 3600 * CAST(SUBSTR(INPUT_VALUE, POSITION(' ', INPUT_VALUE)+1, POSITION(':', INPUT_VALUE)-POSITION(' ', INPUT_VALUE)-1) AS INTEGER)
- 60 * CAST(SUBSTR(INPUT_VALUE, POSITION(':', INPUT_VALUE)+1, POSITION(':', INPUT_VALUE, POSITION(':', INPUT_VALUE)+1) - POSITION(':', INPUT_VALUE) - 1) AS INTEGER)
- CAST(SUBSTR(INPUT_VALUE,POSITION(':', INPUT_VALUE, POSITION(':', INPUT_VALUE)+1)+1) AS DECIMAL(10,6)),
'HOUR(3)', 3600 * INPUT_VALUE,
'HOUR', 3600 * INPUT_VALUE,
'HOUR TO MINUTE', 3600 * CAST(SUBSTR(INPUT_VALUE,1 , POSITION(':', INPUT_VALUE)-1) AS INTEGER)
- 60 * CAST(SUBSTR(INPUT_VALUE,POSITION(':', INPUT_VALUE)+1) AS INTEGER),
'HOUR TO SECOND', 3600 * CAST(SUBSTR(INPUT_VALUE, 1, POSITION(':', INPUT_VALUE)-POSITION(' ', INPUT_VALUE)-1) AS INTEGER)
- 60 * CAST(SUBSTR(INPUT_VALUE, POSITION(':', INPUT_VALUE)+1, POSITION(':', INPUT_VALUE, POSITION(':', INPUT_VALUE)+1) - POSITION(':', INPUT_VALUE) - 1) AS INTEGER)
- CAST(SUBSTR(INPUT_VALUE,POSITION(':', INPUT_VALUE, POSITION(':', INPUT_VALUE)+1)+1) AS DECIMAL(10,6)),
'MINUTE', 60 * INPUT_VALUE,
'MINUTE TO SECOND', 60 * CAST(SUBSTR(INPUT_VALUE, 1, POSITION(':', INPUT_VALUE)-POSITION(' ', INPUT_VALUE)-1) AS INTEGER)
- CAST(SUBSTR(INPUT_VALUE, POSITION(':', INPUT_VALUE)+1) AS DECIMAL(10,6)),
'SECOND(2,3)', INPUT_VALUE,
'SECOND', INPUT_VALUE
)
ELSE
DECODE(INPUT_PART,
'DAY', 86400 * INPUT_VALUE,
'DAY TO HOUR', 86400 * CAST(SUBSTR(INPUT_VALUE, 1, POSITION(' ', INPUT_VALUE)-1) AS INTEGER)
+ 3600 * CAST(SUBSTR(INPUT_VALUE, POSITION(' ', INPUT_VALUE)+1) AS INTEGER),
'DAY TO MINUTE', 86400 * CAST(SUBSTR(INPUT_VALUE, 1, POSITION(' ', INPUT_VALUE)-1) AS INTEGER)
+ 3600 * CAST(SUBSTR(INPUT_VALUE, POSITION(' ', INPUT_VALUE)+1, POSITION(':', INPUT_VALUE)-POSITION(' ', INPUT_VALUE)-1) AS INTEGER)
+ 60 * CAST(SUBSTR(INPUT_VALUE, POSITION(':', INPUT_VALUE)+1) AS INTEGER),
'DAY TO SECOND', 86400 * CAST(SUBSTR(INPUT_VALUE, 1, POSITION(' ', INPUT_VALUE)-1) AS INTEGER)
+ 3600 * CAST(SUBSTR(INPUT_VALUE, POSITION(' ', INPUT_VALUE)+1, POSITION(':', INPUT_VALUE)-POSITION(' ', INPUT_VALUE)-1) AS INTEGER)
+ 60 * CAST(SUBSTR(INPUT_VALUE, POSITION(':', INPUT_VALUE)+1, POSITION(':', INPUT_VALUE, POSITION(':', INPUT_VALUE)+1) - POSITION(':', INPUT_VALUE) - 1) AS INTEGER)
+ CAST(SUBSTR(INPUT_VALUE,POSITION(':', INPUT_VALUE, POSITION(':', INPUT_VALUE)+1)+1) AS DECIMAL(10,6)),
'DAY TO SECOND(3)', 86400 * CAST(SUBSTR(INPUT_VALUE, 1, POSITION(' ', INPUT_VALUE)-1) AS INTEGER)
+ 3600 * CAST(SUBSTR(INPUT_VALUE, POSITION(' ', INPUT_VALUE)+1, POSITION(':', INPUT_VALUE)-POSITION(' ', INPUT_VALUE)-1) AS INTEGER)
+ 60 * CAST(SUBSTR(INPUT_VALUE, POSITION(':', INPUT_VALUE)+1, POSITION(':', INPUT_VALUE, POSITION(':', INPUT_VALUE)+1) - POSITION(':', INPUT_VALUE) - 1) AS INTEGER)
+ CAST(SUBSTR(INPUT_VALUE,POSITION(':', INPUT_VALUE, POSITION(':', INPUT_VALUE)+1)+1) AS DECIMAL(10,6)),
'HOUR(3)', 3600 * INPUT_VALUE,
'HOUR', 3600 * INPUT_VALUE,
'HOUR TO MINUTE', 3600 * CAST(SUBSTR(INPUT_VALUE,1 , POSITION(':', INPUT_VALUE)-1) AS INTEGER)
+ 60 * CAST(SUBSTR(INPUT_VALUE,POSITION(':', INPUT_VALUE)+1) AS INTEGER),
'HOUR TO SECOND', 3600 * CAST(SUBSTR(INPUT_VALUE, 1, POSITION(':', INPUT_VALUE)-POSITION(' ', INPUT_VALUE)-1) AS INTEGER)
+ 60 * CAST(SUBSTR(INPUT_VALUE, POSITION(':', INPUT_VALUE)+1, POSITION(':', INPUT_VALUE, POSITION(':', INPUT_VALUE)+1) - POSITION(':', INPUT_VALUE) - 1) AS INTEGER)
+ CAST(SUBSTR(INPUT_VALUE,POSITION(':', INPUT_VALUE, POSITION(':', INPUT_VALUE)+1)+1) AS DECIMAL(10,6)),
'MINUTE', 60 * INPUT_VALUE,
'MINUTE TO SECOND', 60 * CAST(SUBSTR(INPUT_VALUE, 1, POSITION(':', INPUT_VALUE)-POSITION(' ', INPUT_VALUE)-1) AS INTEGER)
+ CAST(SUBSTR(INPUT_VALUE, POSITION(':', INPUT_VALUE)+1) AS DECIMAL(10,6)),
'SECOND(2,3)', INPUT_VALUE,
'SECOND', INPUT_VALUE
)
END
$$;
DATEADD UDF INTERVAL¶
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明¶
この UDF は、次のような間隔のある操作を解決するために使用されます。
INTERVAL + DATE
INTERVAL + TIMESTAMP
DATE + INTERVAL
DATE + TIMESTAMP
INTERVAL + UNKNOWN
UNKNOWN + INTERVAL
注釈
UNKNOWN 型は、Snow Convertで解決できなかった型を持つ列または式です。これは、テーブルの DDLs が移行に含まれていない場合、または異なるデータ型を返す可能性のある式またはサブクエリがある場合に発生することがあります。
カスタム UDF オーバーロード¶
DATEADD_UDF(string, date)¶
パラメーター
INTERVAL_VALUE: 操作の間隔
文字列。D: 間隔が追加される
DATE。
UDF¶
CREATE OR REPLACE FUNCTION PUBLIC.DATEADD_UDF(INTERVAL_VALUE STRING,D DATE)
RETURNS DATE
LANGUAGE SQL
IMMUTABLE
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}'
AS
$$
WITH VARS(INPUT_VALUE, INPUT_PART) AS (
SELECT SUBSTR(INTERVAL_VALUE,11,POSITION('''',INTERVAL_VALUE,11)-11),
TRIM(SUBSTR(INTERVAL_VALUE,POSITION('''',INTERVAL_VALUE,11)+1)))
SELECT
CASE WHEN INPUT_PART='YEAR(2) TO MONTH' OR INPUT_PART='YEAR(4) TO MONTH' THEN
DATEADD(MONTHS,PUBLIC.INTERVAL_TO_MONTHS_UDF(INPUT_VALUE),D)
WHEN INPUT_PART='MONTH' THEN
DATEADD(MONTHS,TO_NUMBER(INPUT_VALUE),D)
ELSE
DATEADD(MICROSECONDS,1000000*PUBLIC.INTERVAL_TO_SECONDS_UDF(INPUT_PART, INPUT_VALUE),D)::DATE
END CASE
FROM VARS
$$;
DATEADD_UDF(date, string)¶
パラメーター
D: 間隔が追加される
DATE。INTERVAL_VALUE: 操作の間隔
文字列。
UDF¶
CREATE OR REPLACE FUNCTION PUBLIC.DATEADD_UDF(D DATE, INTERVAL_VALUE STRING)
RETURNS DATE
LANGUAGE SQL
IMMUTABLE
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}'
AS
$$
WITH VARS(INPUT_VALUE, INPUT_PART) AS (
SELECT SUBSTR(INTERVAL_VALUE,11,POSITION('''',INTERVAL_VALUE,11)-11),
TRIM(SUBSTR(INTERVAL_VALUE,POSITION('''',INTERVAL_VALUE,11)+1)))
SELECT
CASE WHEN INPUT_PART='YEAR(2) TO MONTH' OR INPUT_PART='YEAR(4) TO MONTH' THEN
DATEADD(MONTHS,PUBLIC.INTERVAL_TO_MONTHS_UDF(INPUT_VALUE),D)
WHEN INPUT_PART='MONTH' THEN
DATEADD(MONTHS,TO_NUMBER(INPUT_VALUE),D)
ELSE
DATEADD(MICROSECONDS,1000000*PUBLIC.INTERVAL_TO_SECONDS_UDF(INPUT_PART, INPUT_VALUE),D)::DATE
END CASE
FROM VARS
$$;
DATEADD_UDF(string, timestamp)¶
パラメーター
INTERVAL_VALUE: 操作の間隔
文字列。D: 間隔が追加される
TIMESTAMP。
UDF¶
CREATE OR REPLACE FUNCTION PUBLIC.DATEADD_UDF(INTERVAL_VALUE STRING,D TIMESTAMP)
RETURNS TIMESTAMP
LANGUAGE SQL
IMMUTABLE
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}'
AS
$$
WITH VARS(INPUT_VALUE, INPUT_PART) AS (
SELECT SUBSTR(INTERVAL_VALUE,11,POSITION('''',INTERVAL_VALUE,11)-11),
TRIM(SUBSTR(INTERVAL_VALUE,POSITION('''',INTERVAL_VALUE,11)+1)))
SELECT
CASE WHEN INPUT_PART='YEAR(2) TO MONTH' OR INPUT_PART='YEAR(4) TO MONTH' THEN
DATEADD(MONTHS,PUBLIC.INTERVAL_TO_MONTHS_UDF(INPUT_VALUE),D)
WHEN INPUT_PART='MONTH' THEN
DATEADD(MONTHS,TO_NUMBER(INPUT_VALUE),D)
ELSE
DATEADD(MICROSECONDS,1000000*PUBLIC.INTERVAL_TO_SECONDS_UDF(INPUT_PART, INPUT_VALUE),D)
END CASE
FROM VARS
$$;
DATEADD_UDF(timestamp, string)¶
パラメーター
D: 間隔が追加される
TIMESTAMP。INTERVAL_VALUE: 操作の間隔
文字列。
UDF¶
CREATE OR REPLACE FUNCTION PUBLIC.DATEADD_UDF(D TIMESTAMP, INTERVAL_VALUE STRING)
RETURNS TIMESTAMP
LANGUAGE SQL
IMMUTABLE
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}'
AS
$$
WITH VARS(INPUT_VALUE, INPUT_PART) AS (
SELECT SUBSTR(INTERVAL_VALUE,11,POSITION('''',INTERVAL_VALUE,11)-11),
TRIM(SUBSTR(INTERVAL_VALUE,POSITION('''',INTERVAL_VALUE,11)+1)))
SELECT
CASE WHEN INPUT_PART='YEAR(2) TO MONTH' OR INPUT_PART='YEAR(4) TO MONTH' THEN
DATEADD(MONTHS,PUBLIC.INTERVAL_TO_MONTHS_UDF(INPUT_VALUE),D)
WHEN INPUT_PART='MONTH' THEN
DATEADD(MONTHS,TO_NUMBER(INPUT_VALUE),D)
ELSE
DATEADD(MICROSECONDS,1000000*PUBLIC.INTERVAL_TO_SECONDS_UDF(INPUT_PART, INPUT_VALUE),D)
END CASE
FROM VARS
$$;
使用例¶
注釈
--disableDateAsTimestamp
SYSDATE を CURRENT_DATE または CURRENT_TIMESTAMP に変換すべきかどうかを示すフラグ。これは、 TIMESTAMP に変換されるすべての DATE 列にも影響します。
Oracle¶
-- DROP TABLE UNKNOWN_TABLE;
-- 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,
AsTimestampTwo TIMESTAMP,
AsDate DATE,
AsDateTwo DATE
);
INSERT INTO TIMES VALUES (
TO_TIMESTAMP('05/11/21, 11:00 A.M.', 'dd/mm/yy, hh:mi A.M.'),
TO_TIMESTAMP('05/11/21, 10:00 A.M.', 'dd/mm/yy, hh:mi A.M.'),
TO_DATE('06/11/21', 'dd/mm/yy'),
TO_DATE('05/11/21', 'dd/mm/yy'));
SELECT
AsTimeStamp+INTERVAL '1-1' YEAR(2) TO MONTH,
AsTimeStamp+INTERVAL '2-1' YEAR(4) TO MONTH,
AsTimeStamp+INTERVAL '1' MONTH,
AsTimeStamp+INTERVAL '2' MONTH,
AsDate+INTERVAL '1-1' YEAR(2) TO MONTH,
AsDate+INTERVAL '2-1' YEAR(4) TO MONTH,
AsDate+INTERVAL '1' MONTH,
AsDate+INTERVAL '2' MONTH,
Unknown+INTERVAL '1 01:00:00.222' DAY TO SECOND(3),
Unknown+INTERVAL '1 01:10' DAY TO MINUTE,
Unknown+INTERVAL '1 1' DAY TO HOUR,
INTERVAL '1' MONTH+AsTimeStamp,
INTERVAL '1' MONTH+AsDate,
INTERVAL '1' MONTH+Unknown,
INTERVAL '2' MONTH+AsTimeStamp,
INTERVAL '2' MONTH+AsDate,
INTERVAL '2' MONTH+Unknown
FROM TIMES, UNKNOWN_TABLE;
結果¶
|ASTIMESTAMP+INTERVAL'1-1'YEAR(2)TOMONTH|ASTIMESTAMP+INTERVAL'2-1'YEAR(4)TOMONTH|ASTIMESTAMP+INTERVAL'1'MONTH|ASTIMESTAMP+INTERVAL'2'MONTH|ASDATE+INTERVAL'1-1'YEAR(2)TOMONTH|ASDATE+INTERVAL'2-1'YEAR(4)TOMONTH|ASDATE+INTERVAL'1'MONTH|ASDATE+INTERVAL'2'MONTH|UNKNOWN+INTERVAL'101:00:00.222'DAYTOSECOND(3)|UNKNOWN+INTERVAL'101:10'DAYTOMINUTE|UNKNOWN+INTERVAL'11'DAYTOHOUR|INTERVAL'1'MONTH+ASTIMESTAMP|INTERVAL'1'MONTH+ASDATE|INTERVAL'1'MONTH+UNKNOWN|INTERVAL'2'MONTH+ASTIMESTAMP|INTERVAL'2'MONTH+ASDATE|INTERVAL'2'MONTH+UNKNOWN|
|---------------------------------------|---------------------------------------|----------------------------|----------------------------|----------------------------------|----------------------------------|-----------------------|-----------------------|---------------------------------------------|-----------------------------------|-----------------------------|----------------------------|-----------------------|------------------------|----------------------------|-----------------------|------------------------|
|2022-12-05 11:00:00.000 |2023-12-05 11:00:00.000 |2021-12-05 11:00:00.000 |2022-01-05 11:00:00.000 |2022-12-06 00:00:00.000 |2023-12-06 00:00:00.000 |2021-12-06 00:00:00.000|2022-01-06 00:00:00.000|2009-10-02 13:00:00.222 |2009-10-02 13:10:00.000 |2009-10-02 13:00:00.000 |2021-12-05 11:00:00.000 |2021-12-06 00:00:00.000|2009-11-01 12:00:00.000 |2022-01-05 11:00:00.000 |2022-01-06 00:00:00.000|2009-12-01 12:00:00.000 |
Snowflake¶
注釈
この構成はSnowflakeで使用されました
ALTER SESSION SET TIMESTAMP_NTZ_OUTPUT_FORMAT= 'DD-MON-YY HH.MI.SS.FF6 AM';
ALTER SESSION SET DATE_OUTPUT_FORMAT= 'DD-MON-YY';
-- DROP TABLE UNKNOWN_TABLE;
-- 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),
AsTimestampTwo TIMESTAMP(6),
AsDate TIMESTAMP /*** SSC-FDM-OR0042 - DATE TYPE COLUMN HAS A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/,
AsDateTwo 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"}}'
;
INSERT INTO TIMES
VALUES (
TO_TIMESTAMP('05/11/21, 11:00 A.M.', 'dd/mm/yy, hh:mi A.M.'),
TO_TIMESTAMP('05/11/21, 10:00 A.M.', 'dd/mm/yy, hh:mi A.M.'),
TO_DATE('06/11/21', 'dd/mm/yy'),
TO_DATE('05/11/21', 'dd/mm/yy'));
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "UNKNOWN_TABLE" **
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0095 - OPERATION BETWEEN INTERVAL TYPE AND DATE TYPE NOT SUPPORTED ***/!!!
AsTimeStamp + INTERVAL '1y, 1mm',
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0095 - OPERATION BETWEEN INTERVAL TYPE AND DATE TYPE NOT SUPPORTED ***/!!!
AsTimeStamp + INTERVAL '2y, 1mm',
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0095 - OPERATION BETWEEN INTERVAL TYPE AND DATE TYPE NOT SUPPORTED ***/!!!
AsTimeStamp + INTERVAL '1 month',
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0095 - OPERATION BETWEEN INTERVAL TYPE AND DATE TYPE NOT SUPPORTED ***/!!!
AsTimeStamp + INTERVAL '2 month',
AsDate+ INTERVAL '1y, 1mm',
AsDate+ INTERVAL '2y, 1mm',
AsDate+ INTERVAL '1 month',
AsDate+ INTERVAL '2 month',
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0036 - TYPES RESOLUTION ISSUES, ARITHMETIC OPERATION '+' MAY NOT BEHAVE CORRECTLY BETWEEN Unknown AND Interval ***/!!!
Unknown + INTERVAL '1d, 01h, 00m, 00s, 222ms',
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0036 - TYPES RESOLUTION ISSUES, ARITHMETIC OPERATION '+' MAY NOT BEHAVE CORRECTLY BETWEEN Unknown AND Interval ***/!!!
Unknown + INTERVAL '1d, 01h, 10m',
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0036 - TYPES RESOLUTION ISSUES, ARITHMETIC OPERATION '+' MAY NOT BEHAVE CORRECTLY BETWEEN Unknown AND Interval ***/!!!
Unknown + INTERVAL '1d, 1h',
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0095 - OPERATION BETWEEN INTERVAL TYPE AND DATE TYPE NOT SUPPORTED ***/!!!
AsTimeStamp + INTERVAL '1 month',
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0095 - OPERATION BETWEEN INTERVAL TYPE AND DATE TYPE NOT SUPPORTED ***/!!!
AsDate + INTERVAL '1 month',
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0036 - TYPES RESOLUTION ISSUES, ARITHMETIC OPERATION '+' MAY NOT BEHAVE CORRECTLY BETWEEN Unknown AND Interval ***/!!!
Unknown + INTERVAL '1 month',
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0095 - OPERATION BETWEEN INTERVAL TYPE AND DATE TYPE NOT SUPPORTED ***/!!!
AsTimeStamp + INTERVAL '2 month',
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0095 - OPERATION BETWEEN INTERVAL TYPE AND DATE TYPE NOT SUPPORTED ***/!!!
AsDate + INTERVAL '2 month',
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0036 - TYPES RESOLUTION ISSUES, ARITHMETIC OPERATION '+' MAY NOT BEHAVE CORRECTLY BETWEEN Unknown AND Interval ***/!!!
Unknown + INTERVAL '2 month'
FROM
TIMES,
UNKNOWN_TABLE;
結果¶
|DATEADD_UDF(ASTIMESTAMP,'INTERVAL ''1-1'' YEAR(2) TO MONTH')|DATEADD_UDF(ASTIMESTAMP,'INTERVAL ''2-1'' YEAR(4) TO MONTH')|DATEADD_UDF(ASTIMESTAMP,'INTERVAL ''1'' MONTH')|DATEADD_UDF(ASTIMESTAMP,'INTERVAL ''2'' MONTH')|DATEADD_UDF(ASDATE,'INTERVAL ''1-1'' YEAR(2) TO MONTH')|DATEADD_UDF(ASDATE,'INTERVAL ''2-1'' YEAR(4) TO MONTH')|DATEADD_UDF(ASDATE,'INTERVAL ''1'' MONTH')|DATEADD_UDF(ASDATE,'INTERVAL ''2'' MONTH')|DATEADD_UDF(UNKNOWN,'INTERVAL ''1 01:00:00.222'' DAY TO SECOND(3)')|DATEADD_UDF(UNKNOWN,'INTERVAL ''1 01:10'' DAY TO MINUTE')|DATEADD_UDF(UNKNOWN,'INTERVAL ''1 1'' DAY TO HOUR')|DATEADD_UDF('INTERVAL ''1'' MONTH',ASTIMESTAMP)|DATEADD_UDF('INTERVAL ''1'' MONTH',ASDATE)|DATEADD_UDF('INTERVAL ''1'' MONTH',UNKNOWN)|DATEADD_UDF('INTERVAL ''2'' MONTH',ASTIMESTAMP)|DATEADD_UDF('INTERVAL ''2'' MONTH',ASDATE)|DATEADD_UDF('INTERVAL ''2'' MONTH',UNKNOWN)|
|------------------------------------------------------------|------------------------------------------------------------|-----------------------------------------------|-----------------------------------------------|-------------------------------------------------------|-------------------------------------------------------|------------------------------------------|------------------------------------------|-------------------------------------------------------------------|---------------------------------------------------------|---------------------------------------------------|-----------------------------------------------|------------------------------------------|-------------------------------------------|-----------------------------------------------|------------------------------------------|-------------------------------------------|
|2022-12-05 11:00:00.000 |2023-12-05 11:00:00.000 |2021-12-05 11:00:00.000 |2022-01-05 11:00:00.000 |2022-12-06 |2023-12-06 |2021-12-06 |2022-01-06 |2009-10-02 13:00:00.222 |2009-10-02 13:10:00.000 |2009-10-02 13:00:00.000 |2021-12-05 11:00:00.000 |2021-12-06 |2009-11-01 12:00:00.000 |2022-01-05 11:00:00.000 |2022-01-06 |2009-12-01 12:00:00.000 |
既知の問題¶
1.INTERVAL + INTERVAL 操作はサポートされていません¶
Snowflakeは INTERVAL + INTERVAL 操作をサポートしていません。
関連 EWIs¶
SSC-EWI-OR0036:型解決の問題で、文字列と日付の間の算術演算が正しく動作しないことがあります。
SSC-EWI-OR0095:Interval型とDate型の間の操作はサポートされていません。
SSC-FDM-0007:依存関係が欠落している要素。
SSC-FDM-OR0042:日付型をタイムスタンプに変換すると異なる動作をします。
DATEDIFF UDF INTERVAL¶
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明¶
この UDF は、次のような間隔のある操作を解決するために使用されます。
INTERVAL - UNKNOWN
UNKNOWN - INTERVAL
DATE - INTERVAL
TIMESTAMP - INTERVAL
注釈
UNKNOWN 型は、Snow Convertで解決できなかった型を持つ列または式です。これは、テーブルの DDLs が移行に含まれていない場合、または異なるデータ型を返す可能性のある式またはサブクエリがある場合に発生することがあります。
カスタム UDF オーバーロード¶
DATEADD_DDIF(string, date)¶
パラメーター
INTERVAL_VALUE: 操作の間隔
文字列。D: 間隔が減算される
DATE。
UDF¶
CREATE OR REPLACE FUNCTION PUBLIC.DATEDIFF_UDF(INTERVAL_VALUE STRING,D DATE)
RETURNS DATE
LANGUAGE SQL
IMMUTABLE
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}'
AS
$$
WITH VARS(INPUT_VALUE, INPUT_PART) AS (
SELECT SUBSTR(INTERVAL_VALUE,11,POSITION('''',INTERVAL_VALUE,11)-11),
TRIM(SUBSTR(INTERVAL_VALUE,POSITION('''',INTERVAL_VALUE,11)+1)))
SELECT
CASE WHEN INPUT_PART='YEAR(2) TO MONTH' OR INPUT_PART='YEAR(4) TO MONTH' THEN
DATEADD(MONTHS,-1*PUBLIC.INTERVAL_TO_MONTHS_UDF(INPUT_VALUE),D)
WHEN INPUT_PART='MONTH' THEN
DATEADD(MONTHS,-1*TO_NUMBER(INPUT_VALUE),D)
ELSE
DATEADD(MICROSECONDS,-1*1000000*PUBLIC.INTERVAL_TO_SECONDS_UDF(INPUT_PART, INPUT_VALUE),D)::DATE
END CASE
FROM VARS
$$;
DATEADD_DIFF(date, string)¶
パラメーター
D: 間隔が減算される
DATE。INTERVAL_VALUE: 操作の間隔
文字列。
UDF¶
CREATE OR REPLACE FUNCTION PUBLIC.DATEDIFF_UDF(D DATE, INTERVAL_VALUE STRING)
RETURNS DATE
LANGUAGE SQL
IMMUTABLE
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}'
AS
$$
WITH VARS(INPUT_VALUE, INPUT_PART) AS (
SELECT SUBSTR(INTERVAL_VALUE,11,POSITION('''',INTERVAL_VALUE,11)-11),
TRIM(SUBSTR(INTERVAL_VALUE,POSITION('''',INTERVAL_VALUE,11)+1)))
SELECT
CASE WHEN INPUT_PART='YEAR(2) TO MONTH' OR INPUT_PART='YEAR(4) TO MONTH' THEN
DATEADD(MONTHS,-1*PUBLIC.INTERVAL_TO_MONTHS_UDF(INPUT_VALUE),D)
WHEN INPUT_PART='MONTH' THEN
DATEADD(MONTHS,-1*TO_NUMBER(INPUT_VALUE),D)
ELSE
DATEADD(MICROSECONDS,-1*1000000*PUBLIC.INTERVAL_TO_SECONDS_UDF(INPUT_PART, INPUT_VALUE),D)::DATE
END CASE
FROM VARS
$$;
DATEADD_DIFF(string, timestamp)¶
パラメーター
INTERVAL_VALUE: 操作の間隔
文字列。D: 間隔が減算される
TIMESTAMP。
UDF¶
CREATE OR REPLACE FUNCTION PUBLIC.DATEDIFF_UDF(INTERVAL_VALUE STRING,D TIMESTAMP)
RETURNS TIMESTAMP
LANGUAGE SQL
IMMUTABLE
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}'
AS
$$
WITH VARS(INPUT_VALUE, INPUT_PART) AS (
SELECT SUBSTR(INTERVAL_VALUE,11,POSITION('''',INTERVAL_VALUE,11)-11),
TRIM(SUBSTR(INTERVAL_VALUE,POSITION('''',INTERVAL_VALUE,11)+1)))
SELECT
CASE WHEN INPUT_PART='YEAR(2) TO MONTH' OR INPUT_PART='YEAR(4) TO MONTH' THEN
DATEADD(MONTHS,-1*PUBLIC.INTERVAL_TO_MONTHS_UDF(INPUT_VALUE),D)
WHEN INPUT_PART='MONTH' THEN
DATEADD(MONTHS,-1*TO_NUMBER(INPUT_VALUE),D)
ELSE
DATEADD(MICROSECONDS,-1*1000000*PUBLIC.INTERVAL_TO_SECONDS_UDF(INPUT_PART, INPUT_VALUE),D)
END CASE
FROM VARS
$$;
DATEADD_DIFF(timestamp, string)¶
パラメーター
D: 間隔が減算される
TIMESTAMP。INTERVAL_VALUE: 操作の間隔
文字列。
UDF¶
CREATE OR REPLACE FUNCTION PUBLIC.DATEDIFF_UDF(D TIMESTAMP, INTERVAL_VALUE STRING)
RETURNS TIMESTAMP
LANGUAGE SQL
IMMUTABLE
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}'
AS
$$
WITH VARS(INPUT_VALUE, INPUT_PART) AS (
SELECT SUBSTR(INTERVAL_VALUE,11,POSITION('''',INTERVAL_VALUE,11)-11),
TRIM(SUBSTR(INTERVAL_VALUE,POSITION('''',INTERVAL_VALUE,11)+1)))
SELECT
CASE WHEN INPUT_PART='YEAR(2) TO MONTH' OR INPUT_PART='YEAR(4) TO MONTH' THEN
DATEADD(MONTHS,-1*PUBLIC.INTERVAL_TO_MONTHS_UDF(INPUT_VALUE),D)
WHEN INPUT_PART='MONTH' THEN
DATEADD(MONTHS,-1*TO_NUMBER(INPUT_VALUE),D)
ELSE
DATEADD(MICROSECONDS,-1*1000000*PUBLIC.INTERVAL_TO_SECONDS_UDF(INPUT_PART, INPUT_VALUE),D)
END CASE
FROM VARS
$$;
使用例¶
注釈
--disableDateAsTimestamp
SYSDATE を CURRENT_DATE または CURRENT_TIMESTAMP に変換すべきかどうかを示すフラグ。これは、 TIMESTAMP に変換されるすべての DATE 列にも影響します。
Oracle¶
-- DROP TABLE UNKNOWN_TABLE;
-- 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,
AsTimestampTwo TIMESTAMP,
AsDate DATE,
AsDateTwo DATE
);
INSERT INTO TIMES VALUES (
TO_TIMESTAMP('05/11/21, 11:00 A.M.', 'dd/mm/yy, hh:mi A.M.'),
TO_TIMESTAMP('05/11/21, 10:00 A.M.', 'dd/mm/yy, hh:mi A.M.'),
TO_DATE('06/11/21', 'dd/mm/yy'),
TO_DATE('05/11/21', 'dd/mm/yy'));
SELECT
AsTimeStamp-INTERVAL '1-1' YEAR(2) TO MONTH,
AsTimeStamp-INTERVAL '2-1' YEAR(4) TO MONTH,
AsTimeStamp-INTERVAL '1' MONTH,
AsTimeStamp-INTERVAL '2' MONTH,
AsDate-INTERVAL '1-1' YEAR(2) TO MONTH,
AsDate-INTERVAL '2-1' YEAR(4) TO MONTH,
AsDate-INTERVAL '1' MONTH,
AsDate-INTERVAL '2' MONTH,
Unknown-INTERVAL '1 01:00:00.222' DAY TO SECOND(3),
Unknown-INTERVAL '1 01:10' DAY TO MINUTE,
Unknown-INTERVAL '1 1' DAY TO HOUR
FROM TIMES, UNKNOWN_TABLE;
結果¶
|ASTIMESTAMP-INTERVAL'1-1'YEAR(2)TOMONTH|ASTIMESTAMP-INTERVAL'2-1'YEAR(4)TOMONTH|ASTIMESTAMP-INTERVAL'1'MONTH|ASTIMESTAMP-INTERVAL'2'MONTH|ASDATE-INTERVAL'1-1'YEAR(2)TOMONTH|ASDATE-INTERVAL'2-1'YEAR(4)TOMONTH|ASDATE-INTERVAL'1'MONTH|ASDATE-INTERVAL'2'MONTH|UNKNOWN-INTERVAL'101:00:00.222'DAYTOSECOND(3)|UNKNOWN-INTERVAL'101:10'DAYTOMINUTE|UNKNOWN-INTERVAL'11'DAYTOHOUR|
|---------------------------------------|---------------------------------------|----------------------------|----------------------------|----------------------------------|----------------------------------|-----------------------|-----------------------|---------------------------------------------|-----------------------------------|-----------------------------|
|2020-10-05 11:00:00.000 |2019-10-05 11:00:00.000 |2021-10-05 11:00:00.000 |2021-09-05 11:00:00.000 |2020-10-06 00:00:00.000 |2019-10-06 00:00:00.000 |2021-10-06 00:00:00.000|2021-09-06 00:00:00.000|2009-09-30 10:59:59.778 |2009-09-30 10:50:00.000 |2009-09-30 11:00:00.000 |
Snowflake¶
注釈
この構成はSnowflakeで使用されました
ALTER SESSION SET TIMESTAMP_NTZ_OUTPUT_FORMAT= 'DD-MON-YY HH.MI.SS.FF6 AM';
ALTER SESSION SET DATE_OUTPUT_FORMAT= 'DD-MON-YY';
-- DROP TABLE UNKNOWN_TABLE;
-- 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),
AsTimestampTwo TIMESTAMP(6),
AsDate TIMESTAMP /*** SSC-FDM-OR0042 - DATE TYPE COLUMN HAS A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/,
AsDateTwo 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"}}'
;
INSERT INTO TIMES
VALUES (
TO_TIMESTAMP('05/11/21, 11:00 A.M.', 'dd/mm/yy, hh:mi A.M.'),
TO_TIMESTAMP('05/11/21, 10:00 A.M.', 'dd/mm/yy, hh:mi A.M.'),
TO_DATE('06/11/21', 'dd/mm/yy'),
TO_DATE('05/11/21', 'dd/mm/yy'));
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "UNKNOWN_TABLE" **
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0095 - OPERATION BETWEEN INTERVAL TYPE AND DATE TYPE NOT SUPPORTED ***/!!!
AsTimeStamp - INTERVAL '1y, 1mm',
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0095 - OPERATION BETWEEN INTERVAL TYPE AND DATE TYPE NOT SUPPORTED ***/!!!
AsTimeStamp - INTERVAL '2y, 1mm',
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0095 - OPERATION BETWEEN INTERVAL TYPE AND DATE TYPE NOT SUPPORTED ***/!!!
AsTimeStamp - INTERVAL '1 month',
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0095 - OPERATION BETWEEN INTERVAL TYPE AND DATE TYPE NOT SUPPORTED ***/!!!
AsTimeStamp - INTERVAL '2 month',
AsDate- INTERVAL '1y, 1mm',
AsDate- INTERVAL '2y, 1mm',
AsDate- INTERVAL '1 month',
AsDate- INTERVAL '2 month',
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0036 - TYPES RESOLUTION ISSUES, ARITHMETIC OPERATION '-' MAY NOT BEHAVE CORRECTLY BETWEEN Unknown AND Interval ***/!!!
Unknown - INTERVAL '1d, 01h, 00m, 00s, 222ms',
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0036 - TYPES RESOLUTION ISSUES, ARITHMETIC OPERATION '-' MAY NOT BEHAVE CORRECTLY BETWEEN Unknown AND Interval ***/!!!
Unknown - INTERVAL '1d, 01h, 10m',
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0036 - TYPES RESOLUTION ISSUES, ARITHMETIC OPERATION '-' MAY NOT BEHAVE CORRECTLY BETWEEN Unknown AND Interval ***/!!!
Unknown - INTERVAL '1d, 1h'
FROM
TIMES,
UNKNOWN_TABLE;
結果¶
|DATEDIFF_UDF(ASTIMESTAMP,'INTERVAL ''1-1'' YEAR(2) TO MONTH')|DATEDIFF_UDF(ASTIMESTAMP,'INTERVAL ''2-1'' YEAR(4) TO MONTH')|DATEDIFF_UDF(ASTIMESTAMP,'INTERVAL ''1'' MONTH')|DATEDIFF_UDF(ASTIMESTAMP,'INTERVAL ''2'' MONTH')|DATEDIFF_UDF(ASDATE,'INTERVAL ''1-1'' YEAR(2) TO MONTH')|DATEDIFF_UDF(ASDATE,'INTERVAL ''2-1'' YEAR(4) TO MONTH')|DATEDIFF_UDF(ASDATE,'INTERVAL ''1'' MONTH')|DATEDIFF_UDF(ASDATE,'INTERVAL ''2'' MONTH')|DATEDIFF_UDF(UNKNOWN,'INTERVAL ''1 01:00:00.222'' DAY TO SECOND(3)')|DATEDIFF_UDF(UNKNOWN,'INTERVAL ''1 01:10'' DAY TO MINUTE')|DATEDIFF_UDF(UNKNOWN,'INTERVAL ''1 1'' DAY TO HOUR')|
|-------------------------------------------------------------|-------------------------------------------------------------|------------------------------------------------|------------------------------------------------|--------------------------------------------------------|--------------------------------------------------------|-------------------------------------------|-------------------------------------------|--------------------------------------------------------------------|----------------------------------------------------------|----------------------------------------------------|
|2020-10-05 11:00:00.000 |2019-10-05 11:00:00.000 |2021-10-05 11:00:00.000 |2021-09-05 11:00:00.000 |2020-10-06 |2019-10-06 |2021-10-06 |2021-09-06 |2009-09-30 10:59:59.778 |2009-09-30 10:50:00.000 |2009-09-30 11:00:00.000 |
既知の問題¶
1.INTERVAL - INTERVAL 操作はサポートされていません¶
Snowflakeは INTERVAL - INTERVAL 操作をサポートしていません。
関連 EWIs¶
SSC-EWI-OR0036:型解決の問題で、文字列と日付の間の算術演算が正しく動作しないことがあります。
SSC-EWI-OR0095:Interval型とDate型の間の操作はサポートされていません。
SSC-FDM-0007:依存関係が欠落している要素。
SSC-FDM-OR0042:日付型をタイムスタンプに変換すると異なる動作をします。