首页 文章

无法获得正确的日期T-SQL存储过程

提问于
浏览
0

下面的存储过程假设获得 OrderCompletionDate 年作为去年AND并且将当月添加一个月 .

因此,如果我在2018年1月运行它,它将返回2017年2月的数据,并且在2018年2月,它将从2017年3月返回数据,依此类推 .

My error:

当我们到达12月时,它会查找不存在的第13个月 . 在这种情况下,我希望它能获得当年的1月份数据 . 因此,当我们到2018年12月,它应该返回2018年1月的数据 .

My question is:

如何更改此存储过程,使其仍返回上一年和第一月的数据 . 但是当我们到12月份时,它会返回当年1月份的数据吗?

CREATE PROCEDURE [dbo].[usp_GetAnniversaryCustomers]
    @date DATE
AS
    SET NOCOUNT ON

    SELECT
        CustomerID,
        BAN_ADSL_TN,
        REPLACE(LandlinePhoneNumber, ',', '') LandlinePhoneNumber,
        REPLACE(MobilePhoneNumber, ',', '') MobilePhoneNumber,
        FirstName,
        LastName,
        REPLACE(ServiceAddress, ',', '') ServiceAddress,
        ServiceAddressAptNo,
        REPLACE(ServiceAddressCity, ',', '') ServiceAddressCity,
        ServiceAddressState,
        ServiceAddressZip,
        OrderCompletionDate = CONVERT(VARCHAR(10), OrderCompletionDate, 101)
    FROM 
        dbo.Customers 
    WHERE 
        StatusID = 115 AND 
        YEAR(OrderCompletionDate) = YEAR(@date) - 1 AND 
        MONTH(OrderCompletionDate) = MONTH(@date) + 1
    ORDER BY 
        OrderCompletionDate DESC

2 回答

  • 3
    WHERE
            StatusID = 115
        AND OrderCompletionDate >= DATEADD(month, -11, @date)
        AND OrderCompletionDate <  DATEADD(month, -10, @date)
    

    通过使用 DATEADD() ,可以为您处理所有边界情况 .

    通过使用 >= startDate AND < endDate ,您可以更轻松地使用 DATEADD() .

    通过将所有计算放在右侧(操纵变量,而不是表的数据),可以提高性能并启用索引的使用 .

  • 0

    这应该工作

    Create PROCEDURE [dbo].[usp_GetAnniversaryCustomers]
     @date DATE
     AS
    SET NOCOUNT ON
    
    DECLARE @HistoricalDate DATE = DATEADD(month,-11,@date);
    DECLARE @HistoricalDateStart DATE = DATEADD(month,DATEDIFF(month,0,@HistoricalDate),0);
    DECLARE @HistoricalDateEnd DATE = DATEADD(month,1,@HistoricalDateStart);
    
    
    SELECT  CustomerID,
        BAN_ADSL_TN,
        REPLACE(LandlinePhoneNumber,',','')LandlinePhoneNumber,
        REPLACE(MobilePhoneNumber,',','')MobilePhoneNumber,
        FirstName,
        LastName,
        REPLACE(ServiceAddress,',','')ServiceAddress,
        ServiceAddressAptNo,
        REPLACE(ServiceAddressCity,',','')ServiceAddressCity,
        ServiceAddressState,
        ServiceAddressZip,
        --MailingAddress,
        --MailingAddressAptNo,
        --MailingAddressCity,
        --MailingAddressState,
        --MailingAddressZip,
        --LanguageID,
        --Customer Service Number 
        OrderCompletionDate = CONVERT(VARCHAR(10), OrderCompletionDate, 101)
     FROM dbo.Customers 
     WHERE StatusID = 115
        AND OrderCompletionDate >= @HistoricalDateStart
        AND OrderCompletionDate < @HistoricalDateEnd
        ORDER BY OrderCompletionDate DESC
    

相关问题