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 年(作为数字或字符串)进行比较的方法不能。