SQL从长文本字段中提取多个日期

时间:2018-02-05 19:04:13

标签: sql sql-server tsql

我试图找出一种从文本列中提取多个日期条目的方法,以便稍后我可以过滤它们。

请查看附件图片。

在整个文本栏中可能会有数百个这些迷你笔记输入,我将不得不弄清楚如何识别每个日期并将其设置为新列。因此,如果一个文本字段有100个日期,则需要100个动态创建的列来过滤。如果下一行文本字段只有2个日期,则需要它为该行动态创建2列。

这样的事情可能吗?

不幸的是,我们正在使用的软件是如何设置的,并且这些迷你笔记日期不会保存为数据库中任何其他位置的日期时间,这将使这10倍更容易....

我做了一些与此查询非常相似的事情......

SELECT TOP (500) 'Referral', COUNT(cn.Note_ID),cn.Note_DateOccurred,vp.Person_Name,ltrim(replace(replace(replace(replace(substring(replace(replace(replace(cast(Note_SummaryRTF as nvarchar(MAX)), '{\rtf1\ansi\ansicpg1252\deff0\deftab720{\fonttbl{\f0\fcharset1 MS Sans Serif;}}{\colortbl\red0\green0\blue0;}\plain\f0\fs24\cf0 \plain\f0\fs24\cf0\b ', ''),
        '\plain\f0\fs20\cf0', ''),
           '\par', '\n'), CHARINDEX('Completed by:', replace(replace(replace(cast(Note_SummaryRTF as nvarchar(MAX)), '{\rtf1\ansi\ansicpg1252\deff0\deftab720{\fonttbl{\f0\fcharset1 MS Sans Serif;}}{\colortbl\red0\green0\blue0;}\plain\f0\fs24\cf0 \plain\f0\fs24\cf0\b ', ''),
        '\plain\f0\fs20\cf0', ''),
           '\par', '\n')),50),'\n',''),'}', ''), 'Completed By:', ''), '\''a0', '')) a
FROM CHRT_Note cn
JOIN CHRT_OtherNote con on cn.Note_ID = con.Note_ID
JOIN View_Patient vp on con.Patient_ID = vp.Patient_ID
WHERE cn.Note_DateOccurred > '1/31/2018'
and Note_RTF like '%Referral Completed By:%' 
GROUP BY cast(Note_SummaryRTF as 
nvarchar(MAX)),cn.Note_DateOccurred,vp.Person_Name

2 个答案:

答案 0 :(得分:1)

您可以使用CHARINDEX和SUBSTRING来获取字符串的日期部分,然后将其解析为日期。

答案 1 :(得分:0)

  

因此,如果一个文本字段有100个日期,则需要100个动态创建   要过滤的列。如果下一行文本字段只有2   日期,生病需要它为该行动态创建2列。

     

这样的事情可能吗?

不像你描述的那样。表格中的行不能包含不同数量的列,但您可以确定您需要的最大列数并使用它。

如果您正在进行大量的文本操作,您可能会从应用程序代码中处理数据中受益 - 文本提取,格式化,解析等在应用程序中利用文本框架比在关系数据库中更简单。

如果您无法将数据从数据库中取出,这似乎是利用SQL Server备受诟病的.NET集成功能的绝佳机会。 SQL CLR(我自己也诽谤过)。它是一种形状独特的锤子,人们用来敲击各种钉子,但这种特殊情况(操纵数据库中的文本)可能非常适合。