【问题标题】:How do I format my DATE to be in DD-MM-YYYY and later than 01-01-1993?如何将我的 DATE 格式化为 DD-MM-YYYY 并晚于 01-01-1993?
【发布时间】:2016-12-23 09:48:14
【问题描述】:
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 上运行,我将不胜感激。

【问题讨论】:

  • sql server 还是 mysql?
  • 嗨,我实际上计划在 mySQL 上执行此操作,但有一个 CHECK 错误(?)它不起作用,所以我实际上使用的是 Microsoft SQL Management Studio。如果它可以在 Microsoft SQL Management Studio 上运行,我将不胜感激。
  • 您是在使用 Management Studio 作为客户端吗?
  • @e4c5 嗨,实际上我正在学习 SQL,我不太确定技术性,但我下载了 Microsoft SQL Mgmt Studio,创建了自己的数据库,现在尝试在上面创建自己的表。我想创建这个表和更多表,然后插入我自己的数据,然后尝试练习..所以我不确定它是什么..我非常抱歉。
  • 首先要做的就是弄清楚你实际连接的是什么RDBMS,因为这个si not valid mysql

标签: sql-server date


【解决方案1】:

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

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

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

在表设计器菜单上,单击检查约束...。

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

完成一个动作

【讨论】:

  • @Ken 欢迎您。如果这个答案解决了你的问题,那么你可以考虑接受它。
【解决方案2】:

摘自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)
);

进一步阅读:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-10
    相关资源
    最近更新 更多