gpt4 book ai didi

Informix 的 SQL 查询以获取上个月的所有记录

转载 作者:行者123 更新时间:2023-12-04 13:39:44 28 4
gpt4 key购买 nike

我需要一个可以生成上个月生成的记录总数的查询。我从这个查询开始:

select state, taxing_entity, count(taxing_entity) Total_TRXN_Count
from taxes where effect_date between '2016/07/01' and '2016/07/31'
group by state, taxing_entity, effect_date

但我需要一个查询,它可以动态计算上个月的记录数,而无需对日期进行硬编码。我尝试了很多查询,例如:

SELECT * FROM taxes 
WHERE effect_date >= DATEADD(day,-30, getdate())
and effect_date <= getdate()

SELECT * 
FROM taxes
WHERE effect_date >= DATEADD(effect_date, -1, GETDATE())

但是直到现在我都没有成功。有人可以建议一种使用 SQL 的 Informix 方言获取上个月总记录的方法吗?

最佳答案

背景

您可以使用 Informix 函数 TODAYMONTH()YEAR()MDY() — 以及一些小玩意儿。

这个月的第一天的表达式是:

MDY(MONTH(TODAY), 1, YEAR(TODAY))

因此,前一个月第一天的表达式是:

MDY(MONTH(TODAY), 1, YEAR(TODAY)) - 1 UNITS MONTH

这些表达的优点是明确且可靠;他们不依赖任何特殊的东西(在您编写的 SQL 中)来查找该月的最后一天。您可以通过从下个月的第一天减去 1 UNITS DAY 来找到该月的最后一天。使用现代版本的 Informix,您可以进行四舍五入到月末的日期运算:

SELECT MDY(1,31,2016) + 1 UNITS MONTH FROM sysmaster:'informix'.sysdual;
2016-02-29

但旧版本的 Informix 会生成错误。即使是现在,MDY(2,31,2016) 也会生成“月份中的无效日期”错误。

回答

所以对于问题中的问题,你想要的日期范围是:

SELECT *
FROM taxes
WHERE effect_date >= (MDY(MONTH(TODAY), 1, YEAR(TODAY)) - 1 UNITS MONTH)
AND effect_date < MDY(MONTH(TODAY), 1, YEAR(TODAY))

使用“本月第一天之前”比使用“上个月最后一天或之前”更容易。但是你可以这样写:

SELECT *
FROM taxes
WHERE effect_date >= (MDY(MONTH(TODAY), 1, YEAR(TODAY)) - 1 UNITS MONTH)
AND effect_date <= (MDY(MONTH(TODAY), 1, YEAR(TODAY)) - 1 UNITS DAY)

或者,等价地:

SELECT *
FROM taxes
WHERE effect_date BETWEEN (MDY(MONTH(TODAY), 1, YEAR(TODAY)) - 1 UNITS MONTH)
AND (MDY(MONTH(TODAY), 1, YEAR(TODAY)) - 1 UNITS DAY)

使用存储过程

您可以通过使用任何选定的日期代替 TODAY 来概括代码,如果您认为这些计算过于晦涩,您可以编写一两个简单的存储过程来执行这些计算,如图所示。可能的名称包括 first_day_this_monthfirst_day_prev_month,将引用日期作为参数传递,默认为今天:

CREATE PROCEDURE first_day_this_month(refdate DATE DEFAULT TODAY)
RETURNING DATE AS first_day;
RETURN MDY(MONTH(refdate), 1, YEAR(refdate));
END PROCEDURE;

CREATE PROCEDURE first_day_prev_month(refdate DATE DEFAULT TODAY)
RETURNING DATE AS first_day;
RETURN MDY(MONTH(refdate), 1, YEAR(refdate)) - 1 UNITS MONTH;
END PROCEDURE;

使用示例(假设您的环境中有 DBDATE='Y4MD-' 或等效项,因此 DATE 字符串看起来像 ISO 8601 或 DATETIME 字符串):

SELECT first_day_this_month() AS aug_1,
first_day_prev_month() AS jul_1,
first_day_this_month(DATE('2015-12-25')) as dec_1,
first_day_prev_month(DATE('2015-10-31')) AS sep_1
FROM sysmaster:'informix'.sysdual;

输出:

aug_1        jul_1        dec_1        sep_1
2016-08-01 2016-07-01 2015-12-01 2015-09-01

因此:

SELECT *
FROM taxes
WHERE effect_date >= first_day_prev_month()
AND effect_date < first_day_this_month()

关于Informix 的 SQL 查询以获取上个月的所有记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39003297/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com