MS SQL SERVER中时间的精度问题

    在SQL SERVER中时间的精度为1/300秒,换句话说在SQL SERVER中1代表1/300S,所以1S在SQL SERVER中存储时对应的十进制数据是300,十六进制为12C。300是这样的到的:1除以1/300。   那么在SQL SERVER中的其他的ms如何表示呢?   在下面的例子中,使用一个循环在表中插入1000行,每行分别增加1ms,但是在SQL SERVER中表示并不是按照0.001,0.002,0.003等来表示的,而是进行了相应的处理。


declare @tb table(id int identity(0,1),date datetime)

declare @count int,@i floatset @count=0

while(@count<=1000)  begin    

insert into @tb values(dateadd(ms,@count,'00:00:00.000'))    

set @count=@count+1      

end

select id,date ,cast(date as binary(8)) as [binary] ,cast(cast(date as binary(8)) as int) as [int]from @tb

结果为:id                    date                    binary                         int

           0 1900-01-01  00:00:00.000 0x0000000000000000   0

           1 1900-01-01 00:00:00.000 0x0000000000000000    0

           2 1900-01-01 00:00:00.003 0x0000000000000001   1

           3 1900-01-01 00:00:00.003 0x0000000000000001   1

          4 1900-01-01 00:00:00.003 0x0000000000000001    1

          5 1900-01-01 00:00:00.007 0x0000000000000002    2

          6 1900-01-01 00:00:00.007 0x0000000000000002    2

         7 1900-01-01 00:00:00.007 0x0000000000000002     2

        8 1900-01-01 00:00:00.007 0x0000000000000002     2

        9 1900-01-01 00:00:00.010 0x0000000000000003     3

       10 1900-01-01 00:00:00.010 0x0000000000000003    3


     999 1900-01-01 00:00:01.000 0x000000000000012C 300

   1000 1900-01-01 00:00:01.000 0x000000000000012C 300

      对于0.000来说对应的二进制数字为0,那么对应的数字为0 ,

   0.001来说对应的二进制数字如何得到呢?1/1000除以1/300得到0.3四舍五入为0,那么对应的数字为0   

   0.002来说对应的二进制数字如何得到呢?2/1000除以1/300得到0.6四舍五入为1,那么对应的数字为1   

   0.003来说对应的二进制数字如何得到呢?3/1000除以1/300得到0.9四舍五入为1,那么对应的数字为1   

   0.004来说对应的二进制数字如何得到呢?4/1000除以1/300得到1.2四舍五入为1,那么对应的数字为1   

   0.005来说对应的二进制数字如何得到呢?5/1000除以1/300得到1.5四舍五入为2,那么对应的数字为2   

   0.006来说对应的二进制数字如何得到呢?6/1000除以1/300得到1.8四舍五入为2,那么对应的数字为2   

   0.007来说对应的二进制数字如何得到呢?7/1000除以1/300得到2.1四舍五入为2,那么对应的数字为2   

   0.008来说对应的二进制数字如何得到呢?8/1000除以1/300得到2.4四舍五入为2,那么对应的数字为2   

   0.009来说对应的二进制数字如何得到呢?9/1000除以1/300得到2.7四舍五入为3,那么对应的数字为3   

   0.010来说对应的二进制数字如何得到呢?10/1000除以1/300得到3四舍五入为3,那么对应的数字为3   

   0.011来说对应的二进制数字如何得到呢?11/1000除以1/300得到3.3四舍五入为3,那么对应的数字为3


 

 那么

  DECLARE @t TABLE(date char(21))

   INSERT @t SELECT '1900-1-1 00:00:00.000'

  INSERT @t SELECT '1900-1-1 00:00:00.001'

  INSERT @t SELECT '1900-1-1 00:00:00.002'

INSERT @t SELECT '1900-1-1 00:00:00.003'

INSERT @t SELECT '1900-1-1 00:00:00.004'

INSERT @t SELECT '1900-1-1 00:00:00.005'

INSERT @t SELECT '1900-1-1 00:00:00.006'

INSERT @t SELECT '1900-1-1 00:00:00.007'

INSERT @t SELECT '1900-1-1 00:00:00.008'

INSERT @t SELECT '1900-1-1 00:00:00.009'

SELECT date,转换后的日期=CAST(date as datetime) FROM @t结果为:   date                                     转换后的日期

