web-dev-qa-db-ja.com

日時列を秒数に変換します

私のSQL Serverデータベースには、datetime列があります。

long列のdatetime値を表す新しい列を作成する良い方法は何ですか? longは秒数を表します。

それをlongsに変換できれば、長い数を固定量で除算できるので、期間ごとのクエリでグループ化するのが簡単になると思いました。

テーブルは静的であり、データを更新または削除しません。

11
dublintech

新しい列(ALTER TABLE)を作成し、その列に対してUPDATEを実行します

UPDATE
  MyTable
SET
  NewIntColumn = DATEDIFF(SECOND, '19000101', MyDateTimeColumn)

19000101はSQL Serverエポックです。たとえば、Unix Epochの場合は19700101を使用できます。

13
gbn

@gbnの提案に従って、新しい列を追加して手動で更新できますが、挿入/更新トリガーまたはその他のメカニズムを使用して、この列を常に最新の状態に保つ必要があります。 @gbnによるテーブル/列名の推測を借りて、一定のメンテナンスを必要としないいくつかの異なるアプローチを以下に示します。

計算された列

ALTER TABLE dbo.MyTable ADD NewIntColumn AS
  CONVERT(INT, DATEDIFF(SECOND, '19000101', MyDateTimeColumn));

--or for Unix Epoch

ALTER TABLE dbo.MyTable ADD NewIntColumn AS
  CONVERT(INT, DATEDIFF(SECOND, '19700101', MyDateTimeColumn));

この列を永続化してインデックスを付け、クエリのパフォーマンスをストレージとトレードオフすることもできますが、計算を少し変更する必要があります(上記を永続化しようとすると、計算が非決定的であるというエラーが発生します)。

ALTER TABLE dbo.MyTable ADD NewIntColumn AS
  CONVERT(INT, DATEDIFF(SECOND, 0, MyDateTimeColumn)) PERSISTED;

-- or for Unix Epoch

ALTER TABLE dbo.MyTable ADD NewIntColumn AS
  CONVERT(INT, DATEDIFF(SECOND, 25567, MyDateTimeColumn)) PERSISTED;

書き込みパフォーマンス(またはストレージ)よりも読み取りパフォーマンスを重視する場合は、列を永続化する必要があります。

ビュー

新しい列に対するビューの1つの利点は、ベーステーブルスキーマを変更する必要がない(またはそれを最新に保つことを心配する必要がない)ことです。クエリ時に計算コストを支払います。これは、非永続計算列と同じです。

CREATE VIEW dbo.vMyTable
AS
  SELECT -- other columns,
    MyDateTimeColumn,
    NewIntColumn = DATEDIFF(...whichever calc above makes sense...)
  FROM dbo.MyTable;

実行時

上記の計算は過度に複雑ではないので、クエリに計算を含めてください。うまくいけば、データアクセスにストアドプロシージャを使用して、これを頻繁に繰り返さないようにすることができます。

12
Aaron Bertrand