2011-12-22 48 views
1

可能重复:
Convert DB2 SQL Decimal to DATEwhere子句中转换小数最新

我有一个DB2数据库,我想在where子句中的选择十进制转换为日期声明。

十进制日期可能根据月份可能为12或13个字符。

12个字符:

,241,999.00应该成为:1999//24

13性状:

,241,999.00应成为:1999//24

列名是DECIMALCOLUMN:

Select * from table1 WHERE 
cast(replace(convert,DECIMALCOLUMN,date)) = @date 
+0

问题是什么? – wallyk 2011-12-22 16:05:56

+0

问题是,如何将十进制日期(12-13个字符长)转换为日期格式。在这个例子中,年份也会移到日期的前面。 – tdjfdjdj 2011-12-22 16:07:26

+0

请注意,尝试将数字字段直接转换为日期字段将导致意料之外的值 - DB2将数字输入视为自_ 0001的数字(-1)0001-01-01 – 2011-12-22 16:39:43

回答

1

我看到:你想重新安排一个号码的数字成为的一些方法日期。它看起来像编码是[m]mddyyyy。 (为什么数据库中不是date数据类型?)

该数字需要转换为字符串,然后将子字符串排列并转换为日期。考虑到这里的复杂性,应该写一个转换函数来代替被更改为适当数据类型的字段。像这样的东西应该这样做(未经测试,没有访问DB2):

create function decimaldate(decdate DECIMAL) 
returns DATE 
return 
with tmp (dstr) as 
(
    select substr(digits (decdate),8) 
    from sysibm.sysdummy1 
) 
select 
    date (substr(dstr,4,4) || '-' || 
     substr(dstr,1,2) || '-' || 
     substr(dstr,3,2) 
     ) 
from tmp 

这个数转换为字符串,格式化字符串作为yyyy-mm-dd并将其转换成日期。 (我用this为基础。)

因此,解决原来的问题是简单地写:

SELECT * 
FROM table1 
WHERE decimaldate(DECIMALCOLUMN) = @date 

与编码在数据库中的日期的这种扭曲的方式,有随时可用的功能应该证明是非常宝贵的。

+0

这是完美的。你是对的。谢谢。唯一的问题是我只有选择访问权限。我不能在数据库中创建一个函数。还有一些选择你的代码吗? – tdjfdjdj 2011-12-22 18:08:13

+0

@ user719825:试试这个:WHERE date(substr(digits(DECIMALCOLUMN),4,4)||' - '|| substr(digits(DECIMALCOLUMN),1,2)||' - '|| substr(digits (DECIMALCOLUMN),3,2))= @ date'。Yucky,但功能上相同。如果有任何问题,请尝试显示表达式和'decimalcolumn'来查看可能出错的内容。 – wallyk 2011-12-22 19:50:21