我想按月和年显示数据量。这是按日期显示数据的示例:
select count(*) from db.trx where trxdate = to_date('2018-04-23','yyyy-mm-dd')
当我尝试按月和年显示数据量时,不会显示任何查询结果。查询有问题吗?
查询:
select count(*) from db.trx where trxdate = to_date('2018-04','yyyy-mm')
答案 0 :(得分:3)
您需要将该功能应用于trxdate
。使用你的逻辑:
SELECT Count(*)
FROM olap.trxh2hpdam
WHERE To_char(trxdate, 'YYYY-MM') = '2018-04';
但是,我强烈建议您使用直接日期比较:
WHERE trxdate >= date '2018-04-01'
AND
trxdate < date '2018-05-01'
这将允许数据库使用trxdate
上的索引。
答案 1 :(得分:2)
有几种方法可以完成您尝试做的事情。哪一个适合您将取决于您的数据库设计(例如,您已创建的索引)。一种方式可能是这样的:
SELECT COUNT(*) FROM olap.trxh2hpdam
WHERE TRUNC(trxdate, 'MONTH') = DATE'2018-04-01';
这会将日期向下舍入到该月的第一天(当然,删除任何时间部分)。然后,您只需将其与您想要数据的月份中的第一个进行比较。但是,除非您有TRUNC(trxdate, 'MONTH')
的索引,否则这可能不是最好的行动方案;如果trxdate
被编入索引,您将要使用:
SELECT COUNT(*) FROM olap.trxh2hpdam
WHERE trxdate >= DATE'2018-04-01'
AND trxdate < DATE'2018-05-01';
如果您在查询中使用的日期应该是动态的而不是静态的,那么Oracle中有许多功能可供您使用(例如ADD_MONTHS()
)。
仅供参考,在尝试按天检索数据时,没有理由不使用ANSI日期文字。我不确定您的原始查询是获取特定日期数据的一个很好的示例,因为Oracle DATE
数据类型至少可能包含一个时间:
SELECT COUNT(*) FROM olap.trxh2hpdam
WHERE trxdate >= DATE'2018-04-23'
AND trxdate < DATE'2018-04-24';
或:
SELECT COUNT(*) FROM olap.trxh2hpdam
WHERE TRUNC(trxdate) = DATE'2018-04-23';
修改强>
如果月份和年份是动态的,我会从他们那里建立一个日期(例如TO_DATE('<year>-<month>-01', 'YYYY-MM-DD')
),然后使用以下查询:
SELECT COUNT(*) FROM olap.trxh2hpdam
WHERE trxdate >= TO_DATE('<year>-<month>-01', 'YYYY-MM-DD')
AND trxdate < ADD_MONTHS( TO_DATE('<year>-<month>-01', 'YYYY-MM-DD'), 1 );
希望这有帮助。