【问题标题】:Unable to get correct date T-SQL stored procedure无法获取正确的日期 T-SQL 存储过程
【发布时间】:2018-01-10 17:37:42
【问题描述】:

下面的存储过程假设将 OrderCompletionDate 年份作为去年 AND 并将一个月添加到当前月份。

所以如果我在 2018 年 1 月运行它,它会返回 2017 年 2 月的数据,而在 2018 年 2 月,它将返回 2017 年 3 月的数据,依此类推。

我的错误:

当我们到达 12 月时,它会查找不存在的第 13 个月。在这种情况下,我希望它获得当年的一月数据。所以当我们到达 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

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:
    WHERE
            StatusID = 115
        AND OrderCompletionDate >= DATEADD(month, -11, @date)
        AND OrderCompletionDate <  DATEADD(month, -10, @date)
    

    通过使用DATEADD(),所有边界情况都会为您处理。

    通过使用&gt;= startDate AND &lt; endDate,您可以更简单地使用DATEADD()

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

    【讨论】:

      【解决方案2】:

      这应该可以工作

      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
      

      【讨论】:

        猜你喜欢
        • 2017-03-30
        • 2011-02-22
        • 1970-01-01
        • 1970-01-01
        • 2015-05-19
        • 2016-03-15
        • 2018-10-03
        • 2013-05-28
        • 2020-03-04
        相关资源
        最近更新 更多