3

我正在尝试在选择语句中将十进制值转换为日期

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

看来我没有使用正确的方式进行转换,知道吗?

4

3 回答 3

3

我认为您不需要EXTEND在这种情况下使用 -EXTEND用于更改 DATETIME 和 INTERVAL 值的比例。

UTC_TO_DATETIME 已经返回一个 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))...并避免到处编写这种复杂的算法。)

于 2012-08-08T21:29:03.850 回答
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) - 日期。

它应该与上述格式类似,然后只有您可以转换。希望对你有帮助,谢谢。

于 2012-08-08T13:45:58.287 回答
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;
于 2012-08-08T21:25:56.953 回答