SQL string to date time
在SQL server中经常会转换string到datetime类型,最常用的函数就是Convert。那么对Convert这个函数,不得不详细的研究一下。Convert这个函数的功能很强大,格式又很简单CONVERT ( data_type [ ( length ) ] , expression [ , style ] )。单就将string到datetime类型的转换就有很多样式。如: Convert(datetime, expression), Convert(varchar(10), expression, 110)。 这里需要注意的是最后这个style的字段,这个字段的主要作用是限制时间格式的样式。具体列表如下:
SQL server的基本样式有
Standard Date Formats |
|||
Date Format |
Standard |
SQL Statement |
Sample Output |
Mon DD YYYY 1 |
Default |
SELECT CONVERT(VARCHAR(20), GETDATE(), 100) |
Jan 1 2005 1:29PM 1 |
MM/DD/YY |
USA |
SELECT CONVERT(VARCHAR(8), GETDATE(), 1) AS [MM/DD/YY] |
11/23/98 |
MM/DD/YYYY |
USA |
SELECT CONVERT(VARCHAR(10), GETDATE(), 101) AS
[MM/DD/YYYY] |
11/23/1998 |
YY.MM.DD |
ANSI |
SELECT CONVERT(VARCHAR(8), GETDATE(), 2) AS [YY.MM.DD] |
72.01.01 |
YYYY.MM.DD |
ANSI |
SELECT CONVERT(VARCHAR(10), GETDATE(), 102) AS
[YYYY.MM.DD] |
1972.01.01 |
DD/MM/YY |
British/French |
SELECT CONVERT(VARCHAR(8), GETDATE(), 3) AS [DD/MM/YY] |
19/02/72 |
DD/MM/YYYY |
British/French |
SELECT CONVERT(VARCHAR(10), GETDATE(), 103) AS [DD/MM/YYYY] |
19/02/1972 |
DD.MM.YY |
German |
SELECT CONVERT(VARCHAR(8), GETDATE(), 4) AS [DD.MM.YY] |
25.12.05 |
DD.MM.YYYY |
German |
SELECT CONVERT(VARCHAR(10), GETDATE(), 104) AS
[DD.MM.YYYY] |
25.12.2005 |
DD-MM-YY |
Italian |
SELECT CONVERT(VARCHAR(8), GETDATE(), 5) AS [DD-MM-YY] |
24-01-98 |
DD-MM-YYYY |
Italian |
SELECT CONVERT(VARCHAR(10), GETDATE(), 105) AS
[DD-MM-YYYY] |
24-01-1998 |
DD Mon YY 1 |
- |
SELECT CONVERT(VARCHAR(9), GETDATE(), 6) AS [DD MON YY] |
04 Jul 06 1 |
DD Mon YYYY 1 |
- |
SELECT CONVERT(VARCHAR(11), GETDATE(), 106) AS [DD MON
YYYY] |
04 Jul 2006 1 |
Mon DD, YY 1 |
- |
SELECT CONVERT(VARCHAR(10), GETDATE(), 7) AS [Mon DD,
YY] |
Jan 24, 98 1 |
Mon DD, YYYY 1 |
- |
SELECT CONVERT(VARCHAR(12), GETDATE(), 107) AS [Mon DD,
YYYY] |
Jan 24, 1998 1 |
HH:MM:SS |
- |
SELECT CONVERT(VARCHAR(8), GETDATE(), 108) |
03:24:53 |
Mon DD YYYY HH:MI:SS:MMMAM (or PM) 1 |
Default + |
SELECT CONVERT(VARCHAR(26), GETDATE(), 109) |
Apr 28 2006 12:32:29:253PM 1 |
MM-DD-YY |
USA |
SELECT CONVERT(VARCHAR(8), GETDATE(), 10) AS [MM-DD-YY] |
01-01-06 |
MM-DD-YYYY |
USA |
SELECT CONVERT(VARCHAR(10), GETDATE(), 110) AS
[MM-DD-YYYY] |
01-01-2006 |
YY/MM/DD |
- |
SELECT CONVERT(VARCHAR(8), GETDATE(), 11) AS [YY/MM/DD] |
98/11/23 |
YYYY/MM/DD |
- |
SELECT CONVERT(VARCHAR(10), GETDATE(), 111) AS
[YYYY/MM/DD] |
1998/11/23 |
YYMMDD |
ISO |
SELECT CONVERT(VARCHAR(6), GETDATE(), 12) AS [YYMMDD] |
980124 |
YYYYMMDD |
ISO |
SELECT CONVERT(VARCHAR(8), GETDATE(), 112) AS
[YYYYMMDD] |
19980124 |
DD Mon YYYY HH:MM:SS:MMM(24h) 1 |
Europe default + milliseconds |
SELECT CONVERT(VARCHAR(24), GETDATE(), 113) |
28 Apr 2006 00:34:55:190 1 |
HH:MI:SS:MMM(24H) |
- |
SELECT CONVERT(VARCHAR(12), GETDATE(), 114) AS
[HH:MI:SS:MMM(24H)] |
11:34:23:013 |
YYYY-MM-DD HH:MI:SS(24h) |
ODBC Canonical |
SELECT CONVERT(VARCHAR(19), GETDATE(), 120) |
1972-01-01 13:42:24 |
YYYY-MM-DD HH:MI:SS.MMM(24h) |
ODBC Canonical |
SELECT CONVERT(VARCHAR(23), GETDATE(), 121) |
1972-02-19 06:35:24.489 |
YYYY-MM-DDTHH:MM:SS:MMM |
ISO8601 |
SELECT CONVERT(VARCHAR(23), GETDATE(), 126) |
1998-11-23T11:25:43:250 |
DD Mon YYYY HH:MI:SS:MMMAM 1 |
Kuwaiti |
SELECT CONVERT(VARCHAR(26), GETDATE(), 130) |
28 Apr 2006 12:39:32:429AM 1 |
DD/MM/YYYY HH:MI:SS:MMMAM |
Kuwaiti |
SELECT CONVERT(VARCHAR(25), GETDATE(), 131) |
28/04/2006 12:39:32:429AM |
那么在什么情况下,我们需要字段呢?
大家也知道在SQL Server中,时间字符串的格式是各式各样的,就像上表所示那样。那SQL server怎么去识别这些样式的时间格式呢?在通常情况下(一般是USA或Default),SQL server会自己分析时间字符串的格式。如: Convert(varchar(10), ‘2009-01-01’), convert(varchar(10), ‘20090101’), convert(varchar(10), ‘2009/01/01’)。所以,你可以不用指定style这个字段。但是在Italian(没有试过German/ British/French)环境下, 你必须显示的指定这个字段来转换时间, 而且还必须是非-号分隔符的字符串。主要的原因在于像USA, Italian, ODBC都是使用-来分隔的,并且他们的相同位置上对于的时间类别又不尽相同。所以,时常会发生转换varchar到datetime类型,超出值范围的错误。所以需要特别注意。比较简单的方法就是用Replace函数把-号替换掉,如”2009-01-11” -> “20090111”,因为后者是ISO的格式,所以我们就可以比较容易的像其他style转换,即使在不同的语言环境中也没问题。但是唯一麻烦的就是你的字符格式必须很固定,不能一会儿年月日,一会儿日月年。最好的办法还是用convert(datetime, expression)方式直接转到datetime类型。但是这种方式是全格式的时间格式,也就是说你不能控制只想取天或是月,所以还需要在外面套上一层convert(type, convert(datetime, expression), style)。另外的建议是,当我们要生成时间字符串从远端机器传输的时候,最好使用ISO格式YYYYMMDD HH:mm:ss,这样便于服务器端的转换。