2015-04-01 65 views
1

我有一個SQL查詢將日期時間轉換爲106格式,之後我將空白空間替換爲-,這需要花費太多時間將近4分鐘執行。舉例如下爲什麼REPLACE查詢在SQL Server 2008中花費很多時間

REPLACE(CONVERT(VARCHAR,GETDATE(),106),' ','-') DDate 

輸出19月 - 2015年

沒有取代我的查詢花費0秒

是否有任何其他方式來獲得自定義格式的日期如上所述? 我明白REPLACE會比較結果項目的集合。 但它不應該花4分鐘來取代100到200的數據。

有什麼想法?

查詢作爲

SELECT TOP(ISNULL(100,'10000')) 
     FD.Flight 'Select' 
     ,FD.Filename  
     ,ISNULL(FD.RefNo, 'FLT-' + CONVERT(VARCHAR, FD.FLID)) 'FlightID'      
     ,FD.Registration 
     ,ISNULL(FD.FlightNumber, '') FlightNumber 
     **,REPLACE(CONVERT(VARCHAR,FD.TKD,106),' ','-') TODate** 
     ,FD.TOGMT 
     **,REPLACE(CONVERT(VARCHAR,FD.LKD,106),' ','-') LDDate** 
     ,FD.LDGMT 
     ,FD.Origin 
     ,FD.Destination 
     ,FD.Pilot 
     ,FD.CoPilot    
     **,REPLACE(CONVERT(VARCHAR,FD.DumpDate,106),' ','-') DDate** 
     ,FD.UserName 
     ,FD.FlightCount  
     ,FD.AcVariation  
    FROM 
     dbo.vw_FlightDetails FD 
     LEFT JOIN [dbo].FlightRemark RM ON RM.FlightID = FD.FLID 
    WHERE 
     1=1 
    ORDER BY 
     FD.TKD DESC 
     ,FD.TOGMT DESC  

大膽區是我面臨的

+0

哪個版本的sql server?因爲Sql Server 2012及以上版本有'FORMAT'功能。 – 2015-04-01 07:04:38

+2

我懷疑這是由replace()調用引起的。您必須向我們展示* complete *查詢 - 理想情況下,包括所有涉及到create table語句的表的定義以及執行計劃是否帶有replace()調用。 – 2015-04-01 07:06:29

+0

我不認爲這是由替換 – 2015-04-01 07:10:17

回答

0

這很難說,這裏發生了什麼問題,但你可以試試這個:

select <all your _other_ columns>, 
     ISNULL(x.RefNo, 'FLT-' + CONVERT(VARCHAR, x.FLID)) FlightID, 
     REPLACE(CONVERT(VARCHAR, x.TKD, 106),' ','-') TODate, 
     REPLACE(CONVERT(VARCHAR, x.LKD, 106),' ','-') LDDate, 
     REPLACE(CONVERT(VARCHAR, x.DumpDate, 106),' ','-') DDate, 
    from (
     SELECT TOP (ISNULL(100,'10000')) 
      FD.Flight 'Select' 
      ,FD.Filename  
      ,FD.RefNo, 
      ,FD.FLID 
      ,FD.Registration 
      ,ISNULL(FD.FlightNumber, '') FlightNumber 
      ,FD.TKD     
      ,FD.TOGMT 
      ,FD.LKD 
      ,FD.LDGMT 
      ,FD.Origin 
      ,FD.Destination 
      ,FD.Pilot 
      ,FD.CoPilot    
      ,FD.DumpDate 
      ,FD.UserName 
      ,FD.FlightCount  
      ,FD.AcVariation  
     FROM 
      dbo.vw_FlightDetails FD 
      LEFT JOIN [dbo].FlightRemark RM ON RM.FlightID = FD.FLID 
     WHERE 
      1=1 
     ORDER BY 
      FD.TKD DESC 
      ,FD.TOGMT DESC  
    ) x 

基本上,埋葬查詢到子查詢中,然後僅在結果行上格式化日期。我懷疑這是由於top()語句發生的...它可能使用REPLACE處理更多的行而不是它需要的。

+0

嘿克里斯,謝謝你的回覆,我已經試過了你已經給出的代碼,但是它同樣在4秒的時間內與REPLACE再次相同,並且持續了0秒。 – Jpaul 2015-04-02 05:56:15