你是否曾经想只存储日期而没有时间?如果是的话,使用旧的日期数据类型将无法完成。现在在SQL Server 2008中你可以使用DATE数据类型,DATE数据类型允许只存储一个日期值,它支持的日期范围从0001-01-01到9999-12-31,存储DATE数据类型磁盘开销只需3个字节,如果你只需要存储日期值而没有时间,使用DATE可以比SMALLDATETIME节省一字节的磁盘空间。
这里用一个示例来展示如何显示DATE的值
SET NOCOUNT ON;运行上述代码将会得到如下结果:
DECLARE @D DATE = '2001-03-1';
PRINT @D;
SELECT CONVERT(char(10),@D,120) DATEONLY, @D [DATE-N-TIME];
2001-03-01这里你可以看到PRINT语句显示日期使用YYYY-MM-DD格式,但是SELECT语句要求你使用CONVERT函数把DATE变量转换为YYYY-MM-DD格式,正如你所看到的,如果你使用SELECT只显示一个DATE变量,最后的输出结果仍然包含时间部分,这个功能在所有新的日期和时间数据类型中是一致的。
DATEONLY DATE-N-TIME
---------- -----------------------
2001-03-01 2001-03-01 00:00:00.000
TIME
SQL Server 2008现在有了一个TIME数据类型,它允许你只存储一个时间值而没有时间。如果想要存储一个特定的时间信息而不涉及具体的日期时,这将非常的有用。TIME数据类型存储使用24小时制,它并不关心时区,支持高达100纳秒的精确度。TIME数据类型支持从0到7不同的精度,就像DATETIME2格式,它的磁盘开销是3到5个字节,取决与精度。TIME列的长度与精度如下表所示:
此处是一个如何使用不同的DATETIME2精度值来显示不同的时间格式的示例:
DECLARE @T0 time(0) = '16:59:11.1234567';
DECLARE @T1 time(1) = '16:59:11.1234567';
DECLARE @T2 time(2) = '16:59:11.1234567';
DECLARE @T3 time(3) = '16:59:11.1234567';
DECLARE @T4 time(4) = '16:59:11.1234567';
DECLARE @T5 time(5) = '16:59:11.1234567';
DECLARE @T6 time(6) = '16:59:11.1234567';
DECLARE @T7 time(7) = '16:59:11.1234567';
PRINT @T0;
PRINT @T1;
PRINT @T2;
PRINT @T3;
PRINT @T4;
PRINT @T5;
PRINT @T6;
PRINT @T7;
当运行上述代码时将会得到如下结果:
16:59:11
16:59:11.1
16:59:11.12
16:59:11.123
16:59:11.1235
16:59:11.12346
16:59:11.123457
16:59:11.1234567
注意TIME(4),TIME(5)和TIME(6)在显示时进行了精度截断,这与我们前面看到的DATETIME2的行为是一致的。只存储时间部分的TIME数据类型列现在允许我们验证SQL Server的时间值以确保它们包含的是有效的时间,并且能够节省空间。