sql 日期时间转换错误

sql datetime cast error

我有一种像这样的日期时间格式'Mon Sep 26 18:30:24 UTC+0200 2016'。我需要将 table 作为日期时间插入...有人可以帮助我吗?

select convert(datetime,'Fri Jan 1 00:00:00 UTC+0100 1960') 

ERROR:Conversion failed when converting date and/or time from character string.

根据您的评论(我正在使用 SSMS),我认为这是 SQL 服务器。

您可以这样尝试:

DECLARE @tbl TABLE(StringDate VARCHAR(100));
INSERT INTO @tbl VALUES
('Fri Jan 1 00:00:00 UTC+0100 1960'),('Mon Nov 28 12:30:00 UTC+0100 2016');

SELECT StringDate
      ,ToXml
      ,HundredAndNine
      ,CONVERT(DATETIME,HundredAndNine,109) AS Converted
FROM @tbl AS tbl
CROSS APPLY(SELECT CAST('<x>' + REPLACE(StringDate,' ','</x><x>') + '</x>' AS XML)) AS Casted(ToXml)
CROSS APPLY(SELECT ToXml.value('/x[2]','varchar(3)') + ' ' --part 2: The month
                 + ToXml.value('/x[3]','varchar(2)') + ' ' --part 3: The day
                 + ToXml.value('/x[6]','varchar(4)') + ' ' --part 6: The year
                 + ToXml.value('/x[4]','varchar(8)') --part 4: The time
                 ) AS DateTimeFormat(HundredAndNine)

由于您的格式与任何支持的格式都不兼容 (find details here),我们不得不使用字符串方法对您的构造部分进行重新排序。

我的代码使用技巧在空格处拆分 字符串。每个空格都替换为 </x><x>。开头的 <x> 和结尾的 </x> 允许将每个部分作为 XML.

中的一个元素进行寻址
<x>Fri</x>
<x>Jan</x>
<x>1</x>
<x>00:00:00</x>
<x>UTC+0100</x>
<x>1960</x>

我阅读并重新连接各个部分以适应模式 109。其余的都是微不足道的...

更新:这个

的一个函数
CREATE FUNCTION dbo.CovertStrangeFormatToDateTime(@StringDate VARCHAR(100))
RETURNS DATETIME
AS
BEGIN
RETURN
(
    SELECT CONVERT(DATETIME,HundredAndNine,109) AS Converted
    FROM 
    (SELECT CAST('<x>' + REPLACE(@StringDate,' ','</x><x>') + '</x>' AS XML)) AS Casted(ToXml)
    CROSS APPLY(SELECT ToXml.value('/x[2]','varchar(3)') + ' ' --part 2: The month
                     + ToXml.value('/x[3]','varchar(2)') + ' ' --part 3: The day
                     + ToXml.value('/x[6]','varchar(4)') + ' ' --part 6: The year
                     + ToXml.value('/x[4]','varchar(8)') --part 4: The time
                     ) AS DateTimeFormat(HundredAndNine)
)
END
GO

你可以这样称呼它:

SELECT dbo.CovertStrangeFormatToDateTime('Fri Jan 1 00:00:00 UTC+0100 1960');

首先,请务必先阅读此内容:MSDN Books Online on CAST and CONVERT (Transact-SQL)

我认为最好使用日期格式“127”。

CONVERT(varchar(50), DateValueField, 127)

或者如果您认为其他日期格式更适合您,请将“127”更改为您的新格式代码。

希望对您有所帮助。