以下存储过程假设将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
答案 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