sql - 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”的日期范围和支付期间。为什么不显示,我该如何纠正?
解决方案
看来我已经得到你想要的了。您需要相交两个时间间隔。
要找到两个表的相交区间(比如TableA
和TableB
,我使用表作为更一般的情况来通过它们的含义/角色/其他来区分两个区间),您需要比较两个表的一个表的开始日期和另一个表的结束日期(把每个其中“一个”和“另一个”角色):
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*/
推荐阅读
- rust - rust crate 功能是否需要单独安装?
- flutter - 如何构造 FCM 推送通知以在 Flutter(Android 和 iOS)的默认系统 Web 浏览器应用程序中打开指定的 URL
- encryption - 有没有办法在使用 JDBC 连接器写入 Kafka 主题之前加密数据?
- swift - 使用通用脚本进行框架构建时,Xcode 访问构建数据库时出错
- c++ - 为什么当我有头部保护时需要使用 extern?
- r - 如何对栅格 NA 值使用多种提取方法
- string - 为什么 string.match/find 没有找到所有大写字母?
- python - Python中的随机游走循环
- google-bigquery - Big Query 删除天数
- json - Powershell - 将内容注入 json 文件