【问题标题】:SQL Check datetime value constraint while creating a table创建表时 SQL 检查日期时间值约束
【发布时间】:2014-11-16 06:22:13
【问题描述】:

我想问一下是否有任何可能的方法来对 datetime 列进行检查约束,确保该列是在 11 月或 5 月。

Create Table TestDate (
.....
.....
date datetime not null default '14/11/2012'
...
...
constraint dateCheck check *date must be either November or May*

非常感谢您的帮助!

编辑:补充问题,

是否可以将日期列的默认值设置为“2012 年 11 月 14 日”而不是“14/11/2012”?我知道它使用的是日期时间数据类型,除非更改为字符串(char/varchar)数据类型,否则无法更改?

【问题讨论】:

  • 您已经为 MySQL 和 SQL Server 标记了这个。您正在使用这两个数据库中的哪一个?语法可能会有所不同。
  • 抱歉,这是 sql-server
  • @Daniel:您已经对列使用 NOT NULL 约束,现在将不考虑默认值,因为您不允许在 INSERT 时跳过此列。
  • @PareshJ 从技术上讲,这是有道理的,但是否可以将默认值设置为“2012 年 11 月 14 日”而不是“2012 年 11 月 14 日”?我会将值从另一个表复制到此表,并且不会填满此列。
  • @PareshJ 因此可以直接将默认值设置为“2012 年 11 月 14 日”。谢谢!

标签: sql-server datetime constraints ddl


【解决方案1】:

您可以使用month函数提取日期的月份部分:

CREATE TABLE TestDate (
    date datetime not null default '14/11/2012'
    constraint dateCheck check (MONTH(date) IN (5, 11))
)

【讨论】:

    【解决方案2】:

    我会在check 约束中使用datepart function

    create table testDate (
      dt datetime not null default '14/11/2012'
     );
    
    alter table testDate 
      add constraint chk_month
        check( datepart( month, dt ) in (5,11));
    

    您可以在 this SQL Fiddle 中看到这样的示例

    【讨论】:

      【解决方案3】:

      是的,您可以在日期列的月份部分添加约束。检查以下示例:

      Create table TestTable
      (
         from_date DAtetime
      
         constraint checkdates check (DATEPART(mm, from_date) = 11 OR DATEPART(mm, from_date) = 5)
      );
      

      如果 datepart 不包含 11 月或 5 月,上述脚本将限制插入到 from_date 列。

      是的,您可以使用默认值作为“2012 年 11 月 14 日”。检查这个版本:

      Create table TestTable
      (
      
         from_date DAtetime default ('14 November 2012') 
      
         constraint checkdates check (DATEPART(mm, from_date) = 11 OR DATEPART(mm, from_date) = 5)
      );
      

      并且,试试这个插入语句来检查默认值:

      Insert into TestTable DEFAULT values
      

      【讨论】:

      • 谢谢。只是另一个问题,是否可以将日期列的默认值设置为“2012 年 11 月 14 日”而不是“2012 年 11 月 14 日”?我知道它使用的是 datetime 数据类型。
      【解决方案4】:

      您需要使用触发器(在插入之前和更新之前)来处理您的要求。以下 MSDN 链接可能会对您有所帮助 http://msdn.microsoft.com/en-us/library/ms189799.aspx

      【讨论】:

      • 您指的是哪个查询的触发器?检查约束还是设置默认值?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-11
      • 1970-01-01
      • 2014-01-06
      相关资源
      最近更新 更多