【问题标题】:Select all ended bookings选择所有已结束的预订
【发布时间】:2012-12-06 22:56:11
【问题描述】:

我们的数据库中有一系列预订,每个预订都有一个序列的多个会话。每个 Session 都有一个包含 DateTime 的“停止”。

我想选择两个日期之间所有会话都已结束的预订。

SELECT DISTINCT b.*
  FROM Booking as b
    JOIN Sequence as se
    JOIN Session as s
ON (b.sequence_id=se.id AND s.sequence_id=se.id
    AND s.stop between '2012-09-01 00:00:00' AND '2012-12-01 00:00:00');

此 SQL 选择包含 1 个或多个已结束会话的预订。

我只想要所有会话都结束的预订。

有什么想法吗?

【问题讨论】:

  • 要么修改您的加入,要么添加另一个加入并选择 isnull(s.stop)。 IE 查找缺少结束日期的站点。
  • 'stop' 在数据库中永远不会为空。每个会话中的“停止”必须介于两个时间戳之间才能选择预订。
  • 如何知道给定的 Session 是否没有停止?创建 Session 时的默认值是多少?
  • 'stop' 是预期的结束日期。它总是在创建会话时设置。
  • 我想我明白了:选择没有任何超出日期范围的条目的会话?

标签: mysql sql select


【解决方案1】:

thanx,确切的查询是这样的:

SELECT b.id, s.stop  
  FROM Booking as b  
  JOIN Sequence as se  
  JOIN Session as s  
     ON (b.sequence_id=se.id AND s.sequence_id=se.id)  
        where not exists (SELECT ss.id from Session as ss where ss.sequence_id=se.id and ss.stop < '2012-09-01 00:00:00')  
        and not exists (SELECT ss.id from Session as ss where ss.sequence_id=se.id and ss.stop > '2012-12-01 00:00:00'); 

【讨论】:

    【解决方案2】:

    我想知道你是否可以这样做:

    SELECT DISTINCT b.*  
      FROM Booking as b  
      JOIN Sequence as se  
      JOIN Session as s  
         ON (b.sequence_id=se.id AND s.sequence_id=se.id )  
      where s.stop between '2012-09-01 00:00:00' AND '2012-12-01 00:00:00')  
         and not exists ( s.stop < '2012-09-01 00:00:00' )  
         and not exists ( s.stop > '2012-12-01 00:00:00');  
    

    虽然语法不太正确。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-04
      相关资源
      最近更新 更多