开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 6478|回复: 46
收起左侧

[MSSQL] sql日期查询问题

[复制链接]
结帖率:76% (13/17)
发表于 2011-3-23 09:55:33 | 显示全部楼层 |阅读模式   河南省漯河市
SQL Server日期查询时的日期格式转换
问题提出:
经常会有这样的查询要求,输入或者日历控件产生的日期格式为 yyyy-mm-dd,而数据库中的字段是datetime类型,即yyyy-mm-dd hh:mm:ss。如果简单的使用between语句或者=语句进行查询,查询结果可能是错误或者数据不全。
假设 数据库中有 2008-2-27 日的数据,但直接使用 fielddate='2008-2-27' 或者使用 between '2008-2-27' and '2008-2-27'将不能查到该天的数据。

问题解决:
使用SQL Server提供的Convert函数进行转换,由于2008-02-27最长是10位,所以使用如下语句 convert(varchar(10),fielddate,121))进行转换,其中fielddate为数据表的字段名。这样在查询时数据库得到参数后先自动将数据库内的信息转换为yyyy-mm-dd格式的10位字符,只要与参数相同即可返回查询结果.而convert中的121是指将datetime类型转换为char类型时获得包括世纪位数的4位年份。
Convert函数的一些说明,以下资料来源于网络
不带世纪数位 (yy)带世纪数位 (yyyy)
标准
输入/输出**-0 或 100 (*) 默认值mon dd yyyy hh:miAM(或 PM)1101美国mm/dd/yyyy2102ANSIyy.mm.dd3103英国/法国dd/mm/yy4104德国dd.mm.yy5105意大利dd-mm-yy6106-dd mon yy7107-mon dd, yy8108-hh:mm:ss-9 或 109 (*) 默认值 + 毫秒mon dd yyyy hh:mi:ss:mmmAM(或 PM)10110美国mm-dd-yy11111日本yy/mm/dd12112ISOyymmdd-13 或 113 (*) 欧洲默认值 + 毫秒dd mon yyyy hh:mm:ss:mmm(24h)14114-hh:mi:ss:mmm(24h)-20 或 120 (*) ODBC 规范yyyy-mm-dd hh:mm:ss[.fff]-21 或 121 (*) ODBC 规范(带毫秒)yyyy-mm-dd hh:mm:ss[.fff]-126(***)ISO8601yyyy-mm-dd Thh:mm:ss:mmm(不含空格)-130*科威特dd mon yyyy hh:mi:ss:mmmAM-131*科威特dd/mm/yy hh:mi:ss:mmmAM

*    默认值(style 0 或 100、9 或 109、13 或 113、20 或 120、21 或 121)始终返回世纪数位 (yyyy)。
** 当转换为 datetime 时输入;当转换为字符数据时输出。
*** 专门用于 XML。对于从 datetime 或 smalldatetime 到 character 数据的转换,输出格式如表中所示。对于从 float、money 或 smallmoney 到 character 数据的转换,输出等同于 style 2。对于从 real 到 character 数据的转换,输出等同于 style 1。
使用 CONVERT:
CONVERT (data_type[(length)], expression [, style])

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 CONVERT(varchar(12) , getdate(), 112 )
20040912

select CONVERT(varchar(12) , getdate(), 102 )
2004.09.12

select CONVERT(varchar(12) , getdate(), 101 )
09/12/2004

select CONVERT(varchar(12) , getdate(), 103 )
12/09/2004

select CONVERT(varchar(12) , getdate(), 104 )
12.09.2004

select CONVERT(varchar(12) , getdate(), 105 )
12-09-2004

select CONVERT(varchar(12) , getdate(), 106 )
12 09 2004

select CONVERT(varchar(12) , getdate(), 107 )
09 12, 2004

select CONVERT(varchar(12) , getdate(), 108 )
11:06:08

select CONVERT(varchar(12) , getdate(), 109 )
09 12 2004 1

select CONVERT(varchar(12) , getdate(), 110 )
09-12-2004

select CONVERT(varchar(12) , getdate(), 113 )
12 09 2004 1

select CONVERT(varchar(12) , getdate(), 114 )
11:06:08.177
结帖率:76% (13/17)
 楼主| 发表于 2011-3-23 09:56:59 | 显示全部楼层   河南省漯河市
别人的,说法,留看来学习

 回复 引用 查看    #1楼2010-05-18 21:09 | 天天      
datediff('d',getdate(),d2)=0 即可

 回复 引用 查看    #2楼2010-05-18 22:24 | lcs-帅      
datediff

 回复 引用 查看    #3楼2010-05-18 22:36 | Alex He      
标记,后面的那数字不好记

 回复 引用 查看    #4楼2010-05-18 23:02 | 尘尘      
能不能不要什么都放首页?

 回复 引用 查看    #5楼2010-05-18 23:17 | help_hostwork      
我一般是这样写的
date>='2010-04-01 00:00:00' and
date<='2010-04-01 23:59:59'

对于否?

 回复 引用 查看    #6楼2010-05-18 23:39 | 豌豆      
虽然得到了正确的查询结果
但convert(varchar,getdate(),112)='20100518'
或datediff('d',getdate(),d2)=0
都利用不到sql的索引
强烈不建议如此使用

5楼的
date>='2010-04-01 00:00:00' and
date<='2010-04-01 23:59:59'

优化一下,改成
日期>='20100401' and 日期<dateadd(day,1,'20100430')
这样是个人认为的最优日期查询方式

 回复 引用 查看    #7楼2010-05-19 08:33 | 真名士      
应该是datediff(d,getdate(),d2)=0 吧


 回复 引用 查看    #8楼2010-05-19 09:39 | 寒 刚入门      
想要日期字段用上索引就别用函数转换.

推荐这种
date>='2010-04-01 00:00:00' and
date<='2010-04-01 23:59:59'

date between '2010-04-01 00:00:00' and '2010-04-01 23:59:59'

 回复 引用 查看    #9楼2010-05-19 10:02 | d.zd      
优化一下,改成
日期>='20100401' and 日期<dateadd(day,1,'20100430')
这样是个人认为的最优日期查询方式

这样会把 201000501的数据也查出来

 回复 引用 查看    #10楼2010-05-19 11:58 | MaoBisheng      
date between '2010-04-01 00:00:00' and '2010-04-01 23:59:59'
这个是最好的吧
在where条件里使用诸如date>CONVERT(varchar(12) , getdate(), ...)的函数,会破坏date的索引的
回复 支持 反对

使用道具 举报

签到天数: 5 天

发表于 2011-3-23 10:52:50 | 显示全部楼层   江苏省苏州市
本帖隐藏的内容需要回复才可以浏览

评分

参与人数 1好评 -1 精币 -1 收起 理由
qsdya01 -1 -1 回复一下这么难吗?

查看全部评分

回复 支持 反对

使用道具 举报

发表于 2011-3-23 12:43:36 | 显示全部楼层   湖北省荆门市
显示指定日期的??
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)
发表于 2011-3-23 14:32:34 | 显示全部楼层   江西省南昌市
到底是什么!
回复 支持 反对

使用道具 举报

结帖率:76% (13/17)
 楼主| 发表于 2011-3-24 20:54:04 | 显示全部楼层   河南省漯河市
回复 4# pizzaviat


    呵呵,看了吧
回复 支持 反对

使用道具 举报

结帖率:68% (13/19)
发表于 2011-3-24 21:00:51 | 显示全部楼层   福建省南平市
到底是什么{:3_244:}
回复 支持 反对

使用道具 举报

发表于 2011-3-26 17:19:38 | 显示全部楼层   广东省广州市
学习下啦。。
回复 支持 反对

使用道具 举报

发表于 2011-4-2 21:50:10 | 显示全部楼层   海南省三亚市
甚么东东啊
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)
发表于 2011-4-3 09:27:13 | 显示全部楼层   江苏省宿迁市
最近找了很久了,学习一下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表