【问题标题】:Convert Decimal value to Date - Informix DB将十进制值转换为日期 - Informix DB
【发布时间】:2012-08-08 13:01:33
【问题描述】:

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

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

【问题讨论】:

    标签: sql date decimal informix


    【解决方案1】:

    我认为您不需要在这种情况下使用 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
    

    (但就我个人而言,无论如何我都倾向于将 this 逻辑放入 SPL,因此您可以这样称呼它: SELECT user_id, millis_to_time(MIN(creationdate))... 并避免到处写这种复杂的算法。)

    【讨论】:

    • 它给了我我在问题中提到的相同的错误消息,因为我澄清了字段定义是 Decimal(14,0),1329994172574 是一个值示例,在尝试执行时会导致错误sql。
    • 查看我的更新答案。您的示例值是所需要的;该列被定义为 DECIMAL(14,0) 的事实并不能告诉我们您在其中放入了什么。
    【解决方案2】:

    这样试试,

    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) - 日期。

    应该和上面的格式差不多,只有你可以转换。希望对你有帮助,谢谢。

    【讨论】:

    • 这似乎不适用于 Informix DB,尝试运行时出现语法错误。
    • 不,我认为它一定是 SQL Server - 当你的问题中有一个“sql”标签时总是有风险......
    • 我认为“sql”标签表示我需要一般的 SQL 帮助,而不是特定于数据库。
    • 是的,这是一个非常合理的假设。我的印象是有很多 SQL Server 专家不知道还有其他数据库技术......
    【解决方案3】:

    我设法为此编写了一个存储过程,这似乎是唯一的解决方案?小数(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;
    

    【讨论】:

      猜你喜欢
      • 2023-03-13
      • 1970-01-01
      • 2017-08-12
      • 2018-05-10
      • 2011-05-26
      • 1970-01-01
      • 2021-12-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多