代码改变世界

关于在查询统计中日期的比较

2005-07-20 11:49  胖子  阅读(945)  评论(0编辑  收藏  举报

闻道有先后,术业有专攻。
没想到近来被SQL SERVER的日期时间搞的头晕脑胀。

在数据库的设计中,一般情况,时间、日期的字段是DateTime的数据类型,而且数据库本身都会提供获取当前日期时间的函数,如Access中的Now()和MS SQL Server中的GetDate(),格式如下:“yyyy-MM-dd HH:mm:ss”。如果输入的时候只输入日期,那么在数据库中存储的时候,还是会自动的加上时间的格式如下: “yyyy-MM-dd 00:00:00”。

如此一来,问题就出现了,在我们添加记录的时候,我们会用系统提供的函数来记录时间,但当我们进行查询或者统计的时候,绝大多数是按天来查询的,如从2005-07-01到2005-07-20,我们的意思就是2005-07-01或2005-07-20的当天全部,2005-07-20 15:12:30我们当然认为这也是2005-7-20那天的记录,但SQL server可并不这么认为,2005-07-20 15:12:30 和 2005-07-20 00:00:00 这是两条不相等的记录,时间不对嘛。但我们却认为,这都是2005-07-20这一天的,应该相等,所以误差就来了。

这两天做统计,差点儿被这东西搞的欲哭无泪。明明统计到19号,偏偏多了一条20号这天的记录(这是不对的);我统计到20号,记录却没有到21号(应该是这样的)。查找了老半天原因,终于发现,是在生成交叉表的时候,用到了日期作为判断条件,正是由于这小小的时间,导致了判断条件的不准确。

解决办法:对DateTime格式的数据进行转换,然后再比较。
如采用 “yyyy-MM-dd” 格式的,就用convert(varchar(10),cdate,120)
    采用 “yyyy/MM/dd” 格式的,就用convert(varchar(10),cdate,111)

另:在SQL Server中的帮助文档里说的很清楚“请将 datetime 或 smalldatetime 值用单引号引起来。”但是,你要是不用单引号,系统也不会说你错的,但是,呵呵,结果可就相差十万八千里了。