私のSQL Serverデータベースには、datetime
列があります。
long
列のdatetime
値を表す新しい列を作成する良い方法は何ですか? long
は秒数を表します。
それをlongs
に変換できれば、長い数を固定量で除算できるので、期間ごとのクエリでグループ化するのが簡単になると思いました。
テーブルは静的であり、データを更新または削除しません。
新しい列(ALTER TABLE)を作成し、その列に対してUPDATEを実行します
UPDATE
MyTable
SET
NewIntColumn = DATEDIFF(SECOND, '19000101', MyDateTimeColumn)
19000101
はSQL Serverエポックです。たとえば、Unix Epochの場合は19700101
を使用できます。
@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;
実行時
上記の計算は過度に複雑ではないので、クエリに計算を含めてください。うまくいけば、データアクセスにストアドプロシージャを使用して、これを頻繁に繰り返さないようにすることができます。