SQL - 如何统计某一年的数据条数?
SQL - How to count number of data in certain year?
我正在尝试计算 2019 年的订单数量,但我一直收到错误消息
ORA-01861: literal does not match format string
我试过运行的SQL是:
SELECT COUNT(*)
FROM Order_tab
WHERE Order_Date = '%2019';
table格式为
create table Order_tab
(
Order_ID number (11,0) not null,
Order_Date date DEFAULT SYSDATE,
Customer_ID number (11,0),
constraint Order1_PK
primary key (Order_ID),
constraint Order1_FK
foreign key (Customer_ID) references Customer_tab(Customer_ID)
);
我添加到 table 的数据是:
insert into Order_tab values (1010, '06/12/2017', 5);
insert into Order_tab values (1011, '06/12/2017', 1);
insert into Order_tab values (1012, '06/12/2017', 5);
insert into Order_tab values (1013, '06/12/2017', 1);
insert into Order_tab values (1014, '06/12/2017', 2);
insert into Order_tab values (1015, '06/13/2017', 5);
insert into Order_tab values (1016, '06/13/2017', 1);
insert into Order_tab values (1017, '07/20/2019', 12);
insert into Order_tab values (1018, '08/03/2018', 11);
insert into Order_tab values (1019, '01/29/2019', 6);
insert into Order_tab values (1020, '02/14/2019', 9);
insert into Order_tab values (1021, '03/24/2019', 11);
insert into Order_tab values (1022, '06/14/2019', 15);
insert into Order_tab values (1023, '10/31/2019', 7);
insert into Order_tab values (1024, '01/31/2020', 7);
insert into Order_tab values (1025, '10/05/2020', 14);
insert into Order_tab values (1026, '01/01/2020', 13);
您可以使用以下过滤器:
to_char(order_date, 'yyyy') = '2019'
或更好的:
order_date between to_date('2019.01.01', 'yyyy.mm.dd') and to_date('2019.12.31', 'yyyy.mm.dd')
您正在将日期(在正确的 DATE 数据类型中)与字符串进行比较。 Oracle 将尝试将您的字符串 '%2019' 转换为日期 - 显然,这没有意义。
要解决此问题:EXTRACT(YEAR FROM ) returns NUMBER 数据类型的年份,然后您可以将其与 2019 年进行比较(而不是字符串!)还有其他方式,但这可能是最简单的。
order_date
不是字符串而是 date
。因此引擎会尝试将 '%2019'
向上转换为 date
以便执行比较。但是 '%2019'
不是有效的 date
表示。
此外,即使 order_date
是一个字符串(这是错误的),比较在您使用它的方式中也没有意义。您可能想要 LIKE
而不是 =
.
无论如何,使用范围比较。
SELECT count(*)
FROM order_tab
WHERE order_date >= to_date('2019-01-01', 'YYYY-MM-DD')
AND order_date < to_date('2020-01-01', 'YYYY-MM-DD');
它的优点是它可以在 order_date
上使用索引,而从 order_date
中提取年份并将其与 2019 年(作为数字或字符串)进行比较的方法不能。
我正在尝试计算 2019 年的订单数量,但我一直收到错误消息
ORA-01861: literal does not match format string
我试过运行的SQL是:
SELECT COUNT(*)
FROM Order_tab
WHERE Order_Date = '%2019';
table格式为
create table Order_tab
(
Order_ID number (11,0) not null,
Order_Date date DEFAULT SYSDATE,
Customer_ID number (11,0),
constraint Order1_PK
primary key (Order_ID),
constraint Order1_FK
foreign key (Customer_ID) references Customer_tab(Customer_ID)
);
我添加到 table 的数据是:
insert into Order_tab values (1010, '06/12/2017', 5);
insert into Order_tab values (1011, '06/12/2017', 1);
insert into Order_tab values (1012, '06/12/2017', 5);
insert into Order_tab values (1013, '06/12/2017', 1);
insert into Order_tab values (1014, '06/12/2017', 2);
insert into Order_tab values (1015, '06/13/2017', 5);
insert into Order_tab values (1016, '06/13/2017', 1);
insert into Order_tab values (1017, '07/20/2019', 12);
insert into Order_tab values (1018, '08/03/2018', 11);
insert into Order_tab values (1019, '01/29/2019', 6);
insert into Order_tab values (1020, '02/14/2019', 9);
insert into Order_tab values (1021, '03/24/2019', 11);
insert into Order_tab values (1022, '06/14/2019', 15);
insert into Order_tab values (1023, '10/31/2019', 7);
insert into Order_tab values (1024, '01/31/2020', 7);
insert into Order_tab values (1025, '10/05/2020', 14);
insert into Order_tab values (1026, '01/01/2020', 13);
您可以使用以下过滤器:
to_char(order_date, 'yyyy') = '2019'
或更好的:
order_date between to_date('2019.01.01', 'yyyy.mm.dd') and to_date('2019.12.31', 'yyyy.mm.dd')
您正在将日期(在正确的 DATE 数据类型中)与字符串进行比较。 Oracle 将尝试将您的字符串 '%2019' 转换为日期 - 显然,这没有意义。
要解决此问题:EXTRACT(YEAR FROM
order_date
不是字符串而是 date
。因此引擎会尝试将 '%2019'
向上转换为 date
以便执行比较。但是 '%2019'
不是有效的 date
表示。
此外,即使 order_date
是一个字符串(这是错误的),比较在您使用它的方式中也没有意义。您可能想要 LIKE
而不是 =
.
无论如何,使用范围比较。
SELECT count(*)
FROM order_tab
WHERE order_date >= to_date('2019-01-01', 'YYYY-MM-DD')
AND order_date < to_date('2020-01-01', 'YYYY-MM-DD');
它的优点是它可以在 order_date
上使用索引,而从 order_date
中提取年份并将其与 2019 年(作为数字或字符串)进行比较的方法不能。