0

我们对数据库中的日期有一个非常愚蠢的数据要求。月、日、年、分和小时存储在单独的列中。显然,这对于查询日期范围并不理想,尤其是使用实体框架。

我们决定只创建一个名为的新列,它是一个带有相关日期信息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'
4

4 回答 4

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

为什么不使用计算列?这样您就可以确保您的年、月、日、小时、分钟和日期时间字段是同步的(如果您必须保留第一个)。

于 2012-04-27T19:22:41.537 回答
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

与其尝试从C#侧面进行更新,不如只指定一个computed columnfor combinedDate。看一下DATETIMEFROMPARTS内置函数,可能有用

编辑

正如评论中指出的那样,DATETIMEFROMPARTS仅在 SQL Server 2012 中可用,这是从部件y, m,获取 DATETIME 的另一种方法d(假设为整数):

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