在where子句期间将十进制转换为日期[重复]

Posted

技术标签:

【中文标题】在where子句期间将十进制转换为日期[重复]【英文标题】:convert decimal to date during where clause [duplicate] 【发布时间】:2011-12-22 16:01:53 【问题描述】:

可能重复:Convert DB2 SQL Decimal to DATE

我有一个 db2 数据库,我想在 select 语句的 where 子句中将小数转换为日期。

十进制日期可以为 12 或 13 个字符,具体取决于月份。

12 个字符:

1,241,999.00 应变为:1999/1/24

13 个字符:

12,241,999.00 应变为:1999/12/24

列名是 DECIMALCOLUMN:

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

【问题讨论】:

问题是,如何将十进制日期(12-13 个字符长)转换为日期格式。在示例中,年份也移到日期的前面。 请注意,尝试将数字字段直接转换为日期字段将导致意外值 - DB2 将数字输入视为 天数 (-1),因为0001-01-01 【参考方案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

使用这种在数据库中编码日期的方式很糟糕,让该功能始终可用应该证明是无价的。

【讨论】:

那是完美的。你说的对。谢谢你。唯一的问题是我只有选择访问权限。我无法在数据库中创建函数。还有办法选择你的代码吗? @user719825:试试这个:WHERE date (substr(digits(DECIMALCOLUMN),4,4) || '-' || substr(digits(DECIMALCOLUMN),1,2) || '-' || substr(digits(DECIMALCOLUMN),3,2)) = @date。很糟糕,但在功能上是等效的。如果有任何问题,请尝试显示表达式和decimalcolumn,看看可能有什么问题。

以上是关于在where子句期间将十进制转换为日期[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何将十进制时间转换为正常时间[重复]

SAS:在where子句中将日期时间转换为日期

将excel十进制数字转换为日期

如何在 DB2 AS/400 中将十进制字段转换为日期字段?

SQL在where子句中转换日期格式

C#通过分隔数字将十进制转换为字符串[重复]