在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子句期间将十进制转换为日期[重复]的主要内容,如果未能解决你的问题,请参考以下文章