【问题标题】:Case statements, subqueries, DATEPART function, DATENAME function案例语句、子查询、DATEPART 函数、DATENAME 函数
【发布时间】:2015-05-01 14:50:17
【问题描述】:

我需要使用 SQL 构造一个查询以从下表中查找以下信息:

找出乘坐过周六起飞周日降落航班的不同乘客的姓名。

以下是数据库模式中的表:

Company table

ID_comp name
------------

1   Don_avia  
2   Aeroflot  
3   Dale_avia 
4   air_France
5   British_AW



Passenger table

ID_psg name
-----------

1   Bruce Willis        
2   George Clooney      
3   Kevin Costner       
4   Donald Sutherland   
5   Jennifer Lopez      
6   Ray Liotta          
7   Samuel L. Jackson   
8   Nikole Kidman       
9   Alan Rickman        
10  Kurt Russell        
11  Harrison Ford       
12  Russell Crowe       
13  Steve Martin        
14  Michael Caine       
15  Angelina Jolie      
16  Mel Gibson          
17  Michael Douglas     
18  John Travolta       
19  Sylvester Stallone  
20  Tommy Lee Jones     
21  Catherine Zeta-Jones
22  Antonio Banderas    
23  Kim Basinger        
24  Sam Neill           
25  Gary Oldman         
26  Clint Eastwood      
27  Brad Pitt           
28  Johnny Depp         
29  Pierce Brosnan      
30  Sean Connery        
31  Bruce Willis        
37  Mullah Omar    

Pass_in_trip table

trip_no date                  ID_psg place
-------------------------

1100    2003-04-29 00:00:00.000 1   1a        
1123    2003-04-05 00:00:00.000 3   2a        
1123    2003-04-08 00:00:00.000 1   4c        
1123    2003-04-08 00:00:00.000 6   4b        
1124    2003-04-02 00:00:00.000 2   2d        
1145    2003-04-05 00:00:00.000 3   2c        
1145    2003-04-25 00:00:00.000 5   1d        
1181    2003-04-01 00:00:00.000 1   1a        
1181    2003-04-01 00:00:00.000 6   1b        
1181    2003-04-01 00:00:00.000 8   3c        
1181    2003-04-13 00:00:00.000 5   1b        
1182    2003-04-13 00:00:00.000 5   4b        
1182    2003-04-13 00:00:00.000 9   6d        
1187    2003-04-14 00:00:00.000 8   3a        
1187    2003-04-14 00:00:00.000 10  3d        
1188    2003-04-01 00:00:00.000 8   3a        
7771    2005-11-04 00:00:00.000 11  4a        
7771    2005-11-07 00:00:00.000 11  1b        
7771    2005-11-07 00:00:00.000 37  1c        
7771    2005-11-09 00:00:00.000 11  5a        
7771    2005-11-14 00:00:00.000 14  4d        
7771    2005-11-16 00:00:00.000 14  5d        
7772    2005-11-07 00:00:00.000 12  1d        
7772    2005-11-07 00:00:00.000 37  1a        
7772    2005-11-29 00:00:00.000 10  3a        
7772    2005-11-29 00:00:00.000 13  1b        
7772    2005-11-29 00:00:00.000 14  1c        
7773    2005-11-07 00:00:00.000 13  2d        
7778    2005-11-05 00:00:00.000 10  2a        
8881    2005-11-08 00:00:00.000 37  1d        
8882    2005-11-06 00:00:00.000 37  1a        
8882    2005-11-13 00:00:00.000 14  3d  


Trip table

trip_no ID_comp plane town_from town_to time_out time_in
--------------------------------------------------------

1100    4   Boeing      Rostov      Paris       1900-01-01 14:30:00.000  1900-01-01 17:50:00.000
1101    4   Boeing      Paris       Rostov      1900-01-01 08:12:00.000  1900-01-01 11:45:00.000
1123    3   TU-154      Rostov      Vladivostok 1900-01-01 16:20:00.000  1900-01-01 03:40:00.000
1124    3   TU-154      Vladivostok Rostov      1900-01-01 09:00:00.000  1900-01-01 19:50:00.000
1145    2   IL-86       Moscow      Rostov      1900-01-01 09:35:00.000  1900-01-01 11:23:00.000
1146    2   IL-86       Rostov      Moscow      1900-01-01 17:55:00.000 1900-01-01 20:01:00.000
1181    1   TU-134      Rostov      Moscow      1900-01-01 06:12:00.000 1900-01-01 08:01:00.000
1182    1   TU-134      Moscow      Rostov      1900-01-01 12:35:00.000 1900-01-01 14:30:00.000
1187    1   TU-134      Rostov      Moscow      1900-01-01 15:42:00.000 1900-01-01 17:39:00.000
1188    1   TU-134      Moscow      Rostov      1900-01-01 22:50:00.000 1900-01-01 00:48:00.000
1195    1   TU-154      Rostov      Moscow      1900-01-01 23:30:00.000 1900-01-01 01:11:00.000
1196    1   TU-154      Moscow      Rostov      1900-01-01 04:00:00.000 1900-01-01 05:45:00.000
7771    5   Boeing      London      Singapore   1900-01-01 01:00:00.000 1900-01-01 11:00:00.000
7772    5   Boeing      Singapore   London      1900-01-01 12:00:00.000 1900-01-01 02:00:00.000
7773    5   Boeing      London      Singapore   1900-01-01 03:00:00.000 1900-01-01 13:00:00.000
7774    5   Boeing      Singapore   London      1900-01-01 14:00:00.000 1900-01-01 06:00:00.000
7775    5   Boeing      London      Singapore   1900-01-01 09:00:00.000 1900-01-01 20:00:00.000
7776    5   Boeing      Singapore   London      1900-01-01 18:00:00.000 1900-01-01 08:00:00.000
7777    5   Boeing      London      Singapore   1900-01-01 18:00:00.000 1900-01-01 06:00:00.000
7778    5   Boeing      Singapore   London      1900-01-01 22:00:00.000 1900-01-01 12:00:00.000
8881    5   Boeing      London      Paris       1900-01-01 03:00:00.000 1900-01-01 04:00:00.000
8882    5   Boeing      Paris       London      1900-01-01 22:00:00.000 1900-01-01 23:00:00.000

任何关于如何格式化最后一个表格的建议也将不胜感激,过去一个小时我一直在尝试修复它!

【问题讨论】:

  • 您问的是 MS SQL 还是 Oracle?他们使用不同的功能等。
  • 你能在上面的表格上提供一个 sqlfiddle 吗?
  • 其实两者都有,但我正在 Oracle 数据库上测试我的解决方案。
  • 我正在努力提供一个 SQLfiddle - 我不断收到错误“发生未知错误:文件过早结束。:” - 将在我有更新时发布。

标签: sql sql-server oracle11g


【解决方案1】:

如果我们假设没有航班最多花费超过 24 小时,我们所需要做的就是找到从星期六开始的航班,并且在 time_out 之前有一个 time_in 值。使用 MSSQL,它可能看起来像这样:

select p.name
from Pass_in_trip pit
join Trip t on t.trip_no = pit.trip_no
join Passenger p on pit.ID_psg = p.ID_psg
where DATENAME(dw, pit.date) = 'Saturday'
and t.time_in < t.time_out

使用您的示例数据,这将返回:

Kevin Costner
Kurt Russell

当然,如果行程可能需要超过 24 小时,则无法确定航班发生在两个日期之间,因为数据模型没有记录这一点。

对于 Oracle,您可以像这样 to_char(date, 'DAY') = 'Saturday' 进行工作日检查,我想 - 但我无法对其进行测试。

【讨论】:

  • 这返回了正确的结果,但由于某种原因,这是我得到的以及正确结果:“错误。您的查询在主数据库上产生了正确的结果集,但它在第二次测试失败,检查数据库 * 错误的记录数(多 1) NAME Kevin Costner Kurt Russell
  • 但逻辑是合理的,所以我会去。谢谢。
猜你喜欢
  • 1970-01-01
  • 2018-08-06
  • 2012-10-28
  • 2017-07-17
  • 1970-01-01
  • 2012-04-16
  • 1970-01-01
  • 2013-11-21
  • 2019-10-31
相关资源
最近更新 更多