sql - SQLPLUS 中的本月最后一天发生变化

标签 sql oracle

请专家提供一些帮助,我将不胜感激。

在 SQL SELECT 语句中,我试图获取去年每月数据的最后一天。 例如,我可以轻松获取每个月的最后一天并将其连接到我的数据表中,但问题是,如果该月的最后一天没有数据,则没有返回数据。我需要的是 SELECT 返回最后一天的月份数据。

这可能很容易做到,但说实话,我的脑子开始疼了。

我附上了下面的选择,用于仅返回过去 12 个月内该月最后一天的数据。

预先感谢您的帮助!

SELECT fd.cust_id,fd.server_name,fd.instance_name,
    TRUNC(fd.coll_date) AS coll_date,fd.column_name
FROM super_table fd,
    (SELECT TRUNC(daterange,'MM')-1 first_of_month
    FROM (
    select TRUNC(sysdate-365,'MM') + level as DateRange
    from    dual
    connect by level<=365)
    GROUP BY TRUNC(daterange,'MM')) fom
WHERE fd.cust_id = :CUST_ID
AND fd.coll_date > SYSDATE-400
AND TRUNC(fd.coll_date) = fom.first_of_month
GROUP BY fd.cust_id,fd.server_name,fd.instance_name,
    TRUNC(fd.coll_date),fd.column_name
ORDER BY fd.server_name,fd.instance_name,TRUNC(fd.coll_date)

最佳答案

您可能需要对数据进行分组,以便每个月的数据都在组中,然后在组内选择存在的最大日期。子查询可能是:

SELECT MAX(coll_date) AS last_day_of_month
    FROM Super_Table AS fd
    GROUP BY YEAR(coll_date) * 100 + MONTH(coll_date);

这假设存在函数 YEAR() 和 MONTH() 来从日期中提取年份和月份作为整数值。显然,这不会限制日期范围 - 您也可以这样做。如果 Oracle 中没有这些函数,那么您可以进行某种操作来获得等效的结果。

使用来自 Rhose 的信息(谢谢):

SELECT MAX(coll_date) AS last_day_of_month
    FROM Super_Table AS fd
    GROUP BY TO_CHAR(coll_date, 'YYYYMM');

这会获得相同的最终结果,将同一日历月的所有日期放入一个组中,然后确定该组中存在的最大值。

关于sql - SQLPLUS 中的本月最后一天发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1133584/

相关文章:

SQL - 不同类别的列

sql - Oracle SQL - 如何根据列中的值重复字符

sql - Oracle SQL PIVOT : missing column and aggregated rows?

sql - "quoted string not properly terminated"sqlplus

oracle - 为什么我不能使用 SQLcl 通过 jdbc 连接

java - 使用 JDBC 更新数据库中的记录以等于用户输入?

MySQL更新bigint字段

php - Php SQLITE 中的分页

python - 将与 MySQL 数据库表一起使用的 Django 1.8.2 模型的模型字段类型

SQL 添加行号