MSSQL将字符串转换为yyyy-mm-dd hh:mm:ss

时间:2015-08-08 00:52:08

标签: sql-server datetime

我在SQL Server 2008中有一个数据库表,其中的列具有以下格式的日期字符串: m / dd / yyyy h:mm:ss(7/11/2015 1:01:45 PM)

我想转换为yyyy-mm-dd hh:mm:ss(2015-07-11 13:01:45)

我尝试过使用CAST和CONVERT,但似乎没有任何效果。任何帮助将不胜感激。

实施例: SELECT CONVERT(DATETIME, DATE_TIME, 120), DATE_TIME FROM TB1会导致以下错误:

Msg 241, Level 16, State 1, Line 1
Conversion failed when converting date and/or time from character string.

3 个答案:

答案 0 :(得分:3)

SELECT CONVERT(nvarchar(max), CONVERT(datetime, '7/11/2015 1:01:45PM', 101), 120)

Here是很多例子

答案 1 :(得分:1)

我之前遇到过这种情况并且很糟糕。很可能,你有一个无法转换为日期时间的值,你需要找到它(或者它们)。 尝试选择isdate(字符串列)= 0的位置,并查看是否显示任何行。修复它们或排除它们。

答案 2 :(得分:1)

我必须从M / D / YYYY h:mm:ss AM / PM转换为Datetime。请注意我的本地时间是DD-MM-YYYY所以我必须在转换为Datetime之前转换为该格式。要转换的字段名称是表NIF中的“Valeur”。以下是我在SQL 2008中的使用方法:

CREATE TABLE #NIF (Valeur VARCHAR(25))

INSERT INTO #NIF (Valeur) VALUES 
    ('8/20/2015 1:11:31 AM'),
    ('8/19/2015 10:37:32 PM'),
    ('10/7/2015 8:51:37 PM'),
    ('9/8/2015 3:27:17 PM')

SELECT NIF.Valeur, CASE WHEN CHARINDEX('PM',NIF.Valeur) = 0 
THEN CONVERT(datetime,substring(NIF.Valeur, P2.Pos + 1, P3.Pos - P2.Pos - 1) + '-'
+ RIGHT('0' + substring(NIF.Valeur, P3.Pos + 1, P4.Pos - P3.Pos - 3),8) + '-'
+ RIGHT('0' + substring(NIF.Valeur, P1.Pos + 1, P2.Pos - P1.Pos - 1),2) + ' ' 
+ RIGHT('0' + substring(NIF.Valeur, 1, P1.Pos-1),2))
--add 12 hours if PM
ELSE DATEADD(hour,12,CONVERT(datetime,substring(NIF.Valeur, P2.Pos + 1, P3.Pos - P2.Pos - 1) + '-'
+ RIGHT('0' + substring(NIF.Valeur, P3.Pos + 1, P4.Pos - P3.Pos - 3),8) + '-'
+ RIGHT('0' + substring(NIF.Valeur, P1.Pos + 1, P2.Pos - P1.Pos - 1),2) + ' ' 
+ RIGHT('0' + substring(NIF.Valeur, 1, P1.Pos-1),2)))
END

FROM #NIF AS NIF (nolock)    
cross apply (select (charindex('/', NIF.Valeur))) as P1(Pos)
cross apply (select (charindex('/', NIF.Valeur, P1.Pos+1))) as P2(Pos)
cross apply (select (charindex(' ', NIF.Valeur, P2.Pos+1))) as P3(Pos)
cross apply (select (charindex('M', NIF.Valeur, P3.Pos+1))) as P4(Pos)
WHERE CHARINDEX('M',NIF.Valeur) > 0 --(I had other values in the table with   proper format)

您只需更改元素的顺序即可设置特定的本地时间。

获得的结果

8/20/2015 1:11:31 AM ---> 2015-08-20 01:11:31.000

2015年8月19日10:37:32 PM ---> 2015-08-19 22:37:32.000

10/7/2015 8:51:37 PM ---> 2015-10-07 20:51:37.000

9/8/2015 3:27:17 PM ---> 2015-09-08 15:27:17.000