首页 > 解决方案 > 当 DateTime 与文本连接时,Oracle 错误地导出 MD5

问题描述

请在 Oracle 12c 上考虑此 SQL

select to_date('01-02-2020','MM-DD-YYYY'),
standard_hash (to_date('01-02-2020','MM-DD-YYYY'), 'MD5') Only_Date_MD5,
to_date('01-02-2020 12:34:56','MM-DD-YYYY HH:MI:SS'),
standard_hash (to_date('01-02-2020 12:34:56','MM-DD-YYYY HH:MI:SS'), 'MD5') DateTime_MD5,
standard_hash (to_date('01-02-2020','MM-DD-YYYY') || 'SomeText', 'MD5') Date_Concat_Text_MD5,
standard_hash (to_date('01-02-2020 12:34:56','MM-DD-YYYY HH:MI:SS') || 'SomeText', 'MD5') DateTime_Concat_Text_MD5
from dual;

输出

SOME_DATE                   01/02/2020
ONLY_SOME_DATE_MD5          6D44D021F4D2CACA3DBEC6E88AEEB7AD
SOME_DATETIME               01/02/2020 12:34:56
SOME_DATETIME_MD5           F8FDBBC5181E79B99A1EE13CB71A1D46
DATE_CONCAT_TEXT_MD5        **FE7DA8E96A7233A33F03CC592A929011**
DATETIME_CONCAT_TEXT_MD5    **FE7DA8E96A7233A33F03CC592A929011**

为什么 Oracle MD5 为与文本连接的日期和与相同文本连接的日期时间(具有相同日期)返回相同的值。它在导出 MD5 时丢弃了 DateTime 的时间部分。

标签: sqloraclemd5

解决方案


这与standard_hash(). 问题是 adate到字符串的隐式转换。

当您将 adate 隐式转换为字符串(或to_char()不使用格式)时,结果只是日期部分。所以这:

select to_date('01-02-2020 12:34:56', 'MM-DD-YYYY HH:MI:SS') || 'abc'
from dual

返回:

02-JAN-20abc

出于您的目的,我强烈建议您使用to_char()转换回更详细的表示形式。您也可以to_timestamp()改用 - 默认表示将包括时间。

所以:

select to_timestamp('01-02-2020 12:34:56', 'MM-DD-YYYY HH:MI:SS') || 'abc'
from dual

返回:

02-JAN-20 12.34.56.000000000abc

推荐阅读