SQL将Datetime转换为varchar10并减去1天

Tal*_*ist 1 sql t-sql sql-server sql-server-2008-r2

我有下面的查询,我把它放在一起,它运行得很糟糕(因为我相信你可以看到).

我很确定它与我转换日期时间的方式有关,这样我就可以参考昨天的数据了.

dtInteractionLocalStartTime是一个日期时间字段,我希望它显示为mm/dd/yyyy而不是yyyy-mm-dd hh:mm:ss.sss

关于如何优化这个的任何想法?我已经度过了这两天,我无法弄明白.

这是我的查询:

SELECT TOP 100 PERCENT
       Date ,
       CONVERT(varchar, VDN) AS VDN ,
       COUNT(*) AS Calls ,
       Avaya
FROM ( SELECT DISTINCT TOP 100 PERCENT
              CONVERT(varchar,dtInteractionLocalStartTime,101) AS Date ,
              vcVectorNumber AS VDN ,
              iCompoundID ,
              'CM03' AS Avaya
       FROM NICEHUB3ADTM.nice_dw.dbo.vwNiceDBKitInteraction AS i
       WHERE CONVERT(varchar(10) , dtInteractionLocalStartTime,101) = CONVERT(varchar(10),GETDATE()-1,101)
         AND iMediaTypesId = 2
         AND tiCallDirectionTypeID = 1
         AND tiInteractionTypeID = 2
         AND iInteractionOpenReasonID & 16 = 0
         AND iInteractionOpenReasonID & 4 = 0
         AND iInteractionID NOT IN ( SELECT iInteractionID
                                     FROM NICEHUB3ADTM.nice_dw.dbo.vwException AS e
                                     WHERE i.iInteractionID = iInteractionID
                                       AND iExceptionTypeID IN (37, 12, 12310)
                                   )
     ) AS derivedtbl_1
GROUP BY Date ,
         CONVERT(varchar,VDN) ,
         Avaya
ORDER BY Date ,
         VDN
Run Code Online (Sandbox Code Playgroud)

Set*_*ran 5

如果您只想要日期而不是日期时间,只需使用:

CAST(yourDate AS DATE)
Run Code Online (Sandbox Code Playgroud)

任何格式化都应该在sql之外完成,因为sql几乎没有针对这类事情进行优化,并且当你的视图逻辑工作进入模型时,最终会破坏关注点.

至少,将子查询中的转换调用更改为上面的转换,并仅将一个转换添加到最外面的选择(在分组之后).如果你有能力在其他地方重构逻辑,我仍然会完全避免它.

  • +1.这个.100%.停止将日期转换为字符串,[特别是在不声明长度的情况下停止转换](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/bad-habits-to-kick-declaring-varchar-without- length.aspx). (4认同)
  • @Michael [哦,不要BETWEEN,请](http://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do-between-and-the-devil-have-in-common.aspx) .将列作为"DATE"进行转换仍然可以使用搜索(这是SQL Server 2008中一个鲜为人知的优化,可能依赖也可能不依赖).我不确定你是否可以避免在上面的查询中进行扫描(查看所有过滤器!)或者在这种情况下,该列上的索引本身就具有任何值. (3认同)
  • @MichaelFredrickson这里有关于演员到目前为止的技巧的更多信息:[演员到目前为止是个好消息,但这是一个好主意吗?](http://dba.stackexchange.com/questions/34047/cast-to-date-is-sargable - 丁是-IT-A-好主意) (2认同)