【问题标题】:Convert DB2 SQL Decimal to DATE将 DB2 SQL 十进制转换为 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  ;

【问题讨论】:

标签: sql database db2 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
猜你喜欢
  • 1970-01-01
  • 2021-10-21
  • 2015-02-09
  • 1970-01-01
  • 1970-01-01
  • 2012-07-07
  • 2016-07-19
  • 1970-01-01
  • 2011-07-28
相关资源
最近更新 更多