将 DB2 SQL 十进制转换为 DATE
Posted
技术标签:
【中文标题】将 DB2 SQL 十进制转换为 DATE【英文标题】:Convert DB2 SQL Decimal to DATE 【发布时间】:2011-12-20 19:38:23 【问题描述】:我需要将十进制转换为日期。我有一个十进制日期字段,其中包含这样的数据:
1,132,009.00 --1/13/2009
7,152,004.00 --7/15/2004
11,012,005.00 --11/01/2005
等
我希望它读作 xx/xx/xxxx。
在 select 语句中是否可以使用 SQL 命令或 DB2 逻辑来执行此操作?
SELECT column1 from table1 ;
【问题讨论】:
每一个映射到什么日期?我看不出这些数字有什么意义 change sql parameter to date decimal的可能重复 【参考方案1】:WITH x(decvalue) AS ( VALUES (DECIMAL(1132009.00)),(DECIMAL(7152004.00)),(DECIMAL(11012005.00)) )
SELECT CAST(
LPAD( RTRIM( CHAR( INTEGER( decvalue/1000000 ))), 2, '0' ) || '/' ||
LPAD( RTRIM( CHAR( MOD( decvalue/10000, 100 ))), 2, '0' ) || '/' ||
MOD( decvalue, 10000 )
AS CHAR(10))
AS chardateresult
FROM x
;
【讨论】:
我将其编写为独立的 SQL 语句,因此它可以在任何 DB2 数据库中按原样执行,而无需创建任何对象。【参考方案2】:使用与@Fred 相同的WITH
值,我想出了:
WITH x(decvalue) AS ( VALUES (DECIMAL(1132009.00)),(DECIMAL(7152004.00)),(DECIMAL(11012005.00)) )
SELECT TO_DATE(CHAR(CAST(decvalue AS DECIMAL(8,0))), 'MMDDYYYY')
FROM x
这假设您的输入值不会超过 8 位数字(2 表示月,2 表示日,4 表示年),否则您会在转换时遇到溢出错误。如果每个月、日和年都没有至少某个值,它也会失败(例如,00002011
不起作用,但 01012011
会)。
【讨论】:
这对我不起作用,直到我使用 RTRIM() 修剪了字符串的尾随空格,然后使用 LPAD() 确保七位日期字符串用前导零填充. WITH x(decvalue) AS ( 值 (DECIMAL(1132009.00)),(DECIMAL(7152004.00)),(DECIMAL(11012005.00)) ) SELECT TO_DATE( LPAD( RTRIM(CHAR(CAST(decvalue AS DECIMAL(8,0))) ), 8,'0' ), 'MMDDYYYY') FROM x 奇怪,它工作得很好,就像我拥有它一样。我在 LUW 9.7 上对其进行了测试。也许您在不同的平台上处理的事情略有不同? (另外,弗雷德,我今天似乎经常碰到你。:-)) 很奇怪。我不知道是什么原因造成的。我在 64 位 Windows 上运行 DB2 9.7 Fix Pack 5 (s111017),当我将您的语句粘贴进去并尝试运行它时,我得到 SQL20448N,因为格式字符串是“MMDDYYYY”,输入字符串是“1132009” ' 您是否会为您正在使用的数据库启用 Oracle 兼容性?不管怎样,有更多的 DB2 LUW 人员在这里闲逛是件好事。 不,据我所知没有 Oracle 兼容模式(没有理由启用它,我们一直是 DB2 商店)。当我在我们的 z/OS DB2 上尝试它时,我也得到了相同的结果。我们使用的是 64 位 Linux,我在SELECT * FROM SYSIBMADM.REG_VARIABLES
中看不到 DB2_COMPATIBILITY_VECTOR
以上是关于将 DB2 SQL 十进制转换为 DATE的主要内容,如果未能解决你的问题,请参考以下文章