我有以下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_date
和4/12/2015
之间没有出现sprint_end_date
但我不确定如何解决这个问题,所以任何帮助将不胜感激。
答案 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))
)