CONVERT()中的第三个参数是做什么的?

时间:2013-05-10 12:43:57

标签: sql-server-2008 tsql sql-server-2008-r2

查询

从员工表中获取加入年份,加入月份和加入日期

这是我必须执行的查询。为此我写了以下脚本:

select 
    SUBSTRING (convert(varchar,joining_date,103),7,4) , 
    SUBSTRING (convert(varchar,joining_date,100),1,3) , 
    SUBSTRING (convert(varchar,joining_date,100),5,2) 
from 
    EMPLOYEE

结果是:http://d.pr/i/vObI

但是当我将convert(varchar,joining_date,100)更改为convert(varchar,joining_date,101)

结果如下:http://d.pr/i/G5fZ

任何人都可以解释这个参数的含义吗?

2 个答案:

答案 0 :(得分:0)

您可以使用convert(varchar...通过几种不同的方式设置日期格式。这些内容已在MSDN sitedifferent sites online上详细记录。

使用convert(varchar..., date, 100)将日期格式化为:

mon dd yyyy hh:mmAM (or PM)
May 10 2013 12:55PM

使用convert(varchar...date, 101)将日期格式化为:

mm/dd/yyyy
05/10/2013

请参阅Demo

我的建议是,无论何时实施这些转换,请务必在varchar(10)等处提供长度。

根据您返回的内容,您可以删除正在使用的某些convert / substring语句,并实现其他一些函数以获得相同的结果:

select year(joining_date) as [year] , 
  convert(varchar(3),joining_date,100) as [month] , 
  day(joining_date) as [day]
from EMPLOYEE

答案 1 :(得分:0)

我认为使用DATEPART分割和获取日期时间部分有更好的方法:

  select DATEPART(YEAR, [joining_date]), 
  DATEPART(MONTH, [joining_date]), 
  DATEPART(DAY, [joining_date]) from EMPLOYEE

或者如果您对名称感兴趣,请使用DATENAME:

 select DATEPART(YEAR, [joining_date]), 
 DATENAME(MONTH, [joining_date]), 
 DATEPART(DAY, [joining_date]) from EMPLOYEE

但根据MSDN for DATENAME:“返回值取决于使用SET LANGUAGE设置的语言环境”。

关于你的初始问题 - 这些参数基本上是样式,或者我会称之为区域特定代码,如此处所述,你可以只针对数据库运行不同的查询,你会看到返回的字符串 - 你会明白为什么你获得意外的结果。有关更多信息,请参阅MSDN: CAST and CONVERT