sql字段为datetime,插入''的时候默认为1900年,为什么?

djf5230860 2009-02-25 05:13:25

sql2005 如果字段定义的类型为datetime
你插入的时候,如果插入为''(空),那么会默认值为1900-01-01 00:00:00.000

有解决的办法么?
...全文
1123 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
dobear_0922 2009-02-25
  • 打赏
  • 举报
回复
declare @date varchar(20)
set @date=''
select cast(nullif(@date,'') as datetime)

set @date='20090225'
select cast(nullif(@date,'') as datetime)

/*
-----------------------
NULL

(1 行受影响)


-----------------------
2009-02-25 00:00:00.000

(1 行受影响)
*/
dobear_0922 2009-02-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 djf5230860 的回复:]


我现在想实现的就是,如果是''(空字符串)就现实为NULL,如果是正确的选择了时间,那就还是显示为正确时间!
[/Quote]

见4楼,nullif('','')将''转换成NULL,正常值不变
djf5230860 2009-02-25
  • 打赏
  • 举报
回复


我现在想实现的就是,如果是''(空字符串)就现实为NULL,如果是正确的选择了时间,那就还是显示为正确时间!
fcuandy 2009-02-25
  • 打赏
  • 举报
回复
同样的,对于索引的利用,一般认为索引列上应用函数或计算,会导至索引失效。

而由于datetime的存储方式的问题,这里是个特例

datediff(dd,......),规则并不一定是绝对的。
fcuandy 2009-02-25
  • 打赏
  • 举报
回复
Microsoft SQL Server 2005 Database Engine 用两个 4 字节的整数内部存储 datetime 数据类型的值。 第一个 4 字节存储“基础日期”(即 1900 年 1 月 1 日)之前或之后的天数。基础日期是系统参照日期。另外一个 4 字节存储天的时间(以午夜后经过的毫秒数表示)。


相当于存储两个偏移量。1900-1-1的基准值加上两个偏移量,就是存储的日期值,也即两4字节存放的int数。

当你给datetime类型赋值为''时,因为datetime内部存储的原因,实际上是给int型数据赋值,''转换为int为0
可以理解为

dateadd(dd,0,'1900-1-1')
longyangyxm 2009-02-25
  • 打赏
  • 举报
回复
1900-01-01 等于0
在此基础上去理解两个日期之间的加减

解决方法:
重新字段定义的类型为字符串 时间没生成的时候就赋空吧
blacky8 2009-02-25
  • 打赏
  • 举报
回复
1900-01-01 00:00:00.000 为系统的默认缺省时间
可以创建表定义字段时定义缺省时间

create table (...t datetime default 自定义时间...)
dobear_0922 2009-02-25
  • 打赏
  • 举报
回复
select cast('' as datetime)
, cast(nullif('','') as datetime)
, isnull(cast(nullif('','') as datetime),getdate())

/*
----------------------- ----------------------- -----------------------
1900-01-01 00:00:00.000 NULL 2009-02-25 17:18:15.140

(1 行受影响)

*/
dobear_0922 2009-02-25
  • 打赏
  • 举报
回复
select cast('' as datetime)

/*
-----------------------
1900-01-01 00:00:00.000

(1 行受影响)
*/
ljhcy99 2009-02-25
  • 打赏
  • 举报
回复
自己设置默认值。
dobear_0922 2009-02-25
  • 打赏
  • 举报
回复
[Quote=引用楼主 djf5230860 的帖子:]

sql2005 如果字段定义的类型为datetime
你插入的时候,如果插入为''(空),那么会默认值为1900-01-01 00:00:00.000

有解决的办法么?
[/Quote]

你想插入什么?

22,298

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