[英]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.