2011-11-09 133 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. 這就是數據庫擅長的 - 不要讓它很難得到你需要的數據。