2012-04-27 59 views
0

我們對數據庫中的日期有一個非常愚蠢的數據要求。小時,月,日,年,分,&存儲在單獨的列中。顯然,這對於查詢日期範圍尤其是使用實體框架並不理想。使用MVC更新SQL Server數據庫中的值

我們決定創建一個名爲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'
+0

SQL = SQL Server? SQL實際上只是**結構化查詢語言** - 不是數據庫產品... – 2012-04-27 19:30:38

回答

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 

Link to DATEPART documentation

計算的年/月/日/小時/分鐘這樣,你將自動擁有更新時間列時,確認了其他領域。

免責聲明:在撰寫本文時,我不確定DATEPART是否確定使用持續。

+0

你的'DATEPART's不完全正確 - 你應該有:'作爲(DATEPART(YEAR,Time))的年份持續不爲空 - 第一個參數就是零件的定義,沒有任何引號 – 2012-04-27 19:40:22

1

爲什麼不使用a computed column?這樣你可以確定你的年,月,日,小時,分鐘和日期時間字段是同步的(如果你不得不保持第一個)。

+0

那麼如何將這些int列轉換爲一個組合日期時間呢? – ExceptionLimeCat 2012-04-27 19:27:11

0

而不是試圖從C#一側進行更新,爲什麼不只是爲combinedDate指定computed column。看看在DATETIMEFROMPARTS內置功能,也可能是使用的

編輯

正如有人指出,在評論中,DATETIMEFROMPARTS僅在SQL Server 2012中是可用的,這裏是另一種方式來得到部分ym,一個DATETIME d(假設整數):

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

不幸的是,只有SQL Server ** 2012 **纔可以使用這個非常有用的函數 - 以前沒有任何版本... – 2012-04-27 19:30:10

+0

的確,您是正確的,我將添加另一個 – kaveman 2012-04-27 19:32:37

+1

另一件事:格式爲'YY-MM-DD '在SQL Server中創建'DATETIME'是不安全的 - 例如它不適用於所有語言和日期格式設置。如果你想創建一個'DATETIME',你需要使用'YYYYMMDD'(**沒有**任何破折號),或者使用'YYYY-MM-DDTHH:MM:SS'來完成所有配置下的工作。 – 2012-04-27 19:36:10

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