将 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的主要内容,如果未能解决你的问题,请参考以下文章

如何将sql 中十六进制转换十进制

sql Server如何编写函数实现把十进制数转换为二进制数?求大神相助!!

如何在DB2上将十六进制转换为十进制

SQL中十六进制转十进制语句

进制转换(十进制转十六进制 十六进制转十进制)

C# 把word转成2进制存储到SQL2000中的问题