1

我是 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)

错误消息:从字符串转换日期和/或时间时转换失败。

4

3 回答 3

3

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

WITH cte AS (
  select r, '18-04-14 04:17:48.000000000 PM' AS input,
     try_convert( datetime2, '18-04-14 04:17:48.000000000 PM', r) AS result
  FROM (SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS r 
        FROM dbo.syscolumns s1,dbo.syscolumns s2) s
  WHERE r <= 255 
)
SELECT *
FROM cte
WHERE result IS NOT NULL
ORDER BY r ASC;

DBFiddle 演示

然后使用正确的 r:

SELECT TRY_CONVERT(DATETIME2, '18-04-14 04:17:48.000000000 PM', 3 ) --or 2
于 2018-04-06T15:09:45.703 回答
1

看起来您使用的日期格式是“Italian”,所以下面的简单代码将为您提供答案。

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

于 2018-04-06T15:20:21.830 回答
0

那是因为您提供的样式标签和日期不匹配。131根据 CAST 和 CONVERT (Transact-SQL)的样式标记使用格式dd/mm/yyyy hh:mi:ss:mmmAM. 你的约会看起来不像那样。

该页面上的样式标签都与您使用的样式不匹配,所以简单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
于 2018-04-06T15:10:25.143 回答