我們如何修改以下腳本以獲取過去 6 個月的第一個月資料?
select datetimeInsert, Part_no,qty
FROM RECEIPT
where
datediff(month, datetimeInsert, getdate()) <= 6
=> 跳過最近 5 個月的資料,只顯示六個月的第 1 個月資料
uj5u.com熱心網友回復:
似乎您應該使用日期邊界。所以像這樣:
SELECT datetimeInsert,
Part_no,
qty
FROM dbo.receipt
WHERE datetimeInsert >= DATEADD(DAY, 1, EOMONTH(GETDATE(),-7))
AND datetimeInsert < DATEADD(DAY, 1, EOMONTH(GETDATE(),-6));
EOMONTH獲取月底的日期。因此,例如,EOMONTH(GETDATE(),-7)回傳date7 個月前的最后一個(GETDATE()今天,然后第二個引數是 7 個月前)。所以今天,那將是2021-04-30。然后我添加一天值,得到的第一天為一個月6個月前:2021-05-01。然后我對五月/六月使用相同的邏輯。
因此,這最終要求的值為datetimeInsert>= 2021-05-01 和 < 2021-06-01;表示2021 年 5 月的每個日期和時間值。
uj5u.com熱心網友回復:
因此,如果您只想要 6 個月前的月份的資料,請使用equal而不是小于:
select datetimeInsert, Part_no,qty
from receipt
where datediff(month, datetimeInsert, getdate()) = 6
編輯 1:@larnu 的一個好處是,在函式datetimeInsert內部使用列DATEDIFF()會使這個查詢變得不那么容易,即它無法利用索引的優勢。
您可以在不犧牲 sargeability 的情況下實作相同的效果:
select datetimeInsert, Part_no,qty
from receipt
where datetimeInsert >= DATEADD(DAY, 0, DATEDIFF(DAY, 0, DATEADD(MONTH, -7, GETDATE())))
and datetimeInsert < DATEADD(DAY, 0, DATEDIFF(DAY, 0, DATEADD(MONTH, -6, GETDATE())));
注意:我剛剛意識到第二個查詢不僅查看月份,還查看 7 到 6 個月前的時間段。因此,您將獲得 7 到 6 個月前的結果,而不是當月之前 6 個月內的結果。如果您想要后者(實際上與問題中的原始查詢相同),您將在@larnu's answer 中找到解決方案。
編輯 2:正如@Jeff 所評論的,使用像這樣的運算式的時間邊界DATEADD(MONTH, -7, GETDATE())將是 7 個月前的日期時間,截至今天這個確切時間。我已經更新了上面的陳述句和下面的 dbfiddle 以解決這個問題并突出顯示差異。
見db<>fiddle。
uj5u.com熱心網友回復:
我認為您可以通過對查詢進行微小更改來實作這一點。取而代之的是<=6,您可以這樣做=0。這將為您提供最新的 1 個月資料。
所以查詢看起來像,
select datetimeInsert, Part_no,qty
FROM RECEIPT
where
datediff(month, datetimeInsert, getdate()) = 0
如果您需要last month資料,請使用= 1
喜歡,
select datetimeInsert, Part_no,qty
FROM RECEIPT
where
datediff(month, datetimeInsert, getdate()) = 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/366945.html
