首页 > 解决方案 > PostgreSQL 上的查询无法正常工作

问题描述

我创建了 2 个表,一个用于司机姓名,另一个用于他们相应的车辆,我的练习是挑选出注册日期不到一个月的司机,查询应该只挑选一个司机,但结果是它列出了尽管条件不适用于其他 2 个,但所有 3 个驱动程序:

创建架构:

create table drivers (
  id serial primary key,
  first_name varchar,
  last_name varchar
);

create table vehicles (
  id serial primary key,
  make varchar,
  model varchar,
  registration_date date,
  driver_id integer references drivers(id)
);
INSERT INTO drivers (id,first_name, last_name) VALUES (1,'John', 'Doe'),(2,'Michael', 'Doe'),(3,'Jane', 'Fonda');
INSERT INTO vehicles (make,model,registration_date, driver_id) VALUES ('Volkswagen', 'Jetta','2012-10-23',1),('Skoda', 'Octavia','2011-03-01',2),('Opel', 'Meriva','2015-08-01',3);

询问:

select d.first_name , d.last_name , v.make
from drivers d
join vehicles v
on v.driver_id= d.id
where v.registration_date::DATE  - CURRENT_DATE::DATE  < 30;

结果:

first_name  last_name   make
John         Doe        Volkswagen
Michael      Doe        Skoda
Jane         Fonda      Opel

标签: sqlpostgresql

解决方案


一个复杂的例子:

select 
  registration_date, d.first_name , d.last_name , v.make
from 
   drivers d
join 
   vehicles v
on 
   v.driver_id= d.id
where 
   make_date(extract(year from current_date)::int, extract(month from  v.registration_date)::int, extract(day from v.registration_date)::int ) - current_date  
between 0 and 29;

registration_date | first_name | last_name |    make    
-------------------+------------+-----------+------------
 2012-10-23        | John       | Doe       | Volkswagen

使用make_dateextract来自日期/时间运算符/函数。我可以看到将make_date(...)部分变成一个函数。


推荐阅读