sql日期查询问题

曾经遇到这样的情况,在数据库的Meeting表中有PublishTime(DateTime,8)字段,用来存储一个开会时间,在存入时由于要指明开会具体时间,故格式为yyyy-mm-ddhh:mm:ss,而我们查询时是通过yyyy-mm-dd来进行的,即查询某一天的所有会议信息,这样如果通过select*fromMeetingwherePublishTime=@PublishTime(参数@PublishTime为yyyy-mm-dd格式)语句进行查询将无法得到正确结果,比如我们要查询2004年12月1日的会议信息,在输入2004-12-01时就不能得到查询结果,而这种查询又不能要求输入具体的hh:mm:ss.
此时我们需要使用convert函数,它可以将一种数据类型的表达式转换为另一种数据类型的表达式.此处我们先将数据库内的datetime类型转换为char类型,由于输入的参数是10位的,所以写成
select*fromMeetingwhereconvert(varchar(10),PublishTime,121))=@PublishTime,这样在查询时数据库得到参数后先自动将数据库内的信息转换为yyyy-mm-dd格式的10位字符,只要与参数相同即可返回查询结果.而convert中的121是指将datetime类型转换为char类型时获得包括世纪位数的4位年份

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 规范yyyymm-dd hh:mm:ss[.fff]-21 或 121
(*) ODBC 规范(带毫秒)yyyymm-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

if
(@StartTime > @EndTime)
    Set @EndTime = cast (convert (char , @ScheduleDate + 1 , 101)+’ ‘+convert (char , @EndTime, 108) as datetime )   
Else
    Set @EndTime = cast (convert (char , @ScheduleDate  , 101)+’ ‘+convert (char , @EndTime, 108) as datetime )
   
Set @StartTime = cast (convert (char , @ScheduleDate , 101)+’ ‘+convert (char , @StartTime, 108) as datetime )

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

     这条语句中的Convert,Cast 的意思,作用

select CONVERT(varchar, getdate(), 120 )
2004-09-12 11:06:08

  Convert
(data_type[,length],expression[,style])

select replace(replace(replace(CONVERT(varchar, getdate(), 120
),\’-\’,\’\’),\’ \’,\’\’),\’:\’,\’\’)
20040912110608

这个转换函数一般在时间类型和字符串类型转换的时候才用到.

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

style格式在转换时间时候的格式如下:

select CONVERT(varchar(12) , getdate(), 112 )
20040912

    Style(2位表示年份)   
|   Style(4位表示年份)    |   

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

输入输出格式                                    

0                                | 100                            |