当前位置:七道奇文章资讯数据防范MSSQL防范
日期:2011-05-02 15:21:00  来源:本站整理

SQLServer时间格局浅析[MSSQL防范]

赞助商链接



  本文“SQLServer时间格局浅析[MSSQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
 

 www.iTbulo.com-OIJml

sql server时间格局浅析www.iTbulo.com-OIJml

 www.iTbulo.com-OIJml

数据库中时间日期常常是一个很重要的数据.各个计算机上的时间常常差别,为了在数据库中插入统一的时间,假如是取当前时刻,最好直接从数据库服务器读取.比方有一个表名为tablename的表格,此中columnname字段是当前记录插入时的当前时间,则该插入语句应写为:insert into table name (columnname,…) values (GetDate(),…).这样GetDate()函数将数据库服务器的当前时间插入该记录中.www.iTbulo.com-OIJml

在查找全部当天的记录前,先来解析一下T-SQL的时间日期表示方法.在T-SQL中,时间日期格局数据范例实际上是一个浮点数范例,记录的是当前时间到1900110时的天数,加上剩余的时间化成小数.下面的语句:www.iTbulo.com-OIJml

select getdate() as 当前时间,cast(getdate() as float) as 190011日天数www.iTbulo.com-OIJml

将返回:www.iTbulo.com-OIJml

 www.iTbulo.com-OIJml

当前时间                        190011日天数www.iTbulo.com-OIJml

--------------------------- -----------------------------------------------------www.iTbulo.com-OIJml

2001-11-10 11:05:35.733                        37203.462219135799www.iTbulo.com-OIJml

 www.iTbulo.com-OIJml

(1 row(s) affected)www.iTbulo.com-OIJml

 www.iTbulo.com-OIJml

所以要查找当天插入的记录,理所该当的会想到用GetDate()获得两个当前时间,并将前一个用ConvertCast函数转换为整数(记为IntToday),将后一个转换为浮点数(记为FloatNow),再将需求查找的记录日期也转换为浮点数(记为FloatCheck),只要利用条件"…where FloatCheck between IntToday and FloatNow"便可以找出哪些时间是属于本日的时间.目前看起来确切如此.www.iTbulo.com-OIJml

表格testtable有三个字段,id是一个自动增长的主键,inserttime是记录插入时刻的时间,comment字段是为了便利察看设立的.该表格中共有四条记录,前两条记录是119日插入的,后两条是1110日插入的.www.iTbulo.com-OIJml

第一条SQL语句返回该表格中的全部记录.www.iTbulo.com-OIJml

select * from testtablewww.iTbulo.com-OIJml

 www.iTbulo.com-OIJml

id                    inserttime                              commentwww.iTbulo.com-OIJml

------------ -------------------------------------- --------------------------------------------www.iTbulo.com-OIJml

1                   2001-11-09 10:28:42.943                    第一条记录www.iTbulo.com-OIJml

2                   2001-11-09 17:43:22.503                    第二条记录www.iTbulo.com-OIJml

3                   2001-11-10 11:29:11.907                     第三条记录www.iTbulo.com-OIJml

4                   2001-11-10 11:29:51.553                    第四条记录www.iTbulo.com-OIJml

 www.iTbulo.com-OIJml

(4 row(s) affected)www.iTbulo.com-OIJml

 www.iTbulo.com-OIJml

下面的语尝试选出本日(20011110日)插入的记录,该语句履行时的数据库服务器时间是2001-11-10 11:40:57.800www.iTbulo.com-OIJml

 www.iTbulo.com-OIJml

select * from testtable where cast(inserttime as float) between cast(GetDate() as int) and cast(GetDate() as float)www.iTbulo.com-OIJml

 www.iTbulo.com-OIJml

id                    inserttime                              commentwww.iTbulo.com-OIJml

------------ -------------------------------------- --------------------------------------------www.iTbulo.com-OIJml

3                   2001-11-10 11:29:11.907                     第三条记录www.iTbulo.com-OIJml

4                   2001-11-10 11:29:51.553                    第四条记录www.iTbulo.com-OIJml

(2 row(s) affected)www.iTbulo.com-OIJml

 www.iTbulo.com-OIJml

这条语句成功地过滤了前一天产生的记录.www.iTbulo.com-OIJml

目前地1151分,午饭时间到了,我要等一会再持续工作.www.iTbulo.com-OIJml

1226分,开始工作前让我先赏识一下自己的"杰作".但是,出问题了,那条用来过滤的语句什么也没有返回.去掉where子句再履行,本来的记录还在.也就是说数据库里的记录不再满意条件了.没有别的办法,让我们来看看条件发生了什么改变.www.iTbulo.com-OIJml

履行语句:www.iTbulo.com-OIJml

select cast(inserttime as float) as FloatCheck,cast(GetDate() as int) as IntToday,cast(GetDate() as float) as FloatNow from testtablewww.iTbulo.com-OIJml

后果返回:www.iTbulo.com-OIJml

 www.iTbulo.com-OIJml

FloatCheck                      IntToday                              FloatNowwww.iTbulo.com-OIJml

-----------------------------------------------------------------------------------www.iTbulo.com-OIJml

3702.43660814043                    37204                   3703.524545756176www.iTbulo.com-OIJml

3702.728274807101                   37204                   3703.524545756176www.iTbulo.com-OIJml

3703.478610030863                   37204                   3703.524545756176www.iTbulo.com-OIJml

3703.479068904322                   37204                   3703.524545756176www.iTbulo.com-OIJml

 www.iTbulo.com-OIJml

(4 row(s) affected)www.iTbulo.com-OIJml

 www.iTbulo.com-OIJml

注意到IntTodayFloatNow大,这就是条件不再满意的缘由.本来cast()函数并不简单地去掉小数,而是四舍五入,所以下午(cast(GetDate() as int))返回的值比上午返回的要大1.在程序中不大概先判断上午和下午再挑选SQL语句履行,因此有必要对GetDate()返回的值做一下数学上的处理.注意到cast(GetDate() as int)当天下午返回的值和前一天下午返回的值一样大,我的办法是先将GetDate()值减去0.5.这样假如是上午,减去0.5后变成前一天的下午,小数部份"入",假如是下午,减去0.5后变成当天上午,小数部份"去".写成的新语句以下:www.iTbulo.com-OIJml

select * from testtable where cast(inserttime as float) between cast(GetDate()-0.5 as int) and cast(GetDate() as float)www.iTbulo.com-OIJml

履行后果正常.www.iTbulo.com-OIJml

别的,事实上float(也大概是real)数据范例是DateTime数据范例的基本范例,所以它们之间可以透明地对比,也就是说没必要举行转换就可以直接对比,像这样:www.iTbulo.com-OIJml

select * from testtable where inserttime between cast(GetDate()-0.5 as int) and GetDate()www.iTbulo.com-OIJml

我先前做的转换只是为了便利阐明.www.iTbulo.com-OIJml

  以上是“SQLServer时间格局浅析[MSSQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • sqlserver索引的原理及索引成立的注意事项小结
  • sqlserver数据库主键的生成方法小结(sqlserver,mysql)
  • sqlserver主键计划的注意点
  • CREATE FUNCTION sqlserver用户定义函数
  • 利用cmd号令行窗口操作SqlServer的办法
  • sqlserver bcp(数据导入导出工具)普通用法与号令详解
  • 重命名SQLServer数据库的办法
  • 利用SqlBulkCopy时应注意Sqlserver表中利用缺省值的列
  • sqlserver中将varchar范例转换为int型再举行排序的办法
  • sqlserver 改正列名及表名的sql语句
  • SQLServer顶用T—SQL号令查询一个数据库中有哪些表的sql语句
  • sqlserver 脚本和批处理指令小结
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .