将十进制值转换为Date - Informix DB

时间:2012-08-08 13:01:33

标签: sql date decimal informix

我正在尝试在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

似乎我没有使用正确的方式进行转换,任何想法?

3 个答案:

答案 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;