获取PostGreSql中之前1个月或2个月的所有日期

时间:2013-07-04 03:08:17

标签: postgresql reporting-services postgresql-9.1

我正在尝试从DB表(adempiere)字段“dateinvoice”中提取前一个或两个月的所有日期

例如,如果目前是2012年1月6日

我想提取2011年12月1日至2011年12月31日(前1个月)或2011年11月1日至2011年12月31日(前2个月)的所有数据

我已经看到使用DateAdd的一些答案,我最近了解到,因为我使用PostGreSQL,DateAdd函数不起作用。

有什么想法吗?谢谢一群人

我正在使用PostgreSQL 9.1。

更新 我跟着Craigs推荐并使用SQLFiddle,我第一次使用它,所以请原谅我,如果我做任何booboos

链接在这里 http://sqlfiddle.com/#!1/1d5d4/1 http://sqlfiddle.com/#!1/1d5d4/3

即使将月份改为月份,我仍然会收到错误......

更新2号 我使用Visual Studio搜索所有这些查询。而Craigs推荐确实有效。我在查询设计器中遇到错误,但是当我编辑为文本时。似乎没有问题。

我不确定是否因查询设计器而出现此错误。但是Craig的查询确实有效..我认为生病只是坚持文本,而不是Visual Studio为此问题提供的GUI。谢谢!

3 个答案:

答案 0 :(得分:2)

你可能想要这样的东西:

SELECT *
FROM the_table
WHERE date_column BETWEEN '2013-01-01' AND '2013-01-01' + INTERVAL '1' MONTH;

BETWEEN运算符是左右包含的。如果您想要权利排他,则必须使用单独的>=<测试。

顺便说一下,除了ANSI标准SQL的date_trunc函数之外,它只是Microsoft SQL Server doesn't implement the ANSI interval types or ANSI date maths。以严格的ANSI标准方式执行此操作将要求您使用区间数学like this example of how to get the months I just cooked up in Oracle替换PostgreSQL特定的date_trunc。由于SQLFiddle for Oracle的限制,它基于样本数据的一个子集。

如果您想获得当月的开头,请使用date_trunc,例如:

SELECT date_trunc('2013-01-12');

将返回2013-01-01。这可以与INTERVAL计算和extract操作结合使用,以完成日期和时间所需的任何操作。

在这种情况下,我写的前一个月:

SELECT *
FROM the_table
WHERE date_field BETWEEN date_trunc('month',current_date) - INTERVAL '2' MONTH 
                     AND (date_trunc('month',current_date) - INTERVAL '1' MONTH) - INTERVAL  '1' DAY;

(如果您使用的是时间戳而不是日期,则需要INTERVAL '1' SECOND而不是INTERVAL '1' DAY

您会注意到间隔减法的显式parens。这非常重要,因为约会是可怕的令人讨厌的事情。在日期计算中,(a + b) + c不一定与a + (b + c)相同。最近我被这个咬了,这很讨厌。

备用短语,如果你想要a <= x < b可能更干净:

SELECT *
FROM the_table
WHERE date_field >= date_trunc('month',current_date) - INTERVAL '2' MONTH
  AND date_field < date_trunc('month',current_date) - INTERVAL '1' MONTH;

答案 1 :(得分:0)

试试这个:

SELECT * from adempiere where dateinvoice >  CURRENT_DATE - INTERVAL '2 months'

答案 2 :(得分:0)

CREATE FUNCTION [dbo].[GetDates](@StartDate DATETIME, @EndDate DATETIME)
RETURNS TABLE AS
RETURN (
WITH 
 N0 AS (SELECT 1 AS N UNION ALL SELECT 1)
,N1 AS (SELECT 1 AS N FROM N0 T1, N0 T2)
,N2 AS (SELECT 1 AS N FROM N1 T1, N1 T2)
,N3 AS (SELECT 1 AS N FROM N2 T1, N2 T2)
,N4 AS (SELECT 1 AS N FROM N3 T1, N3 T2)
,N5 AS (SELECT 1 AS N FROM N4 T1, N4 T2)
,N6 AS (SELECT 1 AS N FROM N5 T1, N5 T2)
,NUMS AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS NUM FROM N6)
SELECT CAST(DATEADD(day,num-1,@StartDate) AS Date) as TheDate
FROM NUMS 
WHERE NUM <= DATEDIFF(day,@StartDate,@EndDate) + 1
);

执行SELECT * FROM dbo.GetDates('2011年12月1日','2011年12月31日');