select cast('' as datetime)/*
-----------------------
1900-01-01 00:00:00.000(1 行受影响)
*/

解决方案 »

  1.   

    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 行受影响)*/
      

  2.   

    1900-01-01 00:00:00.000 为系统的默认缺省时间
    可以创建表定义字段时定义缺省时间create table (...t datetime default 自定义时间...)
      

  3.   

    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')
      

  4.   

    同样的,对于索引的利用,一般认为索引列上应用函数或计算,会导至索引失效。而由于datetime的存储方式的问题,这里是个特例datediff(dd,......),规则并不一定是绝对的。
      

  5.   

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

  6.   


    见4楼,nullif('','')将''转换成NULL,正常值不变
      

  7.   

    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 行受影响)
    */