特定时间段的SQL查询

时间:2018-05-01 17:24:32

标签: sql postgresql

我对SQL完全陌生,想要运行查询,我希望从9月16日到3月17日获得收入 。我试图写这样的查询:

SELECT revenue 
  FROM myapp_financialdata
 WHERE financial_year  = 2016 
   AND financial_month = 9
   AND financial_year  = 2017
   AND financial_month = 3

我知道我做错了。任何人都可以帮我一些查询,我不仅可以动态使用上述期间,还可以使用从1月17日到6月17日这样的内容吗?

更新

以下是表格的截图:

enter image description here

4 个答案:

答案 0 :(得分:3)

我们假设您的日期列名为'financial_date',以下是您的查询应该如何:

SELECT revenue,financial_date  FROM myapp_financialdata
WHERE financial_date between '2016-09-01' and '2017-03-31'

(BETWEEN PostgreSQL)参考:http://www.postgresqltutorial.com/postgresql-between/

答案 1 :(得分:3)

正如其他人所建议的那样,通常的答案是使用BETWEEN运算符 - postgresql对日期和时间的支持非常彻底,并且适用于大多数情况。

该查询看起来像:

SELECT revenue FROM myapp_financialdata
  WHERE financialdate BETWEEN '2016-09-01' AND '2017-03-01';

并返回与这些日期匹配的所有行。如果您想获得一个号码(比如总收入),那么您可以使用SELECT sum(revenue) FROM ...

但如果您的表格确实将年份和月份保留在不同的列中,则会更复杂。

如果两个日期都在同一年,那就相当简单了:

SELECT sum(revenue) FROM myapp_financialdata
  WHERE
    financial_year = 2017
    AND (financial_month BETWEEN 1 AND 6);

2017年1月至6月为您提供所有内容。

如果这段时间跨越两年,看起来像是:

SELECT sum(revenue) from myapp_financialdata
  WHERE
    (financial_year = 2016 AND
     financial_month >= 9)
    OR
    (financial_year = 2017 AND
     financial_month <= 3);

正如您所看到的,这比单个date列更复杂。如果你想要跨越几年,它会变得更复杂一些:

SELECT sum(revenue) from myapp_financialdata
  WHERE
    (financial_year = 2012 AND
     financial_month >= 4)
    OR
    (financial_year BETWEEN 2013 AND 2016)
    OR
    (financial_year = 2017 AND
     financial_month <= 6);

获得了2012年4月到2017年6月之间的总收入。

希望有所帮助。

答案 2 :(得分:2)

如果年份和月份分为两列,您可以写:

select revenue
  from myapp_financialdata
  where (financial_year = 2016 and financial_month >= 9)
     or (financial_year = 2017 and financial_month <= 3);

如果年份和月份在单个日期列中,您可以写:

select revenue
  from myapp_financialdata
  where financial_date between '2016-09-01' and '2017-03-31';

答案 3 :(得分:1)

试试这个:

SELECT revenue 
  FROM myapp_financialdata
 WHERE to_date(to_char(financial_year)||to_char(financial_month),'RRRRMM') BETWEEN to_date('2016-09-01','RRRR-MM-DD') AND to_date('2017-03-31','RRRR-MM-DD')