我是SQL Server 2016的新手(兼容版本130)。将一个varchar列转换为datetime2时出错。 简单试试
std::multimap<Key,Value>
作为解决方法,我甚至尝试过
select convert( datetime2, '18-04-14 04:17:48.000000000 PM', 131)
错误消息:从字符串转换日期和/或时间时转换失败。
答案 0 :(得分:3)
如果您不了解特定的文化[风格],您可以使用简单的技巧来检查它(for i=1:c
for j=1:c
if j!=i
for k=1:N_+
@constraint(m,2*y[i,j,k]- sum{x[h,i] for h=0:N_0 if h!=i}- sum{x[l,k] for l=1:c if l !=k} <=0)
end
end
end
end
):
TRY_CONVERT
<强> DBFiddle Demo 强>
然后使用正确的r:
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;
答案 1 :(得分:1)
看起来您使用的日期格式是“意大利语”,因此以下简单代码将为您提供答案。
选择转换(datetime2,'18 -04-14 04:17:48.000000000 PM',5)
答案 2 :(得分:0)
那是因为您提供的样式标签与日期不匹配。根据{{3}}的样式标记131
使用格式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