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


11

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

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

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

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

回答:


13

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

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

19000101SQL Serverのエポックです。19700101たとえば、Unixエポックに使用できます


12

@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;

ランタイム

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.