Sql Oracle查询按月份和年份显示数据

Sql Oracle查询按月份和年份显示数据,sql,oracle,Sql,Oracle,我想按月份和年份显示数据量。这是按日期显示数据的示例: 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') 您需要将该函数应用于trxdate。用你的逻辑: SE

我想按月份和年份显示数据量。这是按日期显示数据的示例:

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')

您需要将该函数应用于
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>=日期'2018-04-01'
及
trxdate<日期'2018-05-01'

这将允许数据库在
trxdate
上使用索引您需要将该函数应用于
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>=日期'2018-04-01'
及
trxdate<日期'2018-05-01'

这将允许数据库在
trxdate

上使用索引。有几种方法可以完成您要做的事情。哪一个适合您将取决于您的数据库设计(例如,您创建的索引)。一种方法可能是:

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';
或:

编辑

如果月份和年份是动态的,我将根据它们构建一个日期(例如,
到_date('--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 );
从olap.trxh2hpdam中选择计数(*)
其中trxdate>=截止日期('--01',YYYY-MM-DD')
和trxdate<添加月份(至日期('-01',YYYY-MM-DD'),1);

希望这能有所帮助。

有几种方法可以完成你想做的事情。哪一个适合您将取决于您的数据库设计(例如,您创建的索引)。一种方法可能是:

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';
或:

编辑

如果月份和年份是动态的,我将根据它们构建一个日期(例如,
到_date('--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 );
从olap.trxh2hpdam中选择计数(*)
其中trxdate>=截止日期('--01',YYYY-MM-DD')
和trxdate<添加月份(至日期('-01',YYYY-MM-DD'),1);

希望这能有所帮助。

您的日期的可能重复(可能)有时间成分,并且
2018-04-23 12:34:56=2018-04-23 00:00:00
不正确,因此在您的筛选条件下,行不匹配。您的
NLS\u DATE\u FORMAT
会话参数在以字符串形式显示值时,也可能设置为仅显示日期组件而不是时间组件,因此您不会注意到它有时间组件。日期可能重复(可能)具有时间分量,并且
2018-04-23 12:34:56=2018-04-23 00:00:00
为非真,因此在您的筛选条件下,行不匹配。您的
NLS\u DATE\u FORMAT
会话参数在将值显示为字符串时,也可能设置为仅显示日期组件而不是时间组件,因此您不会注意到它有时间组件。ya,,我使用了索引(trxdate),我用可变的月份和年份构建表单,以便将处理后的结果发布到查询中…如何根据输入的月份和年份进行查询?当然,月份和年份是不一样的,请看我的编辑。掩码(在本例中为
YYYY-MM-DD
)将根据您接受输入的方式而有所不同
YYYY
是4位数的年份,
MM
是两位数的月份(如果适用,包括前导零)。是的,我使用索引(trxdate),我构建了带有可变月份和年份的表单来对查询进行后期处理…如何根据输入的月份和年份进行查询?当然,月份和年份是不一样的,请看我的编辑。掩码(在本例中为
YYYY-MM-DD
)将根据您接受输入的方式而有所不同
YYYY
是4位数的年份,
MM
是两位数的月份(包括前导零,如果适用)。