我想生成给定日期的通用季度结束日期。
例如:如果我有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。
有没有更好的办法?
SELECT datname, pg_encoding_to_char(encoding)
FROM pg_database;
Run Code Online (Sandbox Code Playgroud)
...列出所有数据库,每个数据库都有其编码类型。
但是,我试图找出PostgreSQL 服务器中可用的所有编码类型。我可以查询所有可用的编码类型吗?
还是在第 23.3 章字符集支持中列出了唯一可用的编码类型?
(这篇文章的后续内容:当我在子查询中 ORDER BY 时,为什么我的 PostgreSQL 表达式索引没有被使用?)
PostgreSQL 9.5。
我不能透露全部细节,但table有 22 列和 5 个索引:
text(btree)text(btree)timestamp with time zone(btree)tsvector(杜松子酒)bigint(btree)(从上一篇文章你知道我试图避免创建这个额外的列,只是使用表达式索引——将两integer列加在一起——没有成功。bigint这里的列可能只是“整数”,但我做了一个创建它时出错;添加列、填充它并重新编制索引花了大约一个小时,所以我希望这不相关,但要提及它以防万一。)
除了tsvector.
以下查询都只需要 12ms 并且只使用一个Index Scan:
SELECT pk FROM table ORDER BY pk DESC LIMIT 10SELECT pk FROM table ORDER BY text_column DESC LIMIT 10SELECT pk FROM table ORDER BY timestamp_column DESC LIMIT 10 …postgresql performance index optimization postgresql-9.5 postgresql-performance
我发现
但是没有答案并且与我的问题不完全相同(尽管非常相似)。
假设我执行以下操作:
myfunc()myfunc()myfunc()从事务 A调用第 6 步会发生什么? 我是否调用了步骤 1 中定义的原始函数?还是第 4 步中的修改形式(在第 5 步中提交)?
如果函数在第 4 步中被删除而不是被修改,那么第 6 步会失败还是成功?(这可能是同一个问题,但修改的工作方式可能不同。)
关于这个的文档在哪里?
我最近从 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) 我正在尝试构建一个触发器函数,以便在任何项目发生更改时自动更新父订单值。
这是我创建的:
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) 我在 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 …
在我的 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) 我惊讶地发现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 ×10
functions ×3
performance ×2
centos ×1
date ×1
encoding ×1
identity ×1
index ×1
interval ×1
optimization ×1
sql-standard ×1
transaction ×1
unicode ×1
unit-test ×1
windows ×1