来自地狱

时间:2018-03-07 15:23:01

标签: sql postgresql

此查询需要返回价格表中与特定日期列表匹配的行的所有列。日期列表的要求在下面的伪查询中的()之间。

这里的问题是如何建立日期列表。

这个要求超出了我目前对SQL的理解,但希望我可以从你的回答中学习。

-- Given two tables, price_tbl (column price_date) and holiday_tbl (column holiday_date):

select * from price_tbl where price_date in 
  ( 1. Last business  day of every Month from current_date - 30 months to 24 months later  -- (total of 24 months)
    2. Last business  day of every Week  from last date of '1.' to 24 weeks later          -- (total of 24 weeks)
    3. Every business day from last date of '2.' to current_date                           -- (variable number of days - approx 3 to 33 days possible)
  )
 order by price_date;

注意:

  • 对于' 1。'和' 2。' holiday_tbl中的任何工作日必须是 替换为不在holiday_tbl中的最近的前一个工作日。

  • 对于' 3。' holiday_tbl中的任何日期都被排除在外。

  • 可以假设没有填补的连续假期 整整一周。

我有一个Excel表格,其中包含如上所述的日期模式。 FWIW,这里列出了公式,以防他们提供帮助:

--
-- Excel formulas that match the above:
--  
-- First Month    (in cell B3)     :  =IF(WEEKDAY(EOMONTH(TODAY(),-30),2)>5,WORKDAY(EOMONTH(TODAY(),-24),-1,'PubHol'!$B$5:$B$54),EOMONTH(TODAY(),-30))
-- Next 23 months (in cell B4:B26) :  =IF(WEEKDAY(EOMONTH($B3,1),2)>5,WORKDAY(EOMONTH($B3,1),-1,'PubHol'!$B$5:$B$54),EOMONTH($B3,1))
-- First Week     (in cell B27)    :  =IF(WEEKDAY($B26,2)=5,$B26+7,WORKDAY($B26+(6-WEEKDAY($B26,2)),-1,'PubHol'!$B$5:$B$54))
-- Next 23 weeks  (in cell B28:B50):  =WORKDAY($B27+9,-1,'PubHol'!$B$5:$B$54)
-- All following days              :  =WORKDAY($B50,1,'PublHol'!$B$5:$B$54)
--

1 个答案:

答案 0 :(得分:0)

使用Postgresql query between date ranges上建议的SQL查询。 大多数语言都有日期API。使用它根据提供的输入生成精确的日期。

输入(周/日/月) - >将其转换为确切日期 - >创建一个获取此日期并触发查询的函数。

另外,您可以使用Postgres数据库的日期/时间功能
https://www.postgresql.org/docs/current/static/functions-datetime.html