我尝试将数据从现有表导入SQL表但是我不断收到以下错误:
Msg 241, Level 16, State 1, Line 6
Conversion failed when converting date and/or time from character string.
我已经查看了此处的其他主题并发现将列数据类型转换为' datetime2'只要源日期采用以下格式,就应该解决问题:
01-01-2018 00:00:00 PM ### mm-dd-yyyy hh:mm:ss AM/PM
我的数据采用这种格式,并在源表中存储为nchar(255):
01/01/2018 00:00:00 PM ### mm/dd/yyyy hh:mm:ss AM/PM
以下是我用来复制到表格内容的SQL查询:
USE [MyDatabase];
GO
set dateformat dmy
INSERT INTO dbo.[Output-Table]
SELECT [FullName]
,CAST(REPLACE([LastWriteTime], '/', '-') as datetime2)
,CAST(REPLACE([CreationTime], '/', '-') as datetime2)
,CAST(REPLACE([LastAccessTime], '/', '-') as datetime2)
,[Lenght]
,[Extention]
,[ID]
,[CSVName]
,CAST(REPLACE([Date], '/', '-') as datetime2)
,[ServerName]
,[RunName]
FROM dbo.[Input-Table];
GO
我的SQL专业水平并不是最好的,所以任何帮助都会受到高度赞赏。
作为下一步,我将使用PowerShell将其传递给SQL,但这不适用于此帖。
谢谢, Ĵ
答案 0 :(得分:0)
似乎使用下面的语句导致了一个问题,因为我的日期格式是mdy,与dmy一致:
set dateformat dmy
应该是:
set dateformat mdy
一旦我做了这个改动,我的查询就有效了。这是最后的查询。
USE [MyDatabase];
GO
set dateformat mdy
INSERT INTO dbo.[Output-Table]
SELECT [FullName]
,CAST(REPLACE([LastWriteTime], '/', '-') as datetime)
,CAST(REPLACE([CreationTime], '/', '-') as datetime)
,CAST(REPLACE([LastAccessTime], '/', '-') as datetime)
,[Lenght]
,[Extention]
,[ID]
,[CSVName]
,[Date]
,[ServerName]
,[RunName]
FROM dbo.[Input-Table];
GO
此外,您会看到[Date]列也已更改,这是由于列中的数据格式不正确。
答案 1 :(得分:0)
使用以下内容(指定日期转换格式)。
DECLARE @dateText NCHAR(255) = '25-12-2018 05:00:00 PM'
SELECT CONVERT(DATETIME, @dateText, 105) -- 105: dd-mm-yyyy
--Result: 2018-12-25 17:00:00.000
SET @dateText = '12-25-2018 05:00:00 PM'
SELECT CONVERT(DATETIME, @dateText, 110) -- 110: mm-dd-yyyy
--Result: 2018-12-25 17:00:00.000
同时转换时间00:00:00 PM
将失败,因此在这种情况下应将12和PM的小时数替换为AM。
DECLARE @dateText NCHAR(255) = '25-12-2018 00:00:00 PM'
SELECT
@dateText,
UpdatedText = REPLACE(@dateText, '00:00:00 PM', '12:00:00 AM'),
UpdatedDateTime = CONVERT(DATETIME, REPLACE(@dateText, '00:00:00 PM', '12:00:00 AM'), 105)
/*
Results:
25-12-2018 00:00:00 PM
25-12-2018 12:00:00 AM
2018-12-25 00:00:00.000
*/