编写一个函数来仅在工作日的PostgreSQL中选择数据

时间:2013-03-04 20:56:34

标签: sql postgresql postgresql-8.3

我正在研究Postgres 8.3数据库。我使用的查询仅用于选择工作日中包含的行。现在我已经像下面的例子中那样手动完成了这个,但是我想将它转移到一些功能,我可以在这里使用开始和结束日期,并获得相同的逻辑以应用如下。那是

  

如何创建一个输入为开始日期和结束日期的函数,函数的结果将是选择仅包含在数据集工作日的所有行(我希望将每个星期六和星期日排除在where子句条件如下)?

create table filter_tbl as
select *
from base_tbl  where
(start_Time >= '2012-11-5' and start_Time < '2012-11-10')
or (start_time >= '2012-11-12' and start_time < '2012-11-17')
or (start_time >= '2012-11-19' and start_time < '2012-11-24')
or (start_time >= '2012-11-26' and start_time < '2012-12-01')
or (start_time >= '2012-12-03' and start_time < '2012-12-07')
or (start_time >= '2012-12-10' and start_time < '2012-12-14')
or (start_time >= '2012-12-17' and start_time < '2012-12-21')
or (start_time >= '2012-12-24' and start_time < '2012-12-28')
or (start_time >= '2012-12-31' and start_time < '2013-01-04')
or (start_time >= '2013-01-07' and start_time < '2013-01-11')
or (start_time >= '2013-01-14' and start_time < '2013-01-18')
or (start_time >= '2013-01-21' and start_time < '2013-01-25')
or (start_time >= '2013-01-28' and start_time < '2013-02-02')
or (start_time >= '2013-02-04' and start_time < '2013-02-09')
or (start_time >= '2013-02-11' and start_time < '2013-02-16')
or (start_time >= '2013-02-18' and start_time < '2013-02-23')
or (start_time >= '2013-02-25' and start_time < '2013-03-02')
or (start_time >= '2013-03-04' and start_time < '2013-03-09')
or (start_time >= '2013-03-11' and start_time < '2013-03-16');

5 个答案:

答案 0 :(得分:18)

根据您的示例,start_time似乎是文本。然后,您需要使用timestamp将其转换为to_timestamp,然后使用EXTRACT提取星期几。

您的WHERE条款将如下:

WHERE EXTRACT(dow FROM timestamp (to_timestamp(start_time, "YYYY-MM-DD"))
NOT IN (0,6)

链接:Data Type Formatting FunctionsDate/Time Functions and Operators

答案 1 :(得分:6)

select *
from base_tbl  
where extract(dow from start_time) in (1,2,3,4,5)

答案 2 :(得分:1)

检查datetime functions

e.g。

SELECT EXTRACT(DOW FROM TIMESTAMP '2001-02-16 20:38:40');

返回5,代表Friday

答案 3 :(得分:1)

以下内容应该返回星期几。

date_part('dow', Date);

使用默认设置0是星期日,6是星期六

答案 4 :(得分:1)

select to_char(date, 'Day') from table