回答:
@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;
ランタイム
上記の計算は複雑すぎないため、クエリに計算を含めてください。うまくいけば、データアクセスにストアドプロシージャを使用して、これを頻繁に繰り返さないようにすることができます。