首页 > 解决方案 > SQL - 选择查询不显示所有日期

问题描述

我有一个表格,其中包含开始日期、结束日期以及根据开始日期和结束日期的支付周期信息。当我尝试查找具有日期范围的支付期信息时,结果中没有显示第一个支付期信息。

例如,当我运行以下查询时:

select *
FROM PayPeriod
where start_date between '2020-12-01' and '2020-12-21' 

我应该看到以下结果:

Start_date  End_date    Pay_perild
2020-11-22  2020-12-05  2020-12-wk1
2020-12-06  2020-12-19  2020-12-wk3
2020-12-20  2021-01-02  2021-01-wk1

相反,我得到:

Start_date  End_date    Pay_period
2020-12-06  2020-12-19  2020-12-wk3
2020-12-20  2021-01-02  2021-01-wk1

省略包含“2020-12-01”的日期范围和支付期间。为什么不显示,我该如何纠正?

标签: sqlsql-server

解决方案


看来我已经得到你想要的了。您需要相交两个时间间隔。

要找到两个表的相交区间(比如TableATableB,我使用表作为更一般的情况来通过它们的含义/角色/其他来区分两个区间),您需要比较两个表的一个表的开始日期和另一个表的结束日期(把每个其中“一个”和“另一个”角色):

TableA.start_date < TableB.end_date
and TableB.start_date < TableA.end_date

这是您的间隔是连续的情况的规则,例如end_date,一个时期是另一个时期的“恰好之前”(如实数)start_dare(因此间隔中的所有项目都将具有start_date <= item_date < end_date)。对于离散间隔(如天,其中一天的持续时间将具有相同的start_date和值end_date),将<=处于交叉状态。

所以,你的查询看起来像

DECLARE @period_from date = CONVERT ('2020-12-01' 23),
  @period_to date = CONVERT ('2020-12-21', 23);

select *
FROM PayPeriod
where start_date < @period_to /*or <= depending on inclusion of end_date*/
  and @period_from < end_date /*or <= depending on inclusion of end_date*/

推荐阅读