我有一个简单易解决的问题,通常很容易解决。我有一个包含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 :(得分: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格式。一旦被查询,他们如何呈现在你身上。
因此,一旦您将数据拆分为DateOfNote
和Note
列,就可以将DateOfNote
转换为VarChar并应用格式来获取所需内容。
Convert(NVARCHAR, DateOfNate, 103)
会让你到那里(我想:最后仔细检查那里的格式样式)。
修改根据您的问题,您似乎希望获得有关格式的更多帮助。但是,在拆分列时,您需要使用字符串函数。我找到最后一个冒号的索引,将其存储在局部变量中,然后使用substring
查找日期时间(最后一个冒号的左侧)和注释(最后一个冒号的右侧)。