将数据导入具有不同数据类型的新表(SQL)

时间:2018-03-19 09:52:02

标签: sql-server function tsql

我尝试将数据从现有表导入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,但这不适用于此帖。

谢谢, Ĵ

2 个答案:

答案 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
*/