簡體   English   中英

使用MVC更新SQL Server數據庫中的值

[英]Updating values in SQL Server database with MVC

我們對數據庫中的日期有一個非常愚蠢的數據要求。 月,日,年,分鍾和小時分別存儲在單獨的列中。 顯然,這不是查詢日期范圍的理想選擇,尤其是使用實體框架時。

我們決定只創建一個名為combinedDate的新列,該列是帶有相關日期信息的SQL 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'

為什么不使用計算列 這樣,您可以確保年,月,日,小時,分鍾和日期時間字段保持同步(如果必須保留第一個字段)。

我同意計算列是最好的方法。

也許您應該考慮一個不同的角度。 而不是計算日期時間,而是通過計算年/月/日/小時/分鍾

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是否可以確定地使用。

如其他人所述,創建計算列將是更好的選擇。 完全避免這種方法會更好。 但是,如果無法避免這種方法,則可以使用此計算列表達式。 在輸出部分中,您會注意到,實際上月份和最小值中的無效值加起來以顯示將來的正確日期

計算列表達式

(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

而不是嘗試從C#端進行更新,為什么不只為combinedDate指定一個computed column 看一下DATETIMEFROMPARTS內置函數,它可能有用

編輯

正如評論中指出的那樣, DATETIMEFROMPARTS僅在SQL Server 2012中可用,這是從ymd (假定整數)獲取DATETIME的另一種方法:

CAST(CAST(y AS varchar) + '-' + CAST(m AS varchar) + '-' + CAST(d AS varchar) AS DATETIME)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM