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
...
进一步阅读:
我有一个复杂的(复杂是因为它给了我很多工作要完成!)它 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
...
进一步阅读: