2017-09-25 118 views
0

我正在使用Microsoft SQL Server 2016(SP1-CU3)(KB4019916)。我有一个数据类型为datetimedate的列表。SQL:转换失败错误

我想插入使用此查询的datetime价值,但我不断收到从字符串转换日期和/或时间时错误

转换失败。

我的代码:

INSERT INTO [mytable] ([Date1], [Date2], [Date3]) 
VALUES (CONVERT(DATETIME, '2017-09-22 20:31:48.000', 126), 
     CONVERT(DATE, '2017-09-22', 126), 
     CONVERT(DATETIME, '2017-09-23 04:07:46.000') 

我曾经尝试都投以及转换并仍然得到同样的错误。

INSERT INTO [mytable]([Date1], [Date2], [Date3]) 
VALUES 
    (CAST('2017-09-22 20:31:48.000' AS DATETIME), 
     CAST('2017-09-22' AS DATE), 
     CAST('2017-09-23 04:07:46.000' AS DATETIME)) 

有人可以帮助我吗?

+0

日期时间值的格式在你的varchar字符串中可能是你错误的原因。选择一种语言中性格式,以便任何sql服务器都能理解它。看到这里http://www.karaszi.com/SQLServer/info_datetime.asp#DtFormatsInput – GuidoG

回答

0

什么是你的表格模式?我正在假设沿着这些线?

CREATE TABLE dbo.myTable 
(
    Date1 DATETIME 
    ,Date2 DATE 
    ,Date3 DATETIME 
) 

你的第一个例子(使用CONVERT)与DateTime是否失败,因为你使用的风格是126预计没有空格的日期时间(例如2017-09-22T20:31:48.000)。在上面的模式中你的第二次插入(使用CAST)成功。

INSERT INTO dbo.myTable 
(
    Date1,Date2,Date3 
) 
VALUES 
(CAST('2017-09-22 20:31:48.000' AS datetime),CAST('2017-09-22' AS datetime),CAST('2017-09-23 04:07:46.000' AS datetime)) 

若要更正您的第一个示例(使用CONVERT),您可以取出126样式,它会顺利运行。

CONVERT(DATETIME, '2017-09-22 20:31:48.000') 
0

为此使用中性语言格式,所以您确定它可以在任何sql服务器上工作。 看到这里获取更多信息http://www.karaszi.com/SQLServer/info_datetime.asp#DtFormatsInput

中性语言格式的例子是这样的

select CONVERT(datetime, '20170922 20:31:48') 

这将工作的任何SQL Server数据库,不管其语言设置。

此外,您的意图不需要转换。
你可以写这样的:

INSERT INTO [mytable] 
    ([Date1], [Date2], [Date3]) 
Values 
    ('20170922 20:31:48', '20170922', '20170923 04:07:46') 

这并假定日期1,日期2和DATE3是DateTime类型或DATETIME2的(日期2也可以是类型日期)