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

时间:2018-01-10 17:37:42

标签: sql sql-server tsql

以下存储过程假设将OrderCompletionDate年作为去年,并将当月添加一个月。

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

我的错误:

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

我的问题是:

如何更改此存储过程,使其仍返回上一年和第一个月+1数据。但是当我们到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 个答案:

答案 0 :(得分:3)

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

使用DATEADD()处理所有边界情况。

使用>= startDate AND < endDate,您可以更加简单地使用DATEADD()

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

答案 1 :(得分: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