use*_*196 4 postgresql reporting-services postgresql-9.1
我试图从数据库表 (adempiere) 字段“dateinvoice”中提取过去 1 或 2 个月的所有日期
例如,如果目前是 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,这是我第一次使用它,所以如果我犯了任何错误,请原谅
链接在这里 http://sqlfiddle.com/#!1/1d5d4/1 http://sqlfiddle.com/#!1/1d5d4/3
即使将月份更改为几个月后,我仍然收到错误......
更新编号 2 我使用 Visual Studio 来搜索所有这些查询。克雷格的建议确实有效。当我在查询设计器中时,但当我编辑为文本时,我一直收到错误。似乎没有问题。
我不确定这个错误是否是由于查询设计器引起的。但克雷格的查询确实有效。我认为我只是坚持文本而不是 Visual Studio 为这个问题提供的 GUI。谢谢!
您可能想要类似的东西:
SELECT *
FROM the_table
WHERE date_column BETWEEN '2013-01-01' AND '2013-01-01' + INTERVAL '1' MONTH;
Run Code Online (Sandbox Code Playgroud)
该BETWEEN运算符是左右包容的。如果您想要右排他性,则必须使用单独的>=和<测试来代替。
顺便说一句,除了date_truncANSI 标准 SQL 的函数之外,只是Microsoft SQL Server 没有实现 ANSI 间隔类型或 ANSI 日期数学。如果采用严格的 ANSI 标准方式,则需要用date_trunc区间数学替换 PostgreSQL 特定的内容,就像这个如何获取我刚刚在 Oracle 中编写的月份的示例。由于 SQLFiddle for Oracle 的限制,它基于示例数据的子集。
如果您想获取当前月份的开始时间,请使用date_trunc,例如:
SELECT date_trunc('2013-01-12');
Run Code Online (Sandbox Code Playgroud)
将返回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;
Run Code Online (Sandbox Code Playgroud)
(如果您使用时间戳而不是日期,则需要INTERVAL '1' SECOND代替)。INTERVAL '1' DAY
您会注意到间隔减法的显式括号。这非常重要,因为约会是一件非常讨厌的事情。在日期计算中,(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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20850 次 |
| 最近记录: |