sql - 当 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 的时间部分。
解决方案
这与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
推荐阅读
- django-templates - 如何在我的模板 Django 中显示我需要的按钮?
- python - 多类分类不平衡
- java - java - 如何在java中的一个语句actiolistener中放置2个条件?
- kotlin - 协程范围内的函数未取消
- linux - dnsmasq 的配置,允许将域“搜索”附加到 /etc/resolv.conf
- three.js - 我在使用three.js 碰撞检测时遇到问题
- rust - 根据类型别名使用导入的宏
- linux - Unix:按程序的返回值对“ls”进行排序
- testing - 如何检查 x86 汇编器 AT&T 代码是否正常?
- mysql - 3次尝试后MySQL超慢查询