tbasallo Asked: 2023-08-12 23:38:05 +0800 CST2023-08-12 23:38:05 +0800 CST 2023-08-12 23:38:05 +0800 CST 插入时忽略 DATE 约束 772 我一定是在某个地方遗漏了一些东西.. Azure SQL DispatchedOn is a DateTime column ALTER TABLE [table] WITH CHECK ADD CONSTRAINT [CK_ReportDate6MonthRollGreater] CHECK ((CONVERT([date],[DispatchedOn])>='2022-12-07')) GO ALTER TABLE [table] CHECK CONSTRAINT [CK_ReportDate6MonthRollGreater] GO 我可以插入日期 2022-12-01 sql-server 2 个回答 Voted Best Answer Dan Guzman 2023-08-13T01:44:14+08:002023-08-13T01:44:14+08:00 CHECK当CHECK_CONSTRAINTST-SQL BULK INSERT、BCP in 或 SSIS 目标中省略该选项时,SQL Server 将允许插入违反约束的日期。此外,在操作之后该约束被标记为不可信,以指示现有数据可能违反该约束。 运行此查询以验证约束是否受信任并已启用: SELECT name , is_disabled , is_not_trusted FROM sys.check_constraints WHERE name = N'CK_ReportDate6MonthRollGreater'; Paul White 2023-08-13T18:06:50+08:002023-08-13T18:06:50+08:00 您的示例中的字符串“2022-12-07”和“2022-12-01”不明确。 “2022-12-07”可能表示 2022 年 12 月 7 日或 2022 年 7 月 12 日。 “2022-12-01”可能表示 2022 年 12 月 1 日或 2022 年 1 月 12 日。 例如: SET LANGUAGE English; SELECT English = CONVERT(datetime, '2022-12-07'); SET LANGUAGE British; SELECT British = CONVERT(datetime, '2022-12-07'); 英语 2022-12-07 00:00:00.000 英国人 2022-07-12 00:00:00.000 渲染还取决于客户端设置,例如操作系统语言。 您的数据库或显示客户端中可能存在某种允许显示组合的语言或格式设置组合。例如,2022 年 12 月 1 日合法地在 2022 年 7 月 12 日之后。 为了避免此类问题,在将日期和时间与字符串格式相互转换时,请始终使用确定性样式CONVERT。 这记录在文字日期字符串到 DATE 值的非确定性转换中 例子: SELECT TheDate = CONVERT ( char(24), CONVERT ( datetime, '2022-12-07', -- interpret string as ODBC canonical -- yyyy-mm-dd hh:mi:ss (24-hour) 120 ), -- format as Europe default -- dd mon yyyy hh:mi:ss:mmm (24-hour) 113 ); 日期 2022 年 12 月 7 日 00:00:00:000 有理由怀疑这是您特定情况下的原因,使 Dan 的答案更有可能,但这仍然是最佳实践,并将帮助您消除可能的混乱根源。
CHECK
当CHECK_CONSTRAINTS
T-SQLBULK INSERT
、BCP in 或 SSIS 目标中省略该选项时,SQL Server 将允许插入违反约束的日期。此外,在操作之后该约束被标记为不可信,以指示现有数据可能违反该约束。运行此查询以验证约束是否受信任并已启用:
您的示例中的字符串“2022-12-07”和“2022-12-01”不明确。
例如:
渲染还取决于客户端设置,例如操作系统语言。
您的数据库或显示客户端中可能存在某种允许显示组合的语言或格式设置组合。例如,2022 年 12 月 1 日合法地在 2022 年 7 月 12 日之后。
为了避免此类问题,在将日期和时间与字符串格式相互转换时,请始终使用确定性样式
CONVERT
。这记录在文字日期字符串到 DATE 值的非确定性转换中
例子:
有理由怀疑这是您特定情况下的原因,使 Dan 的答案更有可能,但这仍然是最佳实践,并将帮助您消除可能的混乱根源。