SELECT * FROM tblDate Where datediff (d, [ Date ] ,‘ 2007 - 10 - 01 ’) = 0
会让你很是郁闷,违反一个基本准则:等号左边操作列。索引用不上不说,还要每次都计算。 (当然这个实现还是可以多样的,你可以使用Between and 来绕弯实现利用索引的。原文举例的是这个语句) 但是如果有只是存储整数部分的日期就好了。2008版的date类型就是你想要的! (补充一下:mssql里面对日期类型的存储是这样的:将日期部分存储成一个整数,将日期的后面的屁股存储成小数部分,然后拼加在一起存在数据库内是一个类似于float类型的数据。具体可以演练这样一段代码: select convert ( float , getdate ()) select datediff ( day , 0 , getdate ()) select dateadd ( day , 0 , datediff ( day , 0 , getdate ())) select convert ( float , dateadd ( day , 0 , datediff ( day , 0 , getdate ()))) select convert ( float , getdate () - dateadd ( day , 0 , datediff ( day , 0 , getdate ())))
) 附带:date的取值范围是0001-01-01 到9999-12-31 TIME这个类型也就顾名思义其实就是刚才date类型的尾巴,取值范围是00:00:00.0000000 到23:59:59.9999999 DATETIME2这个类型是让你可以指定时间的精确度,比如: DECLARE @dt7 datetime2( 7 ) SET @dt7 = Getdate () PRINT @dt7 -- result is 2008-01-3 12:15:11.2340000
他一共可以指定从0到7的小数点位数,具体参考如下: Fraction | Output |
0 | 2007-10-28 22:11:20 |
1 | 2007-10-28 22:11:19.7 |
2 | 2007-10-28 22:11:19.70 |
3 | 2007-10-28 22:11:19.703 |
4 | 2007-10-28 22:11:19.7030 |
5 | 2007-10-28 22:11:19.70300 |
6 | 2007-10-28 22:11:19.703000 |
7 | 2007-10-28 22:11:19.7030000 |
DECLARE @dt DATETIMEOFFSET( 0 ) SET @dt = ' 2007-10-29 22:50:55 -1:00 ' DECLARE @dt1 DATETIMEOFFSET( 0 ) SET @dt1 = ' 2007-10-29 22:50:55 +5:00 ' SELECT DATEDIFF (hh, @dt , @Dt1 )
个人感觉用处不是很大。 如果需求需要将日期和时间都分别存储,并且分别建立索引,甚至是联合索引,那么如何得到一个真正的时间呢? Declare @dt as DATE Set @dt = getdate () Declare @dtt as TIME Set @dtt = getdate () Select cast ( @dt as smalldatetime ) + cast ( @dtt as smalldatetime )Output: 2007 - 10 - 28 00 : 17 : 00 .
参考自: http://www.sql-server-performance.com/articles/dev/datetime_2008_p1.aspx