计算每行数据库的 Biz 天数
Posted
技术标签:
【中文标题】计算每行数据库的 Biz 天数【英文标题】:Counting Biz days for each row of database 【发布时间】:2020-03-02 15:25:01 【问题描述】:我有一个表格,其中每一行都包含带有时间戳格式的开始和结束日期,需要按开始日期和结束日期之间的工作日数过滤它们。
根据此处发布的一些解决方案,我创建了一个包含所有日期的单独表,并用如下布尔字段标记它们:
CREATE TABLE tbl_holiday (h_date TIMESTAMP, is_holiday BOOLEAN)
是否可以编写一个查询,按 start_date 和 date_date 之间的天数进行过滤,其中 _is_holiday 为 False?
我的数据库是 Impala。
【问题讨论】:
为什么有一个名为 holiday 的表和一个名为“is holiday”的列?这不是给定的吗? 这是一个保存每个日期状态的表,无论是否是假期,在另一个表上,假设 tbl_main 我们有 start_date 和 end_date,每行的 start_date 和 end_date 之间的商务天数需要 tbl_main 好吧,您也可以将假期列在一个列表中,计算两个日期之间的天数并减去实际假期的数量(例如一些COUNT(*) FROM tbl_holiday WHERE h_date BETWEEN ...
)。然后,您的假期列表中就没有稀疏(大部分无用)的噪音。不是世界末日,但你本身并不需要它。
这是一个超级复杂的查询,我希望提出一个自定义函数,然后使用它来获取计数,而不是运行查询,但是,Impala 有不同的语法和方式它适用于 SQL Server 不起作用。
【参考方案1】:
您通常会将原始表与在开始日期和结束日期具有不平等条件的假期表连接起来,聚合,最后在 having
子句中根据您的目标值按工作日总和进行过滤:
select t.id, t.start_date, t.end_date
from mytable t
inner join tbl_holiday h on h.hdate between t.start_date and t.end_date
group by t.id, t.start_date, t.end_date
having sum(cast(is_holiday as int)) = :no_of_business_days
【讨论】:
谢谢@GMB,我收到一个错误:ParseException: Syntax error... 然后 0 ELSE 1 END, Encountered: : Expected CASE, CAST, DEFAULT, ... 我在 db 中有一个 id 字段,我还需要在 GROUP_BY 子句中使用 start_date 和 end_date 吗?用/wo试过,同样的错误 @MehdiZare:我更新了查询,请再试一次。 还是同样的错误,我也试过h.is_holiday IS TRUE @MehdiZare:我稍微改变了查询,如果你可以试试的话。 PS:你确定is_holiday
的数据类型是boolean
吗?以上是关于计算每行数据库的 Biz 天数的主要内容,如果未能解决你的问题,请参考以下文章
java,编写一个从1循环到150并在每行打印一个值,另外在每个3的倍数行上打印出foo,在每个5的倍数行上打印biz,在每个7的倍数上打印baz.