SQLServer CONVERT()函数是格式化时间,在做时间对比时很有用。但CONVERT()函数的第二个参数虽然是日期类型,但不接受字符串拼接的格式
什么是CONVERT()
CONVERT()函数是把日期转换为新数据类型的通用函数。此函数可以用不同的格式显示日期/时间数据。
语法
CONVERT(data_type(length),data_to_be_converted,style)
- data_type(length) 规定目标数据类型(带有可选的长度)
- data_to_be_converted 含有需要转换的值
- style规定日期/时间的输出格式。
可以使用的style值:
100或者0
mon dd yyyy hh:miAM (或者 PM)101
mm/dd/yy102
yy.mm.dd103
dd/mm/yy104
dd.mm.yy105
dd-mm-yy106
dd mon yy107
Mon dd, yy108
hh:mm:ss109或者9
mon dd yyyy hh:mi:ss:mmmAM(或者 PM)110
mm-dd-yy111
yy/mm/dd112
yymmdd113或者13
dd mon yyyy hh:mm:ss:mmm(24h)114
hh:mi:ss:mmm(24h)120或者20
yyyy-mm-dd hh:mi:ss(24h)121或者21
yyyy-mm-dd hh:mi:ss.mmm(24h)126
yyyy-mm-ddThh:mm:ss.mmm(没有空格)130
dd mon yyyy hh:mi:ss:mmmAM131
dd/mm/yy hh:mi:ss:mmmAM
实例
1、格式化时间
1> select CONVERT(varchar(8),getdate(),112)
2> go
20130308
(1 row affected)
1> select CONVERT(varchar(10),getdate(),105)
2> go
08-03-2013
(1 row affected)
1> select getdate()
2> go
2013-03-08 10:30:30
(1 row affected)
1>
2、获取某天所有的数据
表里数据
1> select * from s_sign_log
2> go
id user_id room_id create_time
1 297211672 8586 2013-03-07 16:05:52
2 297211672 8588 2013-03-07 16:17:18
3 297211671 8588 2013-03-07 16:25:14
4 297211671 9983 2013-03-07 18:21:55
5 297211671 9983 2013-03-08 10:33:17
(5 rows affected)
取出昨天所有数据
1> select * from s_sign_log where CONVERT(varchar(8),create_time,112) = CONVERT(varchar(8),dateadd(dd,-1,getdate()),112)
2> go
id user_id room_id create_time
1 297211672 8586 2013-03-07 16:05:52
2 297211672 8588 2013-03-07 16:17:18
3 297211671 8588 2013-03-07 16:25:14
4 297211671 9983 2013-03-07 18:21:55
(4 rows affected)
取出今天所有数据
1> select * from s_sign_log where CONVERT(varchar(8),create_time,112) = CONVERT(varchar(8),getdate(),112)
2> go
id user_id room_id create_time
5 297211671 9983 2013-03-08 10:33:17
(1 row affected)
小疑问
以上例子,看起貌似没啥问题,感觉CONVERT函数里的第二个参数只要是日期类型都可以。实际上不能这么用,请看下面例子
1、先来看看getdate()出来啥
1> select getdate();
2> go
2013-03-08 10:40:41
(1 row affected)
2、直接使用getdate()套进CONVERT()参数里没问题
1> select CONVERT(varchar(8),getdate(),112)
2> go
20130308
(1 row affected)
3、直接使用表里的日期类型套进CONVERT()参数里也没问题
1> select create_time from s_sign_log
2> go
create_time
2013-03-07 16:05:52
2013-03-07 16:17:18
2013-03-07 16:25:14
2013-03-07 18:21:55
2013-03-08 10:33:17
(5 rows affected)
1> select CONVERT(varchar(8),create_time,112) from s_sign_log
2> go
20130307
20130307
20130307
20130307
20130308
(5 rows affected)
4、以上用法看起来貌似只要是时间格式,至少也是2013-03-07 16:05:52类型当作参数也可以,于是我们来看看下面的例子
1> select CONVERT(varchar(8),'2013-03-07 16:05:52',112)
2> go
2013-03-
(1 row affected)
1>
出错了,不知道这是什么原因出来的结果是
2013-03-
而不是20130307
郁闷。。。