如何将此字段分成两列

时间:2010-08-03 15:45:35

标签: sql sql-server

我有一个简单易解决的问题,通常很容易解决。我有一个包含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

这很容易做到吗?

欢呼声 吉姆

4 个答案:

答案 0 :(得分: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 :(得分:1)

它可行,但它会很难看。

您可以使用字符串函数在 amendnote 字段中查找第三个冒号,第三个冒号右侧的任何内容都将是 note

至于日期,你应该再次能够使用字符串函数来重新格式化日期部分,尽管你很可能需要很多子字符串来使它工作。

我唯一担心的是输入的日期格式是一个条目的MM / DD / YYYY,另一个是DD / MM / YYYY。

答案 2 :(得分: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 - 不要存储“演示”数据。

错误的数据是糟糕的数据 - 这是一个你必须导航的雷区,隔离与查询和模式中的模式不匹配的行。妥善处理。

答案 3 :(得分:0)

进入DateTime列后,它们将采用标准的DateTime格式。一旦被查询,他们如何呈现在你身上。

因此,一旦您将数据拆分为DateOfNoteNote列,就可以将DateOfNote转换为VarChar并应用格式来获​​取所需内容。
Convert(NVARCHAR, DateOfNate, 103)会让你到那里(我想:最后仔细检查那里的格式样式)。

修改根据您的问题,您似乎希望获得有关格式的更多帮助。但是,在拆分列时,您需要使用字符串函数。我找到最后一个冒号的索引,将其存储在局部变量中,然后使用substring查找日期时间(最后一个冒号的左侧)和注释(最后一个冒号的右侧)。