sql 查询下个月的特定日期

specific day of next month on a sql query

我有一个复杂的(复杂是因为它给了我很多工作要完成!)它 returns 结果满足了当月 30 日之前的查询。

代码如下:

SELECT 
    CONCAT(' ', CONVERT(date, fc.dataven), ' '), 
    fc.adoc, fc.nome, 
    CONCAT(CONVERT(money, fc.ecred), '  €')  
FROM
    fc, fl
WHERE
    dataven BETWEEN DATEFROMPARTS(IIF(MONTH(GETDATE()) = 1, YEAR(GETDATE())-1, YEAR(GETDATE())),
                                  IIF(MONTH(GETDATE()) = 1, 12, MONTH(GETDATE()) - 1), 30) 
                AND CAST(DATEADD(day,-day(GETDATE()),DATEADD(month, 1,GETDATE())) as DATE)

    AND fc.adoc NOT LIKE '' 
    AND fc.cmdesc LIKE 'v%'  
    AND fc.evalpo = '0' 
    AND (fc.cmdesc LIKE '%factura%' OR fc.cmdesc LIKE '%cred%')
    AND fc.nome = fl.nome 
    AND fl.pais LIKE 1
GROUP BY
    fc.adoc, fc.dataven, fc.nome, fc.ecred
ORDER BY 
    fc.nome 

我有一份工作在每个月的第三个星期一运行这个查询。

我需要的是查询 returns 值不仅到本月的第 30 天,而且到下个月的第 10 天。

我有点迷茫,谁能给我一个提示?

我会将 where 谓词表述为:

dataven between eomonth(getdate()) and dateadd(day, 11, eomonth(getdate()))

这会过滤当前月份的最后一天和下个月的第 10 天之间的日期。这不完全是您要求的,但这似乎是解决问题的合理方法 - 并非所有月份都有 30 天(实际上,一年中只有 4 个月有 30 天)。


编辑

来自评论:

I need the query to work between the day 25 of the prior month till the day 10 of the next month

那不是一回事。您可以这样表述:

where dataven 
    between dateadd(day, 24, dateadd(month, -1, datefromparts(year(getdate()), month(getdate()), 1)))
        and dateadd(day,  9, dateadd(month,  1, datefromparts(year(getdate()), month(getdate()), 1)))

这假设 dataven 没有时间分量。否则,您可能更喜欢:

where dataven >= dateadd(day, 24, dateadd(month, -1, datefromparts(year(getdate()), month(getdate()), 1)))
  and dataven <  dateadd(day, 10, dateadd(month,  1, datefromparts(year(getdate()), month(getdate()), 1)))

看来最短的方法是使用 EOMONTH 函数

    dataven between dateadd(day, -5, eomonth(getdate(), -1))
                and dateadd(day, 10, eomonth(getdate(), 0))

我会在查询之外执行表达式,因为它们更容易测试和调试,并且它们使您的查询更清晰,也更易于维护。

DECLARE @lastmonth date = DATEADD(MONTH, -1, sysdatetime());
DECLARE @nextmonth date = DATEADD(MONTH,  2, @lastmonth);

DECLARE @start date = DATEFROMPARTS(YEAR(@lastmonth), MONTH(@lastmonth), 25),    
        @end   date = DATEFROMPARTS(YEAR(@nextmonth), MONTH(@nextmonth), 11);

SELECT 
  ...
  FROM dbo.fc INNER JOIN dbo.fl
    ON fc.nome = fl.nome 
  WHERE dataven >= @start AND dataven < @end
  ...

进一步阅读: