繁体   English   中英

SQL Server 2012将日期时间数据从varchar转换为Date部分

[英]SQL Server 2012 convert datetime data from varchar to Date portion

在此站点以及其他站点上都进行了很多研究,但是仍然没有有效的解决方案。 我有一列varchar数据类型,它包含DateTime数据。 我只需要在Date类型列中存储Date部分。 尝试了Cast,Convert和其他功能的不同方式,但仍无法使其正常工作。

基本上我想转换这个

Tue Apr 26 2016 13:54:53 GMT+0200 (CEST)

04/26/2016

假设您的“日期和月份”部分始终为3个字符长,则可以这样简单地完成操作:

DECLARE @d VARCHAR(100)='Tue Apr 26 2016 13:54:53 GMT+0200 (CEST)';
SELECT CONVERT(DATE,SUBSTRING(@d,4,12),109);

如果这很容易的话,则必须使用CHARINDEX查找空白,但我不这么认为...

格式代码109表示此处的 mon dd yyyy hh:mi:ss:mmmAM (or PM) 详细信息

并且请注意,包含语言相关部分的格式是由魔鬼直接发送的,以产生永无止境的痛苦……这在具有不同语言设置的服务器上将不起作用!

Declare @String varchar(max) = 'Tue Apr 26 2016 13:54:53 GMT+0200 (CEST)'
Select cast(Substring(@String,12,4)+Substring(@String,4,7) as date)

退货

2016-04-26

好的,这里您有一个看起来像是伪ISO 8601但不是标准的字段。 第一个问题是:“这是从哪里来的?” 通常,您在标准中没有'Tue'或'GMT'或'(CEST)',并且与格林威治标准时间的偏移量的格式为(+/-)##:## NOT(+/-)# ###。 SQL和许多其他格式可以轻松接受ISO 8601格式的标准化字符串。 此处的简短摘要: https : //www.w3.org/TR/NOTE-datetime

话虽这么说,您只要一点点知道就可以轻松获得想要的东西:

DECLARE 
    @S VARCHAR(128) = 'Tue Apr 26 2016 13:54:53 GMT+0200 (CEST)'
,   @Valid VARCHAR(128)

--Legitimate ISO 8601 string:
SELECT @Valid = RTRIM(LTRIM(REPLACE(STUFF(STUFF(@S, 1, 4, ''), LEN(@S)-12, 12, ':00'), 'GMT', '')))
SELECT @Valid

--Legitimate DateTimeOffset
SELECT CAST(@Valid AS DATETIMEOFFSET)

--Now that I have a legimiate DateTimeOffset I can downconvert easily
SELECT CAST(CAST(@Valid AS DATETIMEOFFSET) AS DATE)

--AND... Now that I have a legimate Date I can format it many different ways
SELECT CONVERT(VARCHAR, CAST(CAST(@Valid AS DATETIMEOFFSET) AS DATE), 101)

这里真正要实现的是使用convert函数对DateTime进行神奇的转换。 但是您可能想知道“如果我希望它看起来与众不同?”。 试试这个页面:

http://www.sql-server-helper.com/tips/date-formats.aspx

尽管我可以解析您的示例,但是只要发现事物似乎是来自字符串的位置,那我就不会大惊小怪。 如果您发现事情没有遵循标准,您应该知道原因。 主要原因是您可能可以使它适用于特定实例,但不能一遍又一遍地重复此模式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM