标签: postgresql

季度的通用结束日期,PostgreSQL

我想生成给定日期的通用季度结束日期。

例如:如果我有2010-01-01,我想返回2010-03-31,等等。

我可以得到季度号和年份:

select to_char(date_trunc('quarter',  current_date)::date, 'yyyy-q');
Run Code Online (Sandbox Code Playgroud)

2017-3从今天起返回的是2017-07-14

我如何很好地获得季度结束日期?

我可以得到答案,但它非常丑陋:

select to_char(date_trunc('year',  date '2015-01-01'),'yyyy') || '-' ||case
    when (select extract('quarter' from date_trunc('quarter', date '2015-01-01')::date )) = 1 then '03-31'
    when (select extract('quarter' from date_trunc('quarter', date '2015-01-01')::date )) = 2 then '06-30'
    when (select extract('quarter' from date_trunc('quarter', date '2015-01-01')::date )) = 3 then '09-30'
    when (select extract('quarter' from date_trunc('quarter', date '2015-01-01')::date )) = 4 then '12-31'
    else '?'
    end 
Run Code Online (Sandbox Code Playgroud)

返回2015-03-31因为我把2015-01-01

有没有更好的办法?

postgresql functions date interval

7
推荐指数
1
解决办法
8356
查看次数

如何列出 postgreSQL 中可用的所有可用编码类型?

SELECT datname, pg_encoding_to_char(encoding) 
FROM pg_database;
Run Code Online (Sandbox Code Playgroud)

...列出所有数据库,每个数据库都有其编码类型。

但是,我试图找出PostgreSQL 服务器中可用的所有编码类型。我可以查询所有可用的编码类型吗?

还是在第 23.3 章字符集支持中列出了唯一可用的编码类型?

postgresql character-set encoding unicode

7
推荐指数
1
解决办法
3129
查看次数

为什么 PostgreSQL 9.5 不使用我最新的 ORDER BY 索引,即使它使用类似的索引就好了?

(这篇文章的后续内容:当我在子查询中 ORDER BY 时,为什么我的 PostgreSQL 表达式索引没有被使用?

PostgreSQL 9.5。

我不能透露全部细节,但table有 22 列和 5 个索引:

  1. 主键 ('pk'), text(btree)
  2. 另一个text(btree)
  3. 一个timestamp with time zone(btree)
  4. 一个tsvector(杜松子酒)
  5. 我最新的一个bigint(btree)

(从上一篇文章你知道我试图避免创建这个额外的列,只是使用表达式索引——将两integer列加在一起——没有成功。bigint这里的列可能只是“整数”,但我做了一个创建它时出错;添加列、填充它并重新编制索引花了大约一个小时,所以我希望这不相关,但要提及它以防万一。)

除了tsvector.

以下查询都只需要 12ms 并且只使用一个Index Scan

  1. SELECT pk FROM table ORDER BY pk DESC LIMIT 10
  2. SELECT pk FROM table ORDER BY text_column DESC LIMIT 10
  3. SELECT pk FROM table ORDER BY timestamp_column DESC LIMIT 10 …

postgresql performance index optimization postgresql-9.5 postgresql-performance

7
推荐指数
1
解决办法
382
查看次数

在已打开的事务中是否仍然可以使用已删除(或更改)的功能?

我发现

但是没有答案并且与我的问题不完全相同(尽管非常相似)。


假设我执行以下操作:

  1. 创建函数 myfunc()
  2. 从客户端 A 开始事务
  3. 从客户端 B 开始事务
  4. 在事务B中,使用“创建或替换功能”修改定义 myfunc()
  5. 提交事务 B
  6. myfunc()从事务 A调用

第 6 步会发生什么? 我是否调用了步骤 1 中定义的原始函数?还是第 4 步中的修改形式(在第 5 步中提交)?


如果函数在第 4 步中被删除而不是被修改,那么第 6 步会失败还是成功?(这可能是同一个问题,但修改的工作方式可能不同。)


关于这个的文档在哪里?

postgresql locked-objects transaction functions

7
推荐指数
2
解决办法
206
查看次数

使用默认关键字插入多行时,PostgreSQL 10 标识列获得“空值”

我最近从 PostgreSQL 9.5 升级到 PostgreSQL 10。PostgreSQL 10 中的一个漂亮特性是新的标识列类型,它是 PostgreSQL串行伪类型的替代品。身份栏的官方文档可以在CREATE TABLE一页中找到。

但是,当将多行插入到带有GENERATED BY DEFAULT AS IDENTITY列的表中使用关键字DEFAULT获取下一个 ID 值时,默认值返回为null.

例如,假设我有一张桌子

CREATE TABLE test (
  id int GENERATED BY DEFAULT AS IDENTITY,
  t text
);
CREATE TABLE
Run Code Online (Sandbox Code Playgroud)

使用DEFAULT关键字插入单行似乎工作正常。

INSERT INTO test (id, t) VALUES (DEFAULT, 'a');
INSERT 0 1
Run Code Online (Sandbox Code Playgroud)

插入多行不会。

INSERT INTO test (id, t) VALUES (DEFAULT, 'b'), (DEFAULT, 'c');
ERROR:  null value in column "id" violates …
Run Code Online (Sandbox Code Playgroud)

postgresql identity postgresql-10

7
推荐指数
1
解决办法
1987
查看次数

在普通 SQL 中访问触发器函数中的旧/新表值

我正在尝试构建一个触发器函数,以便在任何项目发生更改时自动更新父订单值。

这是我创建的:

CREATE OR REPLACE FUNCTION update_totals() RETURNS void AS $$
    UPDATE orders SET
       total_fees = (SELECT SUM(fees) FROM order_items WHERE order_id = OLD.order_id),
       total_profit = (CASE WHEN total_cost IS NOT NULL THEN total - total_tax - total_cost - (SELECT SUM(fees) FROM order_items WHERE order_id = OLD.order_id) ELSE NULL END)
    WHERE id = OLD.order_id;
$$
LANGUAGE SQL;

CREATE TRIGGER update_totals AFTER INSERT 
OR UPDATE OF fees
ON order_items INITIALLY DEFERRED
FOR EACH ROW
WHEN ( OLD.* IS DISTINCT FROM NEW.* …
Run Code Online (Sandbox Code Playgroud)

postgresql functions postgresql-9.6

7
推荐指数
1
解决办法
2万
查看次数

在 CentOS 上更改 postgres 的数据目录

我在 CentOS 上安装了 postgres 9.2.18,它使用标准安装路径。现在我意识到在这个特定的分区上,没有足够的硬盘空间来进行一些更大的查询。

默认的 data_directory 位于:

/var/lib/pgsql/data


$ df -h /var/lib/pgsql
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   50G   39G   12G  77% /
Run Code Online (Sandbox Code Playgroud)

所以,我想将数据目录移动到我的主存储库(它是一个仅供我自己使用的测试数据库)

$ df -h /home/mlu
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-home  395G  171G  224G  44% /home
Run Code Online (Sandbox Code Playgroud)

为此,我尝试过:

1) Copying postgres data using rsync:    
sudo rsync -av /var/lib/pgsql /home/mlu/postgres-data

2) Addressing the new path within postgresql.conf:
sudo -u postgres nano /var/lib/pgsql/data/postgresql.conf
  data_directory = '/home/mlu/postgres-data/pgsql/'

3) starting postgres:
sudo systemctl start postgresql
Run Code Online (Sandbox Code Playgroud)

由于 postgresql.conf …

postgresql centos

7
推荐指数
1
解决办法
2万
查看次数

在 Windows 10 上连接 postgresql 的时间很慢

在我的 Win 10 机器上连接到 postgresql 的时间慢得难以置信。连接需要 2.5-3.5 秒。

$ time 'c:/Program Files/PostgreSQL/10/bin/psql.exe' -h 127.0.0.1 -p 5433 -U xxx -c 'select true'
 bool
------
 t
(1 row)


real    0m3.416s
user    0m0.015s
sys     0m0.000s
Run Code Online (Sandbox Code Playgroud)

我尝试使用 psycopg2 python 驱动程序的同时。postgresql 版本 9 和 10 的时间相同。另一方面,连接到 mysql 的时间为 0.002,仅与 postgresql 相关。

在此处输入图片说明

这里有来自 postgresql 的 max debug 的相关日志

2018-03-19 21:24:43.654 +03 [10048] DEBUG:  00000: forked new backend, pid=21268 socket=5072
2018-03-19 21:24:43.654 +03 [10048] LOCATION:  BackendStartup, postmaster.c:4099
2018-03-19 21:24:45.248 +03 [21268] LOG:  00000: connection received: host=127.0.0.1 port=9897 …
Run Code Online (Sandbox Code Playgroud)

postgresql performance windows postgresql-performance

7
推荐指数
2
解决办法
3363
查看次数

postgres 程序的测试驱动设计

我希望引入一种测试驱动的设计风格来为 postgresql 数据库实现编写我的存储过程。

我已经看到pgTap是一个流行的 postgres 单元测试工具,并且正确地允许测试用 SQL 编写,而不是在外部构建和运行。

为了走得更远,我还希望能够使用测试替身(存根、模拟、假、虚拟),甚至可能使用一些 IDE 支持运行和重构(类似于tsql

当前是否有专门用于在 postgres 中支持 TDD 的工具和资源,或者人们是否通过构建假表和数据并将所有内容包装在完成时回滚的事务中来推出自己的工具和资源?

目前在 postgres 中接近 TDD 的最佳实践是什么?

postgresql unit-test design-pattern

7
推荐指数
1
解决办法
990
查看次数

为什么 information_schema 有“YES”和“NO”字符串而不是布尔值?

我惊讶地发现is_nullable此查询的列被键入character varying (3)而不是boolean

select
    column_name,
    data_type,
    is_nullable
from
    information_schema.columns
where
    table_schema = 'public';
Run Code Online (Sandbox Code Playgroud)

我注意到其他一些列也使用“是”/“否”。这样做的理由是什么?我最初的想法是,也许除了 "YES" 和 "NO" 之外的其他值也是可能的,证明 a 以外的其他值是合理的boolean,但我在当前的数据库中没有看到任何这样的例子。

postgresql information-schema sql-standard

7
推荐指数
1
解决办法
1409
查看次数