使用dateadd函数

时间:2017-09-14 11:10:52

标签: tsql

对于我在工作的业务,我想获得有关客户的信息。我对这些客户的基本信息如下:

  • Activation_Date存储在Loans表中,数据类型为datetime
  • ActivityDate存储在CustomerDailyLoanActivity_Information表格中(每日贷款表格给感兴趣的人,它是数据集市的一部分,并存储每个日客户一直处于活动状态我们公司已经为他们的贷款支付了多少钱,所以如果客户的Activation_Date为15-03-2017,那么它在ActivityDate表格中的CustomerDailyLoanActivity_Information位于15-03 -2017到目前为止,每个ActivityDate在另一列Sum_Paid_To_Date中都有记录ActivityDate之前支付了多少费用。{ ActivityDate的数据类型为date

我想知道的是以下内容,我想知道每个客户在Activation_Date之后的1个月,2个月,3个月等多少付款。所以查询看起来像下面这样(稍微伪代码,更重要的部分是WHERE子句)。

SELECT
cldai.Sum_Paid_To_Date,
cldai.ActivityDate,
cldai.Customer_Account_Number
FROM
CustomerLoanDailyActivity_Information cldai
INNER JOIN 
Loans l ON l.Customer_Account_Number = cldai.Customer_Account_Number
WHERE
  (cldai.ActivityDate = CAST(l.Activation_Date AS date)
   OR
   cldai.ActivityDate = DATEADD(month, 1, CAST(l.Activation_Date AS date)) 
   OR
   cldai.ActivityDate = DATEADD(month, 2, CAST(l.Activation_Date AS date))
   OR
   cldai.ActivityDate = DATEADD(month, 3, CAST(l.Activation_Date AS date)) 
   )
ORDER BY
l.Customer_Account_Number, cldai.ActivityDate ASC

所以问题是这个查询真的很慢(因为WHERE子句,因为cldai表很大(~6 GB))并且在检索任何数据之前退出。我听过的几个问题,以及可能的解决方案,但到目前为止还没有奏效。

  • CAST函数使查询非常慢,因为它与索引的ActivityDate列进行了比较。之前我使用过CONVERT,但这也很慢。我觉得我需要进行转换/转换,因为ActivityDate属于date类型且Activation_Date属于datetime类型,因此有可能datetimeActivation_Date的时间部分将导致与ActivityDate没有匹配(例如Activation_Date对于给定的客户是15-03-2017 09:00 :00因此它永远不会与ActivityDate 15-03-2017匹配,因为这可能会转换为datetime 15-03-2017 00:00:00,由于{{time永远不会相等1}}部分)。
  • 我必须使用“DateTime”评估,这已被建议作为解决方案,但我不知道如何正确应用它。
  • 我无法查看执行计划,因为DBA阻止我看到它。

有关如何使此查询执行速度更快的任何想法?任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

因此,通过使用LEFT JOIN而不是INNER JOIN并且不在服务器上但在客户端订购数据来获得大量加速。这将查询时间从大约1小时10分钟缩短到大约1分钟。这似乎令人难以置信,但事情就是这样。

此致

答案 1 :(得分:0)

如果您保证每天都有记录,您可以申请使用row_number()函数为每组客户贷款还款记录应用行号,然后检索行1,31,61和91?这样可以避免任何日期操作。

答案 2 :(得分:0)

如何将其分为两个步骤?第一步 - 为每个客户建立一个包含四个日期的表格。然后在第二步,将其与日期和客户帐号的主CustomerLoanDailyActivity_Information表相关联。第二步将有一个更简单的连接,只是在您构建的表中的ActivityDate和日期条目之间的一个=。