【问题标题】:Is it possible in Microsoft SQL Server to create a column that is a datepart?是否可以在 Microsoft SQL Server 中创建作为日期部分的列?
【发布时间】:2016-02-15 06:30:58
【问题描述】:

我想创建一个类似这样的列:

create table dbo.t1
(
    [Notification_Month] datepart(mm, [date]) null,
)

我想将月份存储为日期属性,而不存储日期的其他部分。我知道这是一个奇怪的问题,但是这个表正在被 WPF 应用程序使用,所以如果 SQL Server 允许这样做会更容易限制日期条目,但如果不是,我可能会使用 c# 找到一个冗长而复杂的解决方案。

如果这是不可能的,我有一些其他的解决方法的想法,但在我说不可能之前考虑过,总是最好检查堆栈。

【问题讨论】:

  • 为什么不将其存储为整数?
  • wpf 应用程序已经将条目强制为日期,我希望不必进入并弄乱 c# 代码。

标签: c# sql-server create-table datepart


【解决方案1】:

虽然您仍然必须将 [date] 存储为 DATE 类型,但您可以使用计算列:

Create Table yourTable(
     [NOTIFICATION_MONTH] DATE,
     , [MONTH_NOTIFIED] as DATEPART(MONTH, [NOTIFICATION_MONTH])
)

添加PERSISTED 会将其保存在表格中。没有它,每次都会自动计算。

computed_column_expression 下的 MSDN CREATE TABLE 页面上:

是定义计算列的值的表达式。计算列是未物理存储在表中的虚拟列,除非该列标记为 PERSISTED。该列是根据使用同一表中其他列的表达式计算得出的。例如,计算列可以具有以下定义:成本 AS 价格 * 数量。 [...]

另一种选择是:

  • 为月份创建一个带有 tinyint 的表
  • 在您的表上创建一个带有日期的视图
  • 在视图上创建触发器并按月替换日期
  • 在视图中插入日期

【讨论】:

  • 我不得不稍微修改它,但我相信你知道我需要:[NOTIFICATION_MONTH] DATE,[MONTH_NOTIFIED] as DATEPART(MONTH, [NOTIFICATION_MONTH]),
  • 是的,我忘记了数据类型和几个错字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-06
  • 2013-10-31
  • 2020-08-01
相关资源
最近更新 更多