1900-1-1 00:00:00.000 1900-01-01 00:00:00.000

1900-1-1 00:00:00.001 1900-01-01 00:00:00.000

1900-1-1 00:00:00.002 1900-01-01 00:00:00.003

1900-1-1 00:00:00.003 1900-01-01 00:00:00.003

1900-1-1 00:00:00.004 1900-01-01 00:00:00.003

1900-1-1 00:00:00.005 1900-01-01 00:00:00.007

1900-1-1 00:00:00.006 1900-01-01 00:00:00.007

1900-1-1 00:00:00.007 1900-01-01 00:00:00.007

1900-1-1 00:00:00.008 1900-01-01 00:00:00.007

1900-1-1 00:00:00.009 1900-01-01 00:00:00.010

了解了上面的日期的表示方式后,0.000与0.001为什么表示成0.000就好理解了。

0.000与0.001使用0来表示,那么使用0乘以1/300后为0,所以转换后的日期为1900-01-01 00:00:00.000

0.002、0.003、0.004使用1来表示,那么使用1乘以1/300后为0.0033,进行四舍五入,所以转换后的日期为1900-01-01 00:00:00.003

0.005、0.006、0.007、0.008使用2来表示,那么使用2乘以1/300后为0.0066,进行四舍五入,所以转换后的日期为1900-01-01 00:00:00.007

0.009使用3表示,那么使用3乘以1/300后为0.010,进行四舍五入,所以转换后的日期为1900-01-01 00:00:00.010  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL SERVER 的函数<br>1.字符串函数 <br>长度与分析用 <br>datalength(Char_expr) 返回字符串包含字符数,但不包含后面的空格 <br>substring(expression,start,length) 不多说了,取子串 <br>right(char_expr,int_expr) 返回字符串右边int_expr个字符 <br>字符操作类 <br>upper(char_expr) 转为大写 <br>lower(char_expr) 转为小写 <br>space(int_expr) 生成int_expr个空格 <br>replicate(char_expr,int_expr)复制字符串int_expr次 <br>reverse(char_expr) 反转字符串 <br>stuff(char_expr1,start,length,char_expr2) 将字符串char_expr1的从 start开始的length个字符用char_expr2代替 <br>ltrim(char_expr) rtrim(char_expr) 取掉空格 <br>ascii(char) char(ascii) 两函数对应,取ascii码,根据ascii吗取字符 <br>字符串查找 <br>charindex(char_expr,expression) 返回char_expr的起始位置 <br>patindex("%pattern%",expression) 返回指定模式的起始位置,否则为0 <br>2.数学函数 <br>abs(numeric_expr) 求绝对值 <br>ceiling(numeric_expr) 取大于等于指定值的最小整数 <br>exp(float_expr) 取指数 floor(numeric_expr) 小于等于指定值得最大整数 <br>pi() 3.1415926......... <br>power(numeric_expr,power) 返回power次方 <br>rand([int_expr]) 随机数产生器 <br>round(numeric_expr,int_expr) 安int_expr规定的精度四舍五入 <br>sign(int_expr) 根据正数,0,负数,,返回+1,0,-1 <br>sqrt(float_expr) 平方根 <br>3.日期函数 <br>getdate() 返回日期 <br>datename(datepart,date_expr) 返回名称如 June <br>datepart(datepart,date_expr) 取日期一部份 <br>datediff(datepart,date_expr1.dateexpr2) 日期差 <br>dateadd(datepart,number,date_expr) 返回日期加上 number <br>上述函数datepart的 写法 取值和意义 <br>yy 1753-9999 年份 <br>qq 1-4 刻 <br>mm 1-12 月 <br>dy 1-366 日 <br>dd 1-31 日 <br>wk 1-54 周 <br>dw 1-7 周几 <br>hh 0-23 小时 <br>mi 0-59 分钟 <br>ss 0-59 秒 <br>ms 0-999 毫秒 <br>日期转换 convert() <br>4.系统函数 <br>suser_name() 用户登录名 <br>user_name() 用户在数据库的名字 user 用户在数据库的名字 <br>show_role() 对当前用户起作用的规则 <br>db_name() 数据库名 <br>object_name(obj_id) 数据库对象名 <br>col_name(obj_id,col_id) 列名 <br>col_length(objname,colname) 列长度 <br>valid_name(char_expr) 是否是有效标识符

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值