1

嗨,我对 SQL 脚本还很陌生,我在下面写了一些来获取我希望在任何给定日期运行时的所有前几个月数据,无论一个月中有多少天

表格日期格式为 2013-05-10 00:00:00.000

我只是在专家眼中查看脚本并建议我是否正确或错误以及如果我有请在哪里:

SELECT 
[Circuit Number]
,[Request Number]
,[RequestDate]
FROM [QuoteBase].[dbo].[Requests]
WHERE RequestType LIKE 'Cancel%' 
AND DATEPART(mm, [RequestDate]) = DATEPART(mm, DATEADD(mm, -1, getdate()))
AND DATEPART(yyyy, [RequestDate]) = DATEPART(yyyy, DATEADD(mm, -1, getdate()))
4

2 回答 2

1
SELECT 
    [Circuit Number]
   ,[Request Number]
   ,[RequestDate]
FROM
   [QuoteBase].[dbo].[Requests]
WHERE
   RequestType LIKE 'Cancel%' 
   AND
   [RequestDate] >= DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0);  --year
   AND
   [RequestDate] >= DATEADD(mm, DATEDIFF(mm, 32, GETDATE()), 0);   -- start last month
   AND
   [RequestDate] < DATEADD(mm, DATEDIFF(mm, 0, GETDATE()), 0);   -- start this month

这使用技术从这里找到月份的开始:需要在 sql server 中按四舍五入的时间或日期数字计算

另外,不要在谓词上使用函数。请参阅此处的第 2 点:http ://www.simple-talk.com/sql/t-sql-programming/ten-common-sql-programming-mistakes/

在这种情况下,这样的索引将很有用

CREATE INDEX IX_Whatever ON
         QuoteBase (RequestDate, RequestType)
            INCLUDE ([Circuit Number], [Request Number])
于 2013-06-28T10:29:05.190 回答
1

我不是 SQL 专家,但试试这个:

SELECT [Circuit Number]
,[Request Number]
,[RequestDate]
FROM Requests
WHERE RequestType LIKE 'Cancel%'
AND DATEDIFF(mm,Requestdate , GETDATE())=1
AND DATEDIFF(yy,Requestdate, GETDATE())=0

看我的小提琴演示

解释:

DATEDIFF(mm,Requestdate , GETDATE())=1 (Only Request previous Month of the Current Date)

下一个条件:

DATEDIFF(yy,Requestdate, GETDATE())=0 (Only in same year as Current Date)

但是,如果您只想要上个月,无论它是否与当前日期相同,那么您可以删除第二个条件,例如:

SELECT [Circuit Number]
,[Request Number]
,[RequestDate]
FROM Requests
WHERE RequestType LIKE 'Cancel%'
AND DATEDIFF(mm,Requestdate , GETDATE())=1

请参阅演示

例如,如果 CurrentDate 是,2013-01-19那么任何December 2012请求都将被包括在内,尽管它不是同一年的,但显然是上个月的。

于 2013-06-28T11:24:49.180 回答