2012-04-27 60 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