2010-08-03 83 views
0

我有一個棘手的簡單問題來解決這個問題,通常相當容易。我有一個包含DateTime部分的字段,還有一個尾部文本部分。我現在需要將這個字段分成兩個離散的字段 - DateTime和Varchar。現在爲了小小的困擾。該數據已保存這導致在申請兩個不同的日期格式尋找一個「很多」這樣的:如何將此字段分成兩列

amendmentnote 
---------------------------------------------------------------------- 
30/07/2010 11:39:55: Booking status change from On Option to Cancelled 
5/5/2010 10:1:8 : New 

,你可以看到,日期是在兩個完全不同的格式。我想以某種方式看到它解析爲:

dateofnote   | note 
---------------------------------------------------------------------- 
30/07/2010 11:39:55 | Booking status change from On Option to Cancelled 
05/05/2010 10:01:08 | New 

這是否容易嗎?

歡呼 吉姆

+0

文本是否包含「:」?這些日期是否表示上午/下午或是否始終處於24小時格式? – Thomas 2010-08-03 15:55:10

+0

托馬斯 - 日期總是24小時。幸運的是,文本中不會包含':'字符,所以我們可以放心地放大最後發生的事情,如果這正是您想要的。 – 2010-08-03 16:00:30

回答

3

很容易?不可以。是的,如果我們可以做出一些假設。如果是文本決不會包含一個冒號的情況下,你可以這樣做:

Declare @Data Table (Data Varchar(max)) 
Insert @Data(Data) Values('30/07/2010 11:39:55: Booking status change from On Option to Cancelled') 
Insert @Data(Data) Values('5/5/2010 10:1:8 : New') 

Set DateFormat DMY 

Select Cast(Reverse(Substring(Reverse(Data), CharIndex(':', Reverse(Data)) + 1, Len(Data))) As DateTime) 
    , LTrim(Reverse(Substring(Reverse(Data), 1, CharIndex(':', Reverse(Data)) - 1))) 
From @Data 
1

這是做,能幹,但它會是醜陋的。

您可以使用字符串函數來查找amendmentnote場第三結腸,和任何第三冒號右邊將是你

至於日期,你應該再次能夠使用字符串函數來重新格式化日期部分,儘管你很可能需要大量的子串來使它工作。

我唯一擔心的是如果輸入的日期格式是一個條目的MM/DD/YYYY和另一個條目的DD/MM/YYYY。

+0

是的,LBT,我認爲它會非常難看,但它會成爲一次'升級',所以只會運行一次(着名的遺言)。如您所說,第二個日期的日期格式始終爲MM/DD格式。 '節約的恩典'可能是那些條目總是在第三個冒號後有一個空格(哦,它變得更糟!!),所以可能是一種合乎邏輯的方式來辨別那些......(現在變綠了!!) – 2010-08-03 15:58:12

+0

LBT - this當然適用於筆記部分。只是噹噹瘋狂混合起來的日期在它的幾個僞裝來抗衡... – 2010-08-03 16:04:30

0

一旦進入DateTime列,它們將採用標準的DateTime格式。一旦在這一點上被查詢,它們的呈現方式取決於你。

因此,一旦將數據拆分爲DateOfNoteNote列,您可以將DateOfNote轉換爲VarChar並應用一種格式來獲取所需內容。
Convert(NVARCHAR, DateOfNate, 103)會讓你在那裏(我認爲:仔細檢查最後的格式風格)。

編輯基於你的問題,它看起來像你想要格式化的更多幫助。但是,在分割列時,您需要使用字符串函數。我會找到最後一個冒號的索引,將其存儲在本地變量中,然後使用substring來查找datetime(最後一個冒號的左邊)和note(最後一個冒號的右邊)。

+0

感謝您的見解艾倫... – 2010-08-03 16:10:06

1

基於商提供的內容,用途:

SELECT CONVERT(DATETIME, 
       SUBSTRING(t.amendmentnote, 1, LEN(SUBSTRING(t.amendmentnote, 1, PATINDEX('%: %', t.amendmentnote)))-1), 
       103), 
     LTRIM(SUBSTRING(t.amendmentnote, 
         LEN(SUBSTRING(t.amendmentnote, 1, PATINDEX('%: %', t.amendmentnote)))+1, 
         LEN(t.amendmentnote))) 
    FROM YOUR_TABLE t 

作爲一個DATETIME,您可以使用CAST/CONVERT to format it as you like - 不存儲「演示文稿」數據。

錯誤的數據是錯誤的數據 - 這是您必須導航的礦區,隔離與查詢&處理的模式不匹配的行。

+0

omg - 感謝。我喜歡這個方法,所以選擇了另一個作爲答案,+1 tho – 2010-08-03 16:08:44