我正在尝试在Maximo 7.5 UI高级搜索功能中使用SQL编写查询,该查询将返回运行查询的月份前一个月的数据。我想保存此查询,并将其提供给无需编辑即可运行该查询的用户。例如,如果用户在2019年1月25日运行保存的查询,该查询将返回日期为2018年12月中任一天的所有记录。我以前使用过“ where actfinish> = sysdate-30”,但长度每个月的时间各不相同,因此我不能依靠用户(不编写SQL的用户)始终在每个月的第一天运行查询,因此我需要按前一个月筛选查询。我要过滤的字段是DATE字段,但在数据库中看起来像DD-MMM-YY。
答案 0 :(得分:1)
您当前的where actfinish >= sysdate-30
将返回当月的数据以及您提到的问题。
您可以执行以下操作:
where actfinish >= add_months(trunc(sysdate, 'MM'), -1)
and actfinish < trunc(sysdate, 'MM')
trunc(sysdate, 'MM')
在当月第一天的午夜给您。第一个子句减去一个月,因此给您前一个月第一天的午夜;第二个子句阻止将本月的任何记录都包括在内。
您可以通过查询实际查询之外的字词来检查那些结果:
alter session set nls_date_format = 'YYYY-MM-DD HH24:MI:SS';
select sysdate,
add_months(trunc(sysdate, 'MM'), -1) as month_from,
trunc(sysdate, 'MM') as month_to
from dual;
SYSDATE MONTH_FROM MONTH_TO
------------------- ------------------- -------------------
2019-01-25 12:59:53 2018-12-01 00:00:00 2019-01-01 00:00:00
alter session
只是使客户端以特定方式格式化结果,而不是显式地执行to_char()
。
当您说“在数据库中看起来像DD-MMM-YY”时,实际上在数据库中看起来并不像它。当您查询日期值时,客户端会像这样格式化日期,因此您的NLS_DATE_FORMAT可能设置为仍默认的DD-MON-RR模型。 (而且在Oracle中是MON,而不是MMM-请参见the format model elements in the docs。)
答案 1 :(得分:1)
您的解决方案将取决于所使用的数据库类型。
对于SQL Server,我们沿以下几行使用了逻辑:
dateadd(day,1,eomonth(dateadd(month,-2,getdate())))和eomonth(dateadd(month,-1,getdate()))之间的修正
(标识上个月的最后一天以及该日期前1天的最后一天)
对于Oracle,等效项为:
trunc(actfinish,'MONTH')= add_months(trunc(sysdate,'MONTH'),-1)
(确定与上个月关联的年和月,并将其与目标日期组成部分进行比较-trunc month函数删除了月中的时间和日期组成部分,从而使比较变得容易)
答案 2 :(得分:0)
我以前使用过“ where actfinish> = sysdate-30”,但是长度 每个月都有所不同。
“月长”是指每个月的天数(例如30、31、28、29)还是仅是格式问题?如果我正确理解了您的问题,则可以将日期转换为字符,然后将其转换为日期,Oracle会处理天数的变化。例如,类似:
其中to_date(to_char(actfinish,'mm / dd / yyyy'))> = to_date(to_char(sysdate,'mm / dd / yyyy'))-30
或
其中to_date(to_char(actfinish),'mm / dd / yyyy')> = to_date(to_char(sysdate),'mm / dd / yyyy')-30
我的笔记本电脑上没有安装Maximo,因此您可以尝试上面列出的两个。