Sql server SQL Server 2016(130)无法转换日期时间';18-04-1404:17:48.000000000下午';

Sql server SQL Server 2016(130)无法转换日期时间';18-04-1404:17:48.000000000下午';,sql-server,tsql,sql-server-2016-express,Sql Server,Tsql,Sql Server 2016 Express,我是SQL Server 2016(兼容版本130)的新手。将一个varchar列转换为datetime2时出错。 简单的尝试 select convert( datetime2, '18-04-14 04:17:48.000000000 PM', 131) 作为一个解决办法我甚至尝试过 select convert(datetime2, SUBSTRING('18-04-14 04:17:48.000000000 PM',1,21) + SUBSTRING('18-04-14 0

我是SQL Server 2016(兼容版本130)的新手。将一个varchar列转换为datetime2时出错。 简单的尝试

select convert( datetime2, '18-04-14 04:17:48.000000000 PM', 131)
作为一个解决办法我甚至尝试过

select convert(datetime2, SUBSTRING('18-04-14 04:17:48.000000000 PM',1,21)
      + SUBSTRING('18-04-14 04:17:48.000000000 PM',29,2) , 131)
错误消息:从字符串转换日期和/或时间时,转换失败


如果您不知道特定的文化[风格],可以使用简单的技巧来检查它(
尝试转换
):


如果您不知道特定的文化[风格],可以使用简单的技巧来检查它(
尝试转换
):


这是因为您提供的样式标记和日期不匹配。样式标记
131
根据使用格式
dd/mm/yyyyy hh:mi:ss:mmmAM
。你的约会对象一点也不像

该页面上的所有样式标记都与您使用的样式不匹配,因此simple
CONVERT
不起作用

假设您无法更改数据的布局,这是一种方法,但很麻烦:

SELECT CONVERT(datetime2,REPLACE(CONVERT(varchar(10),CONVERT(datetime2,REPLACE(LEFT('18-04-14 04:17:48.000000000 PM',8),'-','/'),11),102),'.','-') + 'T' +
                         CONVERT(varchar(21),CONVERT(time,RIGHT('18-04-14 04:17:48.000000000 PM',21))))
编辑:和一些额外的示例,并对表使用:

CREATE TABLE #Sample (OddDate varchar(50));
INSERT INTO #Sample
VALUES ('18-04-14 04:17:48.000000000 PM'),
       ('18-03-31 12:58:45.000000000 AM'),
       ('18-02-24 12:58:45.000000000 PM'),
       ('17-01-04 07:59:59.000000000 AM');

SELECT CONVERT(datetime2,REPLACE(CONVERT(varchar(10),CONVERT(datetime2,REPLACE(LEFT(S.OddDate,8),'-','/'),11),102),'.','-') + 'T' +
                         CONVERT(varchar(21),CONVERT(time,RIGHT(S.OddDate,21))))
FROM #Sample S;
GO

DROP TABLE #Sample;
返回:

---------------------------
2018-04-14 16:17:48.0000000
2018-03-31 00:58:45.0000000
2018-02-24 12:58:45.0000000
2017-01-04 07:59:59.0000000

这是因为您提供的样式标记和日期不匹配。样式标记
131
根据使用格式
dd/mm/yyyyy hh:mi:ss:mmmAM
。你的约会对象一点也不像

该页面上的所有样式标记都与您使用的样式不匹配,因此simple
CONVERT
不起作用

假设您无法更改数据的布局,这是一种方法,但很麻烦:

SELECT CONVERT(datetime2,REPLACE(CONVERT(varchar(10),CONVERT(datetime2,REPLACE(LEFT('18-04-14 04:17:48.000000000 PM',8),'-','/'),11),102),'.','-') + 'T' +
                         CONVERT(varchar(21),CONVERT(time,RIGHT('18-04-14 04:17:48.000000000 PM',21))))
编辑:和一些额外的示例,并对表使用:

CREATE TABLE #Sample (OddDate varchar(50));
INSERT INTO #Sample
VALUES ('18-04-14 04:17:48.000000000 PM'),
       ('18-03-31 12:58:45.000000000 AM'),
       ('18-02-24 12:58:45.000000000 PM'),
       ('17-01-04 07:59:59.000000000 AM');

SELECT CONVERT(datetime2,REPLACE(CONVERT(varchar(10),CONVERT(datetime2,REPLACE(LEFT(S.OddDate,8),'-','/'),11),102),'.','-') + 'T' +
                         CONVERT(varchar(21),CONVERT(time,RIGHT(S.OddDate,21))))
FROM #Sample S;
GO

DROP TABLE #Sample;
返回:

---------------------------
2018-04-14 16:17:48.0000000
2018-03-31 00:58:45.0000000
2018-02-24 12:58:45.0000000
2017-01-04 07:59:59.0000000

看起来您使用的日期格式是“意大利语”,因此下面的简单代码将为您提供答案


选择convert(日期时间2,'18-04-14 04:17:48.000000000 PM',5)

您使用的日期格式似乎是“意大利语”,因此下面的简单代码将为您提供答案


选择转换(datetime2,'18-04-14 04:17:48.000000000 PM',5)

您有一个两位数的年份。。。将其设为4位数,并将131放在末尾<代码>选择转换(datetime2,'2018-04-14 04:17:48.000000000 PM')或使用正确的格式,如
选择转换(datetime2,'18-04-14 04:17:48.000000000 PM',11)
如果可以,找到使用该格式的人并揍他们。两个世纪,一个12小时的时钟和一个荒谬的分数秒数字?那是。。。解析并不有趣。总有时间皈依ISO8601教会。你有一个2位数的年份。。。将其设为4位数,并将131放在末尾<代码>选择转换(datetime2,'2018-04-14 04:17:48.000000000 PM')或使用正确的格式,如
选择转换(datetime2,'18-04-14 04:17:48.000000000 PM',11)
如果可以,找到使用该格式的人并揍他们。两个世纪,一个12小时的时钟和一个荒谬的分数秒数字?那是。。。解析并不有趣。总有时间皈依ISO 8601的教堂吧,当我看到这个+1有趣时,3不得不删除我的。考虑到文件上说
3
dd/mm/yy
,我本以为时间会被取消,或者根本不起作用,当我看到这个+1有趣时,3不得不删除我的。考虑到文件中说
3
dd/mm/yy
,我本以为这段时间会被取消,或者根本不起作用。