SQLSERVER 中datetime 和 smalldatetime类型分析说明

datetime 和 smalldatetime
代表日期和一天内的时间的日期和时间数据类型。
Microsoft SQL Server 用两个 4 字节的整数内部存储 datetime 数据类型的值。第一个 4 字节存储 base date (即 1900 年 1 月 1 日)之前或之后的天数。基础日期是系统参考日期。不允许早于 1753 年 1 月 1 日的 datetime 值。第一个4 字节:1900 年1 月1 日当日为0 ;之前的日期是负数;之后日期是正数。另外一个 4 字节存储以午夜后3 1/3 毫秒数所代表的每天的时间。
smalldatetime 数据类型存储日期和每天的时间,但精确度低于 datetime 。 SQL Server 将 smalldatetime 的值存储为两个 2 字节的整数。第一个 2 字节存储 1900 年 1 月 1 日后的天数。另外一个 2 字节存储午夜后的分钟数。日期范围从1900 年 1 月 1 日到 2079 年 6 月 6 日,精确到分钟。
可以将这两种类型转换成float 浮点数, 其中整数部分就是对应的日期字节, 而小数部分是时间相应的比例, 如datetime 的小数部分就是占整天的毫秒数的比例;smalldatetime 的小数部分就是占整天的分钟数的比例. 因此我们可以直接将这两种类型的变量和整数、浮点数进行直接的加减。
datetime
从 1753 年 1 月 1 日到 9999 年 12 月 31 日的日期和时间数据,精确度为百分之三秒(等于 3.33 毫秒或 0.00333 秒)。如下表所示,把值调整到 .000 、.003 、或 .007 秒的增量。

















示例
调整后的示例
01/01/98 23:59:59.999
1998-01-02 00:00:00.000
01/01/98 23:59:59.995,
01/01/98 23:59:59.996,
01/01/98 23:59:59.997, 或
01/01/98 23:59:59.998
1998-01-01 23:59:59.997
01/01/98 23:59:59.992,
01/01/98 23:59:59.993,
01/01/98 23:59:59.994
1998-01-01 23:59:59.993
01/01/98 23:59:59.990 或
01/01/98 23:59:59.991
1998-01-01 23:59:59.990

我们常常需要搜索指定日期范围内的数据, 比如返回1998-01-01 当天内的数据, 你可能会这样写:
date >= ‘1998-01-01 00:00:00.000' and date <= ‘1998-01-01 23:59:59.999 '
根据上面的调整规则, 其实这句语句的实际搜索范围为:
date >= ‘1998-01-01 00:00:00.000' and date <= ‘1998-01-02 00:00:00.000 '
你会看到这包括了1998-01-02 的数据, 所以最好的正确的搜索语句为:
date >= ‘1998-01-01 00:00:00.000' and date < ‘1998-01-02 00:00:00.000 '
smalldatetime
从 1900 年 1 月 1 日到 2079 年 6 月 6 日的日期和时间数据精确到分钟。29.998 秒或更低的 smalldatetime 值向下舍入为最接近的分钟,29.999 秒或更高的 smalldatetime 值向上舍入为最接近的分钟。
--returns time as 12:35
SELECT CAST('2000-05-08 12:35:29.998' AS smalldatetime)
GO
--returns time as 12:36
SELECT CAST('2000-05-08 12:35:29.999' AS smalldatetime)
GO
赋值:
上面说了时间的实际格式,我们在给一个时间变量赋值时肯定不会赋一个浮点数给该变量,更多的情况是我们给这个变量赋一个字符串,系统会自动将字符串变成时间格式并保存到数据库中。若字符格式错误,则报错。根据语言不同,世界上有多种不同的用字符串表示时间方式,我们可以通过 sp_helplanguage 查看不同语言下的缺省时间格式,如简体中文的时间格式为 ymd ,可以通过 SET DATEFORMAT 来暂时更改这个缺省值。
时间函数
DATEADD :可以对时间类型的指定部分进行加减计算,虽然我们上面说了可以进行直接的加减,但是我们可以更方便的利用这个函数对指定部分,如年月日时分秒等进行加减。我们常常根据一个时间来构造出另外一个时间,比如下个月的今天 , 本月底等等,我们应该也尽量使用 DATEADD 函数来构造,它可以避免一些闰月、年底、月底之类的错误,我以前就是根据 DATENAME 来构造的,常常要考虑这些问题。
DATEDIFF :该函数对两个时间变量对指定部分进行比较计算。此函数不考虑比指定日期部分更高的粒度级别,它只考虑更低级别的部分。对时间的比较应尽量使用本函数。
举个出错的例子:返回两个时间变量的小时差。若使用 DATEPART(HOUR, @T2 - @T1) 就可能会出错;你应该使用 DATEDIFF(HOUR, @T1, @T2) 。
DATEPART :返回时间变量的指定部分的值。
DATENAME :返回时间变量的指定部分的值,和 DATAPART 不同的是本函数返回的是个字符串类型
GETDATE() 返回本机器的当前时间。 CURRENT_TIMESTAMP 变量与本函数功能相同。
GETUTCDATE() 返回本机器的当前 UTC (格林尼治标准时间)时间。

