插入数据类型为DateTime时为空值时,为什么SQL SERVER会自动加上"1900-01-01"

本文探讨了在SQL Server中更新时间字段时,默认值的设置问题。当将时间字段设置为空字符串时,系统会自动将其解释为'1900-01-01'。为了避免这一情况,推荐使用NULL值进行替代,尤其是在需要区分未指定时间与特定时间的场景中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

系统默认的吧, 
update   tablename   set   时间字段= ' ' 
SQL   SERVER会自动加上 "1900-01-01 " 
update   tablename   set   时间字段=null 
就不会了

 

======================================

null值不会,但是其他会。在系统中,时间不是一个字符串,而是一个带小数的数字——整数部分代表从1900年1月1日以后的天数,小数部分为午夜之后的毫秒数(好像是)。

 

======================================

datetime/smalldatetime的存储格式是固定的. 

由日期+时间组成. 

如果只存储时间,它会自动加上1900-1-1 

除非你改用字符型字段来存储

========================================

datetime类型系统里面是共用8个字节来存储的,存储的数字类型。 

其中前4个字节用来存储日期1900-1-1之前/后的天数, 
其中后4个字节用来存储00:00后的毫秒数。 

如果是 ' '的就是1900-1-1了。

==========================================

存入之前先检查,如果是空的就设为NULL 
或者取的时候先检查,如果是1900-01-01,那么设为空,不过这样的话打印的时候会有问题的,所以还是建议用前面一种办法

### 关于间字段插入数据显示为空的原因 当尝试向不允许 `NULL` 值的间字段插入 `NULL` 或者未提供值,数据库会抛出错误消息。具体来说,在 SQL Server 中,如果列定义为不可接受 `NULL` 值,并且在执行插入操作不指定该列的值或者显式设置其为 `NULL`,则会发生此类型的错误[^1]。 对于给定的例子: ```sql Msg 515, Level 16, State 2, Line 32 Cannot insert the value NULL into column 'Null_Data', table 'AdventureWorks2014.dbo.NullDemo'; column does not allow nulls. UPDATE fails. The statement has been terminated. ``` 这表明试图更新或插入到名为 `'Null_Data'` 的列中的值为 `NULL`,而该列被设定为不接受 `NULL` 值。同样的逻辑适用于任何其他类型的数据字段,包括间戳、日期间和仅限间的数据类型。 ### 解决方案 为了防止此类问题的发生,可以采取以下措施之一来处理间字段的情况: - **确保提供了有效的间值**:在准备要插入的数据之前,请确认所有必需的间字段都已填充了有效的非空值。 - **修改表结构允许 `NULL`**:如果业务需求确实存在某些记录可能缺少特定间信息,则可以通过更改表设计使这些列能够容纳 `NULL` 值。不过这种做法应谨慎考虑,因为它可能会引入不确定性并影响查询性能和准确性。 - **使用默认值**:可以在创建表的候为间字段指派一个合理的默认值(比如当前间),这样即使应用程序层面忘记传递这个参数也不会造成违反约束条件的问题。 例如,下面是如何通过 T-SQL 创建带有默认间为 GETDATE() 函数返回值的新列的方法: ```sql ALTER TABLE AdventureWorks2014.dbo.NullDemo ADD Null_Data DATETIME NOT NULL DEFAULT(GETDATE()); ``` 上述命令将在 `Null_Data` 列不存在的情况下为其添加一个新的具有默认值等于服务器当前间戳的列,并且不允许插入 `NULL` 值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值