SQL Server CONVERT() 函数一点疑问

SQL/NoSQL 2013-03-08 MSSQL,CONVERT

SQL Server CONVERT()函数是格式化时间,在做时间对比时很有用。但CONVERT()函数的第二个参数虽然是日期类型,但不接受字符串拼接的格式?

什么是CONVERT()?

CONVERT() 函数是把日期转换为新数据类型的通用函数。
CONVERT() 函数可以用不同的格式显示日期/时间数据。

语法

CONVERT(data_type(length),data_to_be_converted,style)

data_type(length) 规定目标数据类型(带有可选的长度)。data_to_be_converted 含有需要转换的值。style规定日期/时间的输出格式。

 

可以使用的 style 值:

Style ID Style 格式
100 或者 0 mon dd yyyy hh:miAM (或者 PM)
101 mm/dd/yy
102 yy.mm.dd
103 dd/mm/yy
104 dd.mm.yy
105 dd-mm-yy
106 dd mon yy
107 Mon dd, yy
108 hh:mm:ss
109 或者 9 mon dd yyyy hh:mi:ss:mmmAM(或者 PM)
110 mm-dd-yy
111 yy/mm/dd
112 yymmdd
113 或者 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:mmmAM
131 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

郁闷。。。

文字链接:《SQL Server CONVERT() 函数一点疑问

文章地址:http://www.qttc.net/201303286.html

除非标注,琼台博客所有博文均为原创,转载请加文字链接注明来源

乳名?小名?昵称?网名?均可

email,放心,我不会给你乱投广告的

想获得回访就把你的站点URL写上(没有留空)

[NOTICE]木要投放广告
[NOTICE]木要骂人,说不该说的话
[NOTICE]自由言论,但要遵纪守法

Comments 0

    Hi,你想第一个做沙发么?