2015-04-01 61 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