2011-11-09 130 views
-3

我有这个sp。我刚刚发现,M.MDS_FILE列包含一个文件名,如下所示: adlu201008261156_3.zip。提交日期被嵌入到文件名中。解析查询

我该如何挑选这个日期? 20100826这部分用于sp?这是在此使用的日期: 而不是GETDATE。

SET ANSI_NULLS ON 
      GO 
      SET QUOTED_IDENTIFIER ON 
      GO 

      ALTER PROC [dbo].[GET_SCHEDULE_SUBMITTED_DETAIL] 
      @FACILITYKEY varchar(1000), 
      @UNITSTR VARCHAR(100), 
      @FromDate datetime, 
      @ToDate datetime 
      AS 
      BEGIN 

      SELECT S.FACILITY_KEY, S.PAT_NUMBER, S.A3A_DATE_USER, M.REFERENCE_DATE , 
      RTRIM(P.LAST_NAME) + CASE WHEN RTRIM(P.FIRST_NAME) <> '' THEN ', ' 
      ELSE '' 
      END + RTRIM(P.FIRST_NAME) PATIENT_NAME 
      ,CASE WHEN P.NURSING_UNIT is not null THEN P.NURSING_UNIT ELSE '' END NURSING_UNIT 
      ,CASE WHEN P.UNIT_CODE is not null THEN P.UNIT_CODE ELSE '' END UNIT_CODE, 'SUBMITTED' AS ASSESSMENTS 
      FROM [OPTC].MDS_M_SCHEDULE S INNER JOIN OPTC.MD3_M_MAST M 
      ON S.PAT_NUMBER=M.PAT_NUMBER 
      LEFT JOIN OGEN.GEN_M_PATIENT_MAST P ON S.PAT_NUMBER = P.PAT_NUMBER 
      WHERE S.PAT_NUMBER=M.PAT_NUMBER AND M.REFERENCE_DATE < GETDATE() 
      AND S.A3A_DATE_USER BETWEEN @FromDate AND @ToDate 
      AND M.SIGN_DATE IS NOT NULL AND M.MDS_FILE IS NOT NULL AND S.FACILITY_KEY IN (SELECT Value FROM dbo.ListToTable(@FACILITYKEY,',')) 
      AND (@UNITSTR IS NULL 
      OR @UNITSTR = '' 
      OR CHARINDEX(P.UNIT_CODE, @UNITSTR)% 2 = 1) 

      END 
+0

'adlu201008261156_3.zip'与其他名称有什么不同?他们都是从'adlu'开始的吗?或者,也许他们在名称的开头都有相同的位置?或者从最后?请更细致一些,以便我们找到最合适的解决方案。 –

回答

0

您没有提及这是哪个数据库,但大多数都有一个函数用于在字符串上执行正则表达式匹配。例如,Oracle有REGEXP_SUBSTR。在列上运行,使用正确的正则表达式(类似于\d{12}),然后将结果解析为日期。

编辑:并考虑更改您的架构发布在先前的答案 - 如果可能,因为这不会超高效。

+0

sql server,环境也是多台机器,包括遗留系统,因此他们为什么要传递这样的zip文件名。 – Booksman

1

OMG。

我强烈建议你改变你的模式以包含你需要跟踪的日期。用从文件名中提取的日期内在填充它,但从现在开始插入新记录时使用日期字段。为什么?

  1. 您将有错误的文件名称,将软管你的逻辑。

  2. 您将一次又一次地提取相同的数据以进行查询 - 这将是非常流行的,并且一次又一次地执行它是没有意义的。

  3. 这就是数据库擅长的 - 不要让它很难得到你需要的数据。