我们如何修改下面的脚本来获取最近6个月的第一个月数据?
select datetimeInsert, Part_no,qty
FROM RECEIPT
where
datediff(month, datetimeInsert, getdate()) <= 6=>跳过最近5个月的数据,仅显示前6个月的第1个月数据
发布于 2021-11-25 09:11:51
看起来你应该使用日期界限。所以就像这样:
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)返回7个月前一个月的最后一个date (GETDATE()是今天,然后第二个参数是7个月前)。因此,就今天而言,这将是2021-04-30。然后我将值加上一天,以获得6个月前该月的第一天:2021-05-01。然后,我对5/6月使用相同的逻辑。
因此,这最终要求datetimeInsert的值为>= 2021-05-01和< 2021-06-01;这意味着2021年5月的每个日期和时间值。
发布于 2021-11-25 09:05:26
因此,如果您只想要6个月前的数据,请使用equal而不是less the
select datetimeInsert, Part_no,qty
from receipt
where datediff(month, datetimeInsert, getdate()) = 6编辑1:@larnu的一个优点是,在DATEDIFF()函数中使用datetimeInsert列可以降低查询的sargeable,也就是说,它将无法利用索引。
您可以在不牺牲可裁剪性的情况下实现相同的效果:
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。
发布于 2021-11-25 09:39:38
我认为你可以通过在你的查询中做一个小的改变来实现这一点。您可以使用=0,而不是<=6。这将为您提供最新的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()) = 1https://stackoverflow.com/questions/70107355
复制相似问题