3

selectステートメントで10進数値を日付に変換しようとしています

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 に答える