SQL Server 2008引入了可以单独使用日期和时间部分的数据类型,但在前面的讨论中还没有区分这两部分。如果要在SQL Server 2008之前版本的SQL Server中只使用日期或时间,只能选用同时包含这两种组成部分的DATETIME或SMALLDATETIME数据类型之一。在要实现日期和时间逻辑的地方,也可以使用整数或字符串之类的数据类型,但此处暂不讨论这种用法。如果想选用DATETIME或SMALLDATETIME类型,那么当只使用日期数据时,保存数据的时间值将是午夜(时间部分全是0)。当只使用时间数据时,保存数据的日期值将是基础日期1900年1月1日。
例如,Sales.Orders表的orderdate列是DATETIME类型的,但由于实际只使用日期部分,所以所有值的时间都存储为午夜。当需要筛选特定日期的订单时,可以不必使用范围过滤条件,只要使用如下等号运算符即可:
1 SELECT orderid,custid,empid,orderdate
2 FROM Sales.Orders
3 WHERE orderdate = ' 20070212 ' ;
当把字符串文字转换成DATETIME类型时如果没有指定时间,SQL Server将默认用午夜作为其时间值。因为orderdate列中所有值的时间部分都保存成午夜,因此以上查询能够正确地得到请求日期发出的所有订单。
如果保存的时间不是午夜值,则可以使用范围过滤查询条件,如下所示:
1 SELECT orderid,custid,empid,orderdate
2 FROM Sales.Orders
3 WHERE orderdate >= ' 20070212 ' AND orderdate < ' 20070213 ' ;
如果想在SQL Server 2008之前的版本中只使用时间,则可以用基础日期1900年1月1日来存储所有时间值。当SQL Server把只包含时间值的字符串文字转换成DATETIME或SMALLDATETIME类型时,它会默认你想用的日期是基础日期。例如,运行以下代码:
1 SELECT CAST ( ' 12:30:15.123 ' AS DATETIME );
该查询会生成以下输出:
假设有个表的列叫tm,它的数据类型是DATETIME,所有值都用基础日期进行存储。要返回时间值是12:30:15.123的所有行,应该使用过滤条件WHERE tm='12:30:15.123'。因为没有指定日期部分,当SQL Server隐式地将字符串文字转换成DATETIME数据类型时,它会默认你想使用的日期是基础日期。
如果想只使用日期或时间,但输入值既包括日期部分,也包括时间部分,这时就需要对输入值进行一定的处理,把不相关的部分暂时变成“0”。也就是说,如果只想使用日期,就把时间部分设置成午夜;如果只想使用时间,就把日期部分设置成基础日期。