0

データベース内の日付には、本当にばかげたデータ要件があります。月、日、年、分、および時間は、別々の列に格納されます。明らかに、これは特にEntityFrameworkを使用して日付範囲をクエリする場合には理想的ではありません。

相関する日付情報を持つcombinedDateSQLであるという新しい列を作成することにしました。smalldatetimeデータベースを更新しようとすると、アプリケーションがフリーズし、更新が完了しません。テストデータベースには8400行しかないため、これは間違いなく大きな問題にはなりません。

これにはストアドプロシージャを使用する必要がありますか?これを達成するための最良のアプローチは何ですか?

データベース内のすべての新しいエントリの日付データに対してこれを行う必要があります。これらのエントリは、一度に8400行発生する可能性があります。

列の形式:

  • Year int= 12
  • Month int= 4
  • Day int= 27
  • Hour int= 12
  • Min int= 0

新しい列:smalldatetime

  • combinedDate = '2012-04-27 12:00:00 PM'
4

4 に答える 4

1

計算列を使用してみませんか?これにより、年、月、日、時間、分、日時のフィールドが同期していることを確認できます(最初のフィールドを保持する必要がある場合)。

于 2012-04-27T19:22:41.537 に答える
1

計算列が最善のアプローチであることに同意します。

おそらく、別の角度を検討する必要があります。日時を計算する代わりに、年/月/日/時/分を次のように計算します。

Year as (DATEPART('yyyy', Time)) persisted not null,
Month as (DATEPART('m', Time)) persisted not null,
Day as (DATEPART('d', Time)) persisted not null,
Hour as (DATEPART('hh', Time)) persisted not null,
Min as (DATEPART('mi', Time)) persisted not null,
Time datetime not null

DATEPARTドキュメントへのリンク

そうすれば、[時間]列を更新するときに他のフィールドが自動的に検証されます。

免責事項:この記事の執筆時点では、DATEPARTを永続的に使用することが決定論的であるかどうかはわかりません。

于 2012-04-27T19:34:52.603 に答える
1

他の人が述べたように、計算列を作成することはより良い選択でしょう。このアプローチを完全に回避することはさらに良いでしょう。ただし、このアプローチを回避できない場合は、使用できる計算列式を次に示します。出力セクションでは、月と分の無効な値が実際に合計されて、将来の正しい日付が表示されることがわかります。

計算列式

(dateadd(year, (100) + [year],
    dateadd(month, [month] - (1),
        dateadd(day, [day] - (1),
            dateadd(hour, [hour],
                dateadd(minute, [min], (0))
                )
            )
        )
    )
)

サンプルスクリプト

CREATE TABLE dbo.myTable
(
        [year]  int NOT NULL
    ,   [month] int NOT NULL
    ,   [day]   int NOT NULL
    ,   [hour]  int NOT NULL
    ,   [min]   int NOT NULL
    ,   [smalldatetime]  AS (dateadd(year,(100)+[year],dateadd(month,[month]-(1),dateadd(day,[day]-(1),dateadd(hour,[hour],dateadd(minute,[min],(0))))))) PERSISTED
);

INSERT INTO dbo.myTable ([year], [month], [day], [hour], [min]) VALUES
    (12, 4, 27, 17, 34),
    (12, 6, 12, 4, 8),
    (11, 32, 12, 54, 87);

SELECT  [year]
    ,   [month]
    ,   [day]
    ,   [hour] 
    ,   [min] 
    ,   [smalldatetime] 
FROM    dbo.myTable;

サンプル出力

year month day hour min smalldatetime
---- ----- --- ---- --- -----------------------
12    4     27  17  34  2012-04-27 17:34:00.000
12    6    -12   4   8  2012-05-19 04:08:00.000
11    32    12  54  87  2013-08-14 07:27:00.000
于 2012-04-27T20:55:53.260 に答える
0

横から更新するのではなく、 forをC#指定してみませんか。組み込み関数を見てください、それは役に立つかもしれませんcomputed columncombinedDateDATETIMEFROMPARTS

編集

コメントで指摘されているように、DATETIMEFROMPARTSSQL Server 2012でのみ使用できます。これは、パーツ、、(整数を想定)からDATETIMEを取得する別の方法yです。md

CAST(CAST(y AS varchar) + '-' + CAST(m AS varchar) + '-' + CAST(d AS varchar) AS DATETIME)
于 2012-04-27T19:23:54.993 に答える