SQLServer CONVERT()用法疑问

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

什么是CONVERT()

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

语法

CONVERT(data_type(length),data_to_be_converted,style)

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

可以使用的style值:

  • 100或者0mon dd yyyy hh:miAM (或者 PM)
  • 101mm/dd/yy
  • 102yy.mm.dd
  • 103dd/mm/yy
  • 104dd.mm.yy
  • 105dd-mm-yy
  • 106dd mon yy
  • 107Mon dd, yy
  • 108hh:mm:ss
  • 109或者9mon dd yyyy hh:mi:ss:mmmAM(或者 PM)
  • 110mm-dd-yy
  • 111yy/mm/dd
  • 112yymmdd
  • 113或者13dd mon yyyy hh:mm:ss:mmm(24h)
  • 114hh:mi:ss:mmm(24h)
  • 120或者20yyyy-mm-dd hh:mi:ss(24h)
  • 121或者21yyyy-mm-dd hh:mi:ss.mmm(24h)
  • 126yyyy-mm-ddThh:mm:ss.mmm(没有空格)
  • 130dd mon yyyy hh:mi:ss:mmmAM
  • 131dd/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郁闷。。。

分享

TITLE: SQLServer CONVERT()用法疑问

LINK: https://www.qttc.net/286-sqlserver-convert.html

NOTE: 原创内容,转载请注明出自琼台博客