簡體   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