MYSQL加入一张桌子,让客人在特定日期之间停留

MYSQL加入一张桌子,让客人在特定日期之间停留,mysql,Mysql,下面是一个与模式一起给出的问题 列出从“2016年1月13日”到“2016年1月19日”预订房间的客人及其姓名和地址 预订酒店号,客人号,日期从,日期到,房间号 宾客号、宾客名、宾客礼服 请注意,各表中的PK和FK均为斜体 这是我使用的语法这是一个考试的问题,所以这只是为了实际目的 所以我用了这个,我想知道这是否是正确的方法 SELECT g.guestName, g.guestAddress FROM Guest g JOIN Booking b ON g.guestNo = b.g

下面是一个与模式一起给出的问题

列出从“2016年1月13日”到“2016年1月19日”预订房间的客人及其姓名和地址

预订酒店号,客人号,日期从,日期到,房间号

宾客号、宾客名、宾客礼服

请注意,各表中的PK和FK均为斜体

这是我使用的语法这是一个考试的问题,所以这只是为了实际目的

所以我用了这个,我想知道这是否是正确的方法

SELECT g.guestName, g.guestAddress
FROM Guest g 
    JOIN Booking b ON g.guestNo = b.guestNo
WHERE b.dateFrom DATE(2016-01-13) >=  b.dateTo DATE(2016-01-19)

WHERE子句在语法上不正确。试一试

SELECT g.guestName, g.guestAddress
FROM Guest g 
    JOIN Booking b ON g.guestNo = b.guestNo
WHERE DATE(b.dateFrom) >= '2016-01-13'
AND   DATE(b.dateTo) <= '2016-01-19'

WHERE子句在语法上不正确。试一试

SELECT g.guestName, g.guestAddress
FROM Guest g 
    JOIN Booking b ON g.guestNo = b.guestNo
WHERE DATE(b.dateFrom) >= '2016-01-13'
AND   DATE(b.dateTo) <= '2016-01-19'

要获得“开始日期”和“结束日期”与给定的两个日期完全匹配的预订,假设datefrom和dateto列为日期数据类型,我们可以执行以下操作:

  WHERE b.datefrom = '2016-01-13' 
    AND b.dateto   = '2016-01-19'
请注意,这将只返回该确切时间段内的预订,不包括提前开始或晚结束但可能与该时间段内的天数重叠的客人预订

如果我们想找到在给定时间段内有一天或几天重叠预订的客人,那就有点复杂了。关于StackOverflow,已经回答了关于识别重叠的问题。根据我们是否要排除或包括开始日期和/或结束日期,条件会有所不同,但一般来说,类似这样的模式可以获得重叠时间段的预订:

  WHERE b.datefrom <= '2016-01-19'
    AND b.dateto   >= '2016-01-13'
将返回例如从“2016-01-11”到“2016-01-19”的预订

获取完全在数据范围内但不包括之前或之后任何天数的预订

  WHERE b.datefrom >= '2016-01-13'
    AND b.dateto   <= '2016-01-19'

将返回例如从'2016-01-14'到'2016-01-15'的预订

以获得起始日期和截止日期与给定两个日期完全匹配的预订,假设datefrom和dateto列为日期数据类型,我们可以执行以下操作:

  WHERE b.datefrom = '2016-01-13' 
    AND b.dateto   = '2016-01-19'
请注意,这将只返回该确切时间段内的预订,不包括提前开始或晚结束但可能与该时间段内的天数重叠的客人预订

如果我们想找到在给定时间段内有一天或几天重叠预订的客人,那就有点复杂了。关于StackOverflow,已经回答了关于识别重叠的问题。根据我们是否要排除或包括开始日期和/或结束日期,条件会有所不同,但一般来说,类似这样的模式可以获得重叠时间段的预订:

  WHERE b.datefrom <= '2016-01-19'
    AND b.dateto   >= '2016-01-13'
将返回例如从“2016-01-11”到“2016-01-19”的预订

获取完全在数据范围内但不包括之前或之后任何天数的预订

  WHERE b.datefrom >= '2016-01-13'
    AND b.dateto   <= '2016-01-19'

将返回例如从'2016-01-14'到'2016-01-15'的预订

检查WHERE子句,这不是一个合法的语法检查WHERE子句,这不是一个合法的语法@RiggsFoly:所以在第二个示例中,您甚至不必使用dateTo?O woops I boobed,忽略这一点:所以我甚至不需要写日期“2016-01-19”?不,只要格式为YYYY MM DDif DATEFORM和dateTo是日期数据类型,就只需要一个正确格式的日期作为引用文字,然后我们可以引用裸列,没有必要在DATE函数中包装这些列。@RiggsFoly:因此,在第二个函数中,您甚至不必使用dateTo?O woops I boobed,忽略这一点:所以我甚至不需要写日期“2016-01-19”?不,只要格式为YYYY MM DDif DATEFORM和dateTo是日期数据类型,就只需要一个正确格式的日期作为引用文字,然后我们可以引用裸列,没有必要在DATE函数中包装这些列。因此我甚至不需要写DATE'2016-01-19'?在MySQL中,写DATE'2016-01-19'是有效的,但不需要,因为数据类型转换是隐式的,所以不需要在DATE函数中包装日期文字。如果文本包含一个时间部分,并且我们想要截断它,我们可以写日期'2016-01-19 09:30:00'来返回日期部分,就像我们写了'2016-01-19 00:00:00'。所以我甚至不需要写日期'2016-01-19'?在MySQL中,写日期'2016-01-19'是有效的,但不是,由于数据类型转换是隐式的,因此不需要在date函数中包装日期文字。如果文本包含一个时间部分,我们想截断它,我们可以写日期'2016-01-19 09:30:00',只返回日期部分,就好像我们写了“2016-01-19 00:00:00”。除了你真的不需要做日期“2016-01-13”等,因为它是MySQL的有效日期格式,除了你真的不需要做日期“2016-01-13”等,因为它是MySQL的有效日期格式