我正在尝试在select语句中将十进制值转换为日期
SELECT user_id, extend(dbinfo("UTC_TO_DATETIME",min(creationdate)), year to fraction) AS earned_date
FROM message
但我收到此错误
Value exceeds limit of INTEGER precision
表中的字段定义是
creationDate decimal(14,0) NOT NULL
似乎我没有使用正确的方式进行转换,任何想法?
答案 0 :(得分:3)
我认为您不需要在此上下文中使用EXTEND
- EXTEND
用于更改DATETIME和INTERVAL值的比例。
UTC_TO_DATETIME
returns a DATETIME已经有价值。
你试过了吗?
SELECT user_id, dbinfo("UTC_TO_DATETIME",min(creationdate)) AS earned_date
FROM message
这会产生什么?
<强>更新强>
啊,一个例子让一切变得不同!
您传递的值不是UTC_TO_DATETIME
期望的UTC日期时间。该函数需要一个表示秒的整数,而不是毫秒。就这么简单。
DBINFO('UTC_TO_DATETIME', 1329994172574)
超出整数精度。
DBINFO('UTC_TO_DATETIME', 1329994172574/1000)
产生:
2012-02-23 21:49:32
,我猜你的期望是什么?
如果您查看我之前提供的链接,它会解释小数秒的处理。 (剧透:他们被忽略了。)
如果小数秒非常重要,我猜你要将此函数的结果EXTEND
改为小数秒,然后将MOD(creationdate,1000)/ 1000添加到它。
例如:
SELECT user_id,
(dbinfo("UTC_TO_DATETIME", MIN(creationdate)/1000 )::DATETIME YEAR TO FRACTION(3)
+ (MOD(MIN(creationdate),1000)/1000) UNITS FRACTION) AS earned_date
FROM message
(但就个人而言,无论如何,我倾向于将此逻辑放入SPL中,因此您可以将其称为:
SELECT user_id, millis_to_time(MIN(creationdate))...
并避免在整个地方编写这种复杂的算法。)
答案 1 :(得分:1)
试试这个,
select
DT,
DT_Date = convert(datetime,convert(varchar(8),left(dt,8)))
from
( -- Test data
select DT = 19001231.000000
) a
这里,DT = 19001231
前4位(1900) - 年, 下一个2位数(12) - 月, 最后2位数(31) - 日期。
它应该类似于上面的格式然后只有你可以转换。希望它对你有所帮助,谢谢你。
答案 2 :(得分:1)
我设法为此编写了一个存储过程,它似乎是唯一的解决方案?十进制(14)以毫秒为单位,因此这里是解决方案
create procedure "informix".millis_to_time(milli_val decimal(14,0)) returning datetime year to fraction(3);
define retval datetime year to fraction(3);
define num_days int;
define num_seconds int;
define millis_in_day int;
let millis_in_day = 86400000;
let num_days = trunc(milli_val/millis_in_day,0);
let num_seconds = (milli_val - (num_days * millis_in_day))/1000;
let retval = extend(mdy(1,1,1970), year to fraction(3));
let retval = retval + num_days units day;
let retval = retval + num_seconds units second;
return retval;
end procedure;