(0)

相关推荐

  • sqlserver和oracle中对datetime进行条件查询的一点区别小结

    首先,看一下sql server,之前我们都通过前台用户选择一个起始时间和一个结束时间(以日为最小单位),然后来作为条件进行查询,如果直接通过"between starttime and endtime"来作为条件的话,发现会自动将"2009-06-17"转化为" 2009-06-17 00:00:00",于是如下查询条件" between '2009-06-16' and '2009-06-17'",只能得到16日的数据,1

  • sql server中datetime字段去除时间的语句

    select CONVERT(varchar, getdate(), 120 )  2004-09-12 11:06:08 select replace(replace(replace(CONVERT(varchar, getdate(), 120 ),\'-\',\'\'),\' \',\'\'),\':\',\'\')  20040912110608 select CONVERT(varchar(12) , getdate(), 111 )  2004/09/12 select CONVER

  • sql server中datetime字段去除时间代码收藏

    select CONVERT(varchar, getdate(), 120 )  2004-09-12 11:06:08 select replace(replace(replace(CONVERT(varchar, getdate(), 120 ),\'-\',\'\'),\' \',\'\'),\':\',\'\')  20040912110608 select CONVERT(varchar(12) , getdate(), 111 )  2004/09/12 select CONVER

  • mysql From_unixtime及UNIX_TIMESTAMP及DATE_FORMAT日期函数

    from_unixtime()是MySQL里的时间函数 date为需要处理的参数(该参数是Unix 时间戳),可以是字段名,也可以直接是Unix 时间戳字符串 后面的 '%Y%m%d' 主要是将返回值格式化 例如: mysql>SELECT FROM_UNIXTIME( 1249488000, '%Y%m%d' ) ->20071120 mysql>SELECT FROM_UNIXTIME( 1249488000, '%Y年%m月%d' ) ->2007年11月20 UNIX_TI

  • SqlDateTime溢出该怎么解决

    错误出现:导入数据时出现"SqlDateTime 溢出.必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM之间." 出现这种问题多半是因为你插入或者更新数据库时datetime字段值为空默认插入0001年01月01日造成datetime类型溢出. 原因分析: 关于DateTime,在将DateTime类型,插入到数据库的时候,最容易出现的一种错误:"SqlDateTime 溢出.必须介于 1/1/1753 12:00:00 A

  • MySql用DATE_FORMAT截取DateTime字段的日期值

    用 DATE_FORMAT 来格式化日期字段 SELECT DATE_FORMAT(crt_time,'%Y-%m-%d') FROM ad_n_advertise_t

  • MySQL时间字段究竟使用INT还是DateTime的说明

    今天解析DEDECMS时发现deder的MYSQL时间字段,都是用 `senddata` int(10) unsigned NOT NULL DEFAULT '0'; 随后又在网上找到这篇文章,看来如果时间字段有参与运算,用int更好,一来检索时不用在字段上转换运算,直接用于时间比较!二来如下所述效率也更高. 归根结底:用int来代替data类型,更高效. 环境: Windows XP PHP Version 5.2.9 MySQL Server 5.1 第一步.创建一个表date_test(非

  • sql语句中如何将datetime格式的日期转换为yy-mm-dd格式

    如果在asp中我们可以用year(date())这样的格式在sql语句中,不知道这样的效率怎么样不过是个方法 复制代码 代码如下: select substring(convert(char,registdate,120),1,10) as registdate from tbuser

  • Sql中将datetime转换成字符串的方法(CONVERT)

    一.回顾一下CONVERT()的语法格式:CONVERT (<data_ type>[ length ], <expression> [, style])二.这里注重说明一下style的含义:style 是将DATATIME 和SMALLDATETIME 数据转换为字符串时所选用的由SQL Server 系统提供的转换样式编号,不同的样式编号有不同的输出格式:一般在时间类型(datetime,smalldatetime)与字符串类型(nchar,nvarchar,char,varc

  • 使用 MySQL Date/Time 类型

    由于曾经和他是同一个团队的,所以对于其我很熟悉他那"洁癖"的做法,对于他的很多的观点我也非常的赞同:但是有一件非常不理解的地方就是设计数据库的时候总是会回避使用 Date/Time 类型.他的做法是将时间相关的字段设置为 INT(10) 类型,然后用 UNIX 时间戳来存储.而我本人对于这点做法非常的不赞同: 首先,是类型操作的不同,类似于 wiLdGoose 这样做法的"时间计算"实质上是整形之间的操作(而且这个整形非常大,长度为 10).更有甚者,将时间戳设置为

随机推荐