我正在尝试从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。谢谢!
答案 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日');