[英]SQL check if date is N days back from last month
我需要根據dateIssued檢查發票的編輯(在表格中可以說發票)。
(SQL Server 2008 R2)
想法是可以更改上個月的發票數據,直到本月的第N天為止。 之后,只能更改當月的發票。 發票不能在2個月內更改,以此類推。
例。 假設N = 20天
這意味着我可以將11月的發票更改為12月20日。 在12月21日,我只能更改12月的發票。
我希望我能描述得足夠:(
SELECT invoiceNo, dateIssued FROM Invoices;
invoiceNo dateIssued
001 2016-10-30 00:00:00.000
002 2016-12-01 00:00:00.000
003 2016-11-03 00:00:00.000
004 2016-11-24 00:00:00.000
005 2016-09-09 00:00:00.000
我無法建立一種優雅的算法,可以根據系統日期從表中選擇可編輯的發票。
謝謝
如果您想獲取今天可以修改的發票,則如下所示:
select i.*
from invoices i
where year(dateissued) * 12 + month(dateissued) = year(getdate()) * 12 + month(getdate()) or
(day(getdate()) <= @n and
year(dateissued) * 12 + month(dateissued) = year(getdate()) * 12 + month(getdate()) - 1
) ;
使用year * 12 + month的時髦表達僅是從時間零開始的月份數。 這對於獲取當前日期和上個月非常方便。
DECLARE @Invoices AS TABLE (InvoiceNo INT, dateIssues DATETIME)
INSERT INTO @Invoices VALUES
(1,'2016-10-30 00:00:00.000')
,(2,'2016-12-01 00:00:00.000')
,(3,'2016-11-03 00:00:00.000')
,(4,'2016-11-24 00:00:00.000')
,(5,'2016-09-09 00:00:00.000')
DECLARE @N INT = 20
SELECT
*
FROM
@Invoices
WHERE
dateIssues >=
CASE WHEN DAY(GETDATE()) < @N
THEN DATEADD(MONTH,-1,DATEADD(DAY,1 - DAY(GETDATE()),CAST(GETDATE() AS DATE))) --beginning of last month
ELSE DATEADD(DAY,1 - DAY(GETDATE()),CAST(GETDATE() AS DATE)) --beginning of this month
END
DECLARE @LastDayForEditingPreviousMonth INT = 20
-- Return only invoices for the current month, of those for last month if the @LastDayForEditingPreviousMonth day has not been passed
SELECT *
FROM invoices
WHERE ( DATEPART(YEAR,dateissued) = DATEPART(YEAR,GETDATE())
AND DATEPART(MONTH,dateissued) = DATEPART(MONTH,GETDATE())
) -- Invoices for this month
OR ( DATEPART(DAY,GETDATE()) <= @LastDayForEditingPreviousMonth
AND DATEPART(YEAR,dateissued) = DATEPART(YEAR,GETDATE())
AND DATEPART(MONTH,dateissued) = DATEPART(MONTH,GETDATE()) - 1
) -- Invoices from last month (if eligible)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.