确保开始和结束日期在选定范围内

时间:2015-11-25 19:36:21

标签: sql sql-server

我有以下SQL查询

null

如果我们要将SELECT users.username, users.first_name, users.last_name, users.description, sprints.sprint_start_date, sprints.sprint_end_date, users.user_id FROM sprints INNER JOIN sprints_vs_users ON sprints.sprint_id = sprints_vs_users.sprint_id RIGHT OUTER JOIN users ON sprints_vs_users.user_id = users.user_id WHERE (sprints.sprint_start_date BETWEEN CONVERT(datetime, @startdate, 103) AND CONVERT(datetime, @enddate, 103)) AND (sprints.sprint_end_date BETWEEN CONVERT(datetime, @startdate, 103) AND CONVERT(datetime, @enddate, 103)) 变量声明为@startdate并将26/11/2015变量声明为@enddate,并且我们使用03/12/2015 sprint_start_date的示例1 {}和27/11/2015的{​​{1}}

我希望sprint的sprint开始日期和结束日期出现在结果中,因为sprint日期在选定的变量日期期间出现。但是目前,查询没有显示此结果,我认为这是由sprint_end_date4/12/2015之间没有出现sprint_end_date但我不确定如何解决这个问题,所以任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

您现有的逻辑意味着查询仅返回冲刺,其中开始日期和结束日期落在两个变量定义的时间段内(即冲刺的整个持续时间都在该时间段内)。

听起来你实际想要的是返回冲刺,其中开始日期或结束日期落在定义的时间段内(即冲刺持续时间完全或部分在定义的时间段内)或冲刺开始和结束任何一方定义的时间段(即定义的时间段在冲刺持续时间内)。

如果是这样,您可以像这样修改您的查询:

SELECT        
    users.username, users.first_name, users.last_name, users.description, 
    sprints.sprint_start_date, sprints.sprint_end_date, users.user_id
FROM          
    sprints 
INNER JOIN 
    sprints_vs_users ON sprints.sprint_id = sprints_vs_users.sprint_id 
RIGHT OUTER JOIN 
    users ON sprints_vs_users.user_id = users.user_id
WHERE 
(    
    (sprints.sprint_start_date BETWEEN CONVERT(datetime, @startdate, 103) 
               AND CONVERT(datetime, @enddate, 103)) 
    OR 
    (sprints.sprint_end_date BETWEEN CONVERT(datetime, @startdate, 103) 
               AND CONVERT(datetime, @enddate, 103))
) 
OR
(
    (sprints.sprint_start_date <= CONVERT(datetime, @startdate, 103)) 
    AND
    (sprints.sprint_end_date >= CONVERT(datetime, @enddate, 103))
) 
相关问题