【问题标题】:How Can I write in my code to exclude accounts that have had a payment posted w/in last 45 days?如何在我的代码中编写以排除在过去 45 天内已发布付款的帐户?
【发布时间】:2021-06-08 15:53:24
【问题描述】:

我在 SQL Server Mgmt Studio 中工作,我正在尝试识别自过去 45 天以来未发布过付款的帐户。我尝试过声明 getdate 小于 45 天的最小和最大日期,但这没有用。我也尝试过说明“最后一次付款在哪里!> getdate() -45”....但这并没有给我想要的结果。我需要查询做的只是识别在过去 45 天内真正没有付款过的账户。但我不确定如何在 where 子句中说明这一点。这是我的查询

DECLARE @minDate datetime;
DECLARE @maxDate datetime;
SET @minDate = GETDATE();
SET @maxDate = GETDATE() - 45;

SELECT DISTINCT
       a.id,
       a.FacilityCode AS [Facility],
       a.accountUnit,
       a.accountNum AS [Account Number],
       a.amountBalance AS [Balance],
       a.accountstatus AS [Status],
       CONVERT(date, a.accountStatusDate) AS StatusDate,
       pmtEntryDate AS [Pmt Entry Date],
       v.LastLinkARpmtDate AS [Last Pmt Date],
       CONVERT(date, a.accountnextactdate) AS NextActionDate,
       CONVERT(date, a.rpcDate) AS RightpartyContactDate,
       a.flag AS accountFlag,
       pay.flag AS pmtFlag,
       a.accounttype
FROM dbo.tbAccount a
    JOIN dbo.tbpmtinfo pay ON a.id = pay.id
    JOIN dbo.vLastPmtDate v ON v.id = a.id
    FULL JOIN (SELECT id,
                      MAX(deDate) AS MFSLoadDate
               FROM dbo.tbDataEvents (NOLOCK)
               WHERE deNewVal = 'MFS'
               GROUP BY id) m ON m.id = a.id
WHERE pay.flag IN ('D')
  AND a.amountBalance > 0
  AND a.FacilityCode IN ('PHKY', 'QANM', 'QAOH', 'QBCA', 'QBIL', 'QBTX', 'QCIL', 'QDAL', 'QEWY', 'QFAR', 'QFGA',
                         'QGIL', 'QHAR', 'QHIL', 'QHTN', 'QLAL', 'QLPA', 'QMIL', 'QMNC', 'QMNM', 'QMNV', 'QMOR',
                         'QMTN', 'QMTX', 'QMUT', 'QRIL', 'QRKY', 'QSPA', 'QTGA', 'QTKY', 'QUIL', 'QVIL', 'QWIL', 'LHFL')
  AND a.amountBalance >= '1000'
  AND a.accountStatus IN ('PA', 'PP', 'BPA')
  AND a.flag = 'A'
  AND a.accountType IN ('Resid', 'Slfpy')
  --and LastLinkARpmtDate !> Getdate() -45 and accountNum = '40728597'
  AND LastLinkARpmtDate BETWEEN @minDate AND @maxDate;

【问题讨论】:

  • 我真的建议你养成正确格式化 SQL 的习惯;例如很好地使用换行符和空白。它使您的 SQL Far 更具可读性。
  • 停止使用nolock 溅射您的代码。但如果需要并且理解和接受其含义,至少使用当前语法而不是弃用的语法。
  • LastLinkARpmtDate BETWEEN @minDate AND @maxDate; 仔细看。您为 minDate 分配了什么值?
  • 并且您实际上希望包括最后付款日期早于 的帐户。这会让事情更清楚吗?当然,假设该特定列是您需要过滤的列。

标签: sql sql-server


【解决方案1】:

我会使用WHERE NOT EXISTS 子句来消除最近的活动:

SELECT DISTINCT a.id
    ,a.FacilityCode [Facility]
    ,a.accountUnit
    ,a.accountNum [Account Number]
    ,a.amountBalance [Balance]
    ,a.accountstatus [Status]
    ,convert(DATE, a.accountStatusDate) StatusDate
    ,pmtEntryDate [Pmt Entry Date]
    ,v.LastLinkARpmtDate [Last Pmt Date]
    ,convert(DATE, a.accountnextactdate) NextActionDate
    ,convert(DATE, a.rpcDate) RightpartyContactDate
    ,a.flag AS accountFlag
    ,pay.flag AS pmtFlag
    ,a.accounttype
FROM dbo.tbAccount AS a
JOIN dbo.tbpmtinfo AS pay ON a.id = pay.id
JOIN dbo.vLastPmtDate AS v ON v.id = a.id
FULL JOIN (
    SELECT id
        ,Max(deDate) AS MFSLoadDate
    FROM dbo.tbDataEvents(NOLOCK)
    WHERE deNewVal = 'MFS'
    GROUP BY id
    ) m ON m.id = a.id
WHERE pay.flag IN ('D')
    AND a.amountBalance > 0
    AND a.FacilityCode IN (
        'PHKY'
        ,'QANM'
        ,'QAOH'
        ,'QBCA'
        ,'QBIL'
        ,'QBTX'
        ,'QCIL'
        ,'QDAL'
        ,'QEWY'
        ,'QFAR'
        ,'QFGA'
        ,'QGIL'
        ,'QHAR'
        ,'QHIL'
        ,'QHTN'
        ,'QLAL'
        ,'QLPA'
        ,'QMIL'
        ,'QMNC'
        ,'QMNM'
        ,'QMNV'
        ,'QMOR'
        ,'QMTN'
        ,'QMTX'
        ,'QMUT'
        ,'QRIL'
        ,'QRKY'
        ,'QSPA'
        ,'QTGA'
        ,'QTKY'
        ,'QUIL'
        ,'QVIL'
        ,'QWIL'
        ,'LHFL'
        )
    AND a.amountBalance >= '1000'
    AND a.accountStatus IN (
        'PA'
        ,'PP'
        ,'BPA'
        )
    AND a.flag = 'A'
    AND a.accountType IN (
        'Resid'
        ,'Slfpy'
        )
    AND NOT EXISTS (
        SELECT NULL
        FROM vLastPmtDate
        WHERE v.id = a.id
            AND CAST(v.LastLinkARpmtDate AS DATE) > CAST(dateadd(day, - 45, getdate() AS DATE))
        )
    AND accountNum = '40728597'
    AND LastLinkARpmtDate BETWEEN @minDate
        AND @maxDate;

【讨论】:

  • AND CAST(v.LastLinkARpmtDate AS DATE) > CAST(dateadd(day, - 45, getdate() AS DATE)) ??如果没有CAST(出于性能原因),那不应该写吗?
  • 这取决于您的“日期”是否实际上是 DATETIME 以及您对脚本运行时间的关注程度。如果我使用 DATEADD 获取 45 天前,我将在 45 天前上午 9:33 获取。这意味着 9:30 之前发生的任何事情都将被忽略。如果这很重要,由您决定,但转换为 DATE 会获取当天的所有值。是的,性能会受到影响,因此取决于您的数据大小和性能需求。
【解决方案2】:

函数 dateadd() 就是你所需要的:

DATEADD(日期部分,数字,日期)

设置@maxDate = DATEADD(DAY, -45, GETDATE());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-17
    • 2017-08-12
    • 2015-07-16
    • 2020-03-07
    • 2022-01-05
    • 2023-04-10
    • 1970-01-01
    相关资源
    最近更新 更多