如何将DATE格式化为DD-MM-YYYY且晚于01-01-1993?

时间:2016-12-23 09:48:15

标签: sql-server date

CREATE table orders (
custNum INT NOT NULL CHECK(custNum >= 0 AND custNum <= 999999),
prodNum INT FOREIGN KEY REFERENCES product(prodNum),
date DATE NOT NULL DATE_FORMAT(date, '%d-%m-%Y') CHECK(date >= '01-01-1993'),
qty INT CHECK(qty >= 0 AND qty <= 100000),
PRIMARY KEY (custNum, prodNum, date)
);

从我的

中可以看到
date DATE NOT NULL DATE_FORMAT(date, '%d-%m-%Y') CHECK(date >= '01-01-1993'),

我要做的是确保当我输入记录时,它会将格式检查为DD-MM-YYYY,并且晚于01-01-1993。但是,我发现所有日期格式都主要用于SELECT语句,这是我不想要的。我希望日期列中的记录采用我指定的格式。你是怎么做到的?

谢谢,我感谢任何帮助。我正在学习SQL和约束。我是初学者,所以我希望尽可能简单(最好是我的一行声明的解决方案),以便我能更好地理解。

编辑:嗨,我实际上计划在mySQL / MariaDB上进行,但是有一个CHECK约束错误(?)所以我实际上使用的是Microsoft SQL Management Studio。如果它可以在Microsoft SQL Management Studio上运行,我会很感激。

2 个答案:

答案 0 :(得分:0)

你在提问时遇到两个问题。第一个问题是代表性。更改选择中显示日期的方式。要解决此问题,请运行

dbcc useroptions

检查您当前的设置。第一个问题的解决方案是

  

Ø更改操作系统设置。

     

Ø将服务器设置更改为英式英语。

     

Ø现在创建一个新用户并使用dbcc useroptions

     

Ø现在您将看到该选项已更改。

Source

第二个问题是check约束。如果您正确更改了dateformat,则当前check约束可能会有效,但我建议您确保使用正确的dateformat。你需要像

这样的东西
CHECK (REGISTRATION_DATE > TO_DATE('01-01-1993', 'dd-mm-yyyy'))

了解更多here

要实现这一目标,您需要modify the check constraint

  

在对象资源管理器中,右键单击包含该检查的表   约束并选择设计。

     

在Table Designer菜单上,单击Check Constraints ....。

     

在“检查约束”对话框中的“选中检查约束”下,   选择您要编辑的约束。

     

完成一项行动

答案 1 :(得分:0)

摘自Bad habits to kick : mis-handling date / range queries - Aaron Bertrand

  

与YYYY-MM-DD相反,YYYYMMDD永远不会破裂。如果您决定对日期字符串文字使用任何其他格式,至少对于DATETIME和SMALLDATETIME类型,如果用户具有不同的会话设置,或者应将应用程序移动到具有不同的服务器,则会让您自己处于错误或不正确的数据中设置。

     

在SQL Server 2008中,新类型与用户或计算机设置更加隔离;仍然,我使用YYYYMMDD来保持一致性并且安全。

我发现你没有使用YYYY-MM-DD,但YYYYMMDD不会中断的事实仍然适用。

以下是原始create table语句的重新格式,其YYYYMMDD值为

create table orders (
    custnum int  not null 
  , prodnum int  not null
  , [date]  date not null 
  , qty     int  not null
  , constraint [pk_orders] primary key clustered (custnum, prodnum, date)
  , constraint [fk_orders_prodnum] foreign key (prodnum) 
      references product(prodnum)
  , constraint [chk_orders_custum_gte_0_lte_999999] 
      check (custnum >= 0 and custnum <= 999999)
  , constraint [chk_orders_date_gt_19930101] 
      check ([date]>'19930101')
  , constraint [chk_orders_qty_gt_0_lt_1000000] 
      check (qty >= 0 and qty <= 100000)
);

进一步阅读: