根据名称动态选择列来过滤行

时间:2019-07-18 20:18:04

标签: sqlite

我有一个GTFS数据库。我想查询calendar表。

该表具有以下列:

service_id | monday | tuesday | wednesday | thursday | friday | saturday | sunday | start_date | end_date

1          | 0      | 0       | 1         | 0        | 1      | 0        | 0      | 20190317   | 20200101
...
...
...

我知道如何在开始日期和结束日期之间获取service_id,但是我不确定如何根据启用(1)或禁用( 0)在查询发生的当天。

预期结果将是start_date <= now >= end_date并且在当天启用的所有行。

示例:如果我今天(星期四)运行查询,它将不会返回我在示例中提供的行。但是,如果我明天(星期五)运行查询,它将返回示例中的行。

这可能吗? (我正在使用SQLite)

2 个答案:

答案 0 :(得分:1)

您只需添加几天的条件:

SELECT *
FROM t
WHERE service_id = ?
  AND ? BETWEEN start_date AND end_date
  AND (CASE 
      WHEN  strftime('%w', ?) = 1 AND monday = 1  THEN 1
      WHEN  strftime('%w', ?) = 2 AND tuesday = 1 THEN 1
      ...
      END) = 1

答案 1 :(得分:1)

使用strftime('%w', 'now'),您可以获得今天的工作日数字(0代表星期日,1代表星期一,...)。
因此,您可以使用如下CASE语句:

select * from tablename
where 1 = case strftime('%w', 'now')
  when 0 then sunday 
  when 1 then monday 
  when 2 then tuesday 
  when 3 then wednesday 
  when 4 then thursday 
  when 5 then friday 
  when 6 then saturday
end

您可以为开始日期和结束日期添加其他条件。