0

概要:キー列のUTC時刻がエンコードされている場合、UTC時間間隔に属するレコードを抽出するにはどうすればよいですか?

UTCエンコーディング:レコードに。のような文字列としてエンコードされたUTC時間が含まれているサードパーティのテーブルがあります'2456065.80700942:0000002F'。このタイプのUTCを取得するにはDATETIME、次の式を使用できます。

CAST((CAST(LEFT(encodedUTC, 16) AS FLOAT) - 2415020.5) AS DATETIME)

彼らは、コロンの前の部分は、float(およびfloatから文字列)にエンコードされたユリウス日であると言います。私はチェックしませんでした、それはうまくいくようです。

クエリ:今、私は@fromUTC@toUTCDATETIMEタイプを持っています。選択できます:

SELECT CAST((CAST(LEFT(d.UTC, 16) AS FLOAT) - 2415020.5) AS DATETIME) AS UTC,
       ...
FROM dbo.Data AS d
WHERE CAST((CAST(LEFT(d.UTC, 16) AS FLOAT) - 2415020.5) AS DATETIME) > @fromUTC 
      AND CAST((CAST(LEFT(d.UTC, 16) AS FLOAT) - 2415020.5) AS DATETIME) < @toUTC

BETWEEN同じ回数のレコードを取得したくないので使用していません。)それは機能しますが、問題は変換式が3回繰り返されることです(そうでない場合は同じコードを繰り返すのは好きではありません)必要)。

私の質問は:どうすればSELECTもっと上手に書くことができますか?

時間と情報をありがとう、

Petr

4

2 に答える 2

3

この計算を含むビューを追加するか、テーブル自体に計算列を追加することを検討します(テーブル定義を変更できる場合)。

これらのアプローチのいずれかは、よりクリーンな最終選択につながります。選択する頻度と挿入する頻度に基づいて、パフォーマンスに関する考慮事項がいくつかある可能性があります。そのため、おそらくいずれかの方法でシェーディングされます。

于 2013-01-21T13:34:59.037 に答える
2

次のようなCTEを使用する

;with  cteName (UTC) as 
(
select SELECT CAST((CAST(LEFT(d.UTC, 16) AS FLOAT) - 2415020.5) AS DATETIME) AS UTC
FROM dbo.Data
)
select UTC
from cts where uct > @fromUTC and utc < @toUTC
于 2013-01-21T13:35:10.917 に答える