下面的存储过程假设获得 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 回答
通过使用
DATEADD()
,可以为您处理所有边界情况 .通过使用
>= startDate AND < endDate
,您可以更轻松地使用DATEADD()
.通过将所有计算放在右侧(操纵变量,而不是表的数据),可以提高性能并启用索引的使用 .
这应该工作