我正在处理Rails和Postgres中的日期和时间并遇到这个问题:
数据库采用UTC格式.
用户在Rails应用程序中设置选择的时区,但仅在获取用户本地时间来比较时间时使用.
用户存储时间,例如2012年3月17日晚上7点.我不希望存储时区转换或时区.我只想保存日期和时间.这样,如果用户改变他们的时区,它仍将显示2012年3月17日,晚上7点.
我只使用用户指定的时区来获取用户本地时区当前时间之前或之后的记录.
我目前正在使用"没有时区的时间戳",但是当我检索记录时,rails(?)会将它们转换为应用程序中的时区,这是我不想要的.
Appointment.first.time
=> Fri, 02 Mar 2012 19:00:00 UTC +00:00
Run Code Online (Sandbox Code Playgroud)
因为数据库中的记录似乎是以UTC形式出现的,我的黑客是用当前时间,用'Date.strptime(str,"%m /%d /%Y")删除时区,然后做我的查询:
.where("time >= ?", date_start)
Run Code Online (Sandbox Code Playgroud)
似乎必须有一种更简单的方法来忽略周围的时区.有任何想法吗?
我有一张这样的桌子
Movie Actor
A 1
A 2
A 3
B 4
Run Code Online (Sandbox Code Playgroud)
我想得到一部电影的名称和该电影中的所有演员,我希望结果是这样的格式:
Movie ActorList
A 1, 2, 3
Run Code Online (Sandbox Code Playgroud)
我该怎么做?
我正在尝试使用row_to_json()
PostgreSQL 9.2中添加的函数将查询结果映射到JSON .
我无法找出将连接行表示为嵌套对象的最佳方法(1:1关系)
这是我尝试过的(设置代码:表格,示例数据,然后是查询):
-- some test tables to start out with:
create table role_duties (
id serial primary key,
name varchar
);
create table user_roles (
id serial primary key,
name varchar,
description varchar,
duty_id int, foreign key (duty_id) references role_duties(id)
);
create table users (
id serial primary key,
name varchar,
email varchar,
user_role_id int, foreign key (user_role_id) references user_roles(id)
);
DO $$
DECLARE duty_id int;
DECLARE role_id int;
begin
insert into role_duties (name) values …
Run Code Online (Sandbox Code Playgroud) 对于我的问题,我们有一个架构,其中一张照片有很多标签和许多评论.因此,如果我有一个查询,我想要所有的注释和标记,它会将行相乘.因此,如果一张照片有2个标签和13条评论,我会为这张照片获得26行:
SELECT
tag.name,
comment.comment_id
FROM
photo
LEFT OUTER JOIN comment ON comment.photo_id = photo.photo_id
LEFT OUTER JOIN photo_tag ON photo_tag.photo_id = photo.photo_id
LEFT OUTER JOIN tag ON photo_tag.tag_id = tag.tag_id
Run Code Online (Sandbox Code Playgroud)
这对大多数事情来说都很好,但这意味着如果我GROUP BY
和那时json_agg(tag.*)
,我得到第一个标签的13个副本和第二个标签的13个副本.
SELECT json_agg(tag.name) as tags
FROM
photo
LEFT OUTER JOIN comment ON comment.photo_id = photo.photo_id
LEFT OUTER JOIN photo_tag ON photo_tag.photo_id = photo.photo_id
LEFT OUTER JOIN tag ON photo_tag.tag_id = tag.tag_id
GROUP BY photo.photo_id
Run Code Online (Sandbox Code Playgroud)
相反,我想要一个只有'郊区'和'城市'的数组,如下所示:
[
{"tag_id":1,"name":"suburban"},
{"tag_id":2,"name":"city"}
]
Run Code Online (Sandbox Code Playgroud)
我可以json_agg(DISTINCT tag.name)
,但是当我想要整个行作为json时,这只会产生一个标签名称数组.我想json_agg(DISTINCT ON(tag.name) …
我在数据库中有日期和时间字段.我希望通过连接日期和时间来获得时间戳.如何在PostgreSQL中执行此操作?
我这样做了:
SELECT EXTRACT(EPOCH FROM TIMESTAMP '2011-05-17 10:40:28');
Run Code Online (Sandbox Code Playgroud)
它工作正常.
但是当我尝试替换日期和时间字段时,我收到以下错误:
SELECT EXTRACT(EPOCH FROM TIMESTAMP Day || ' ' || Time);
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)ERROR: syntax error at or near "Day" LINE 1: ...quest_count > 0 AND (EXTRACT(EPOCH FROM TIMESTAMP Day || ' ' || Time)) > (e...
我有2张桌子:
table "person" with columns: person_id, person_name
table "pet" with columns: pet_id, owner_id, pet_name
person data:
1, 'John'
2, 'Jill'
3, 'Mary'
pet data:
1, 1, 'Fluffy'
2, 1, 'Buster'
3, 2, 'Doggy'
Run Code Online (Sandbox Code Playgroud)
如何写SELECT查询语句从person
左连接pet
上person_id = owner_id
具有聚合函数,所以我的结果数据的样子:
1,[{pet_id:1,pet_name:'Fluffy'},{pet_id:2,pet_name:'Buster'}],'John'
2,[{pet_id:3,pet_name:'Doggy'}],'Jill'
3,[],'Mary'
Run Code Online (Sandbox Code Playgroud) 在PostgreSQL中,这个ROW()
函数是干什么用的?
具体有什么区别
SELECT ROW(t.f1, t.f2, 42) FROM t;
Run Code Online (Sandbox Code Playgroud)
其中f1
is of type int
, f2
is of typetext
和
CREATE TYPE myrowtype AS (f1 int, f2 text, f3 numeric);
Run Code Online (Sandbox Code Playgroud) 我是PG的新手,并尝试从MSSQL转换.
我正在开发一个将返回JSON结果的函数.这个工作:
Create Or Replace Function ExampleTable_SelectList()
Returns JSON As
$$
Select array_to_json(array_agg(row_to_json(t))) From
(Select id, value1, value2, From ExampleTable) t
$$ Language SQL;
Run Code Online (Sandbox Code Playgroud)
现在,我想调用可以更新的返回值并将该值转换为JSON以返回.所以,这个给出了set
命令的错误.
Create Or Replace Function ExampleTable_Update (id bigint, value1 text)
Returns JSON As
$$
Select row_to_json(t) From
(
Update ExampleTable
Set Value1 = value1
Where id= id
Returning Value1, Value2;
) t
$$ Language SQL;
Run Code Online (Sandbox Code Playgroud)
我怀疑Postgres不允许将该UPDATE
语句作为子查询.那还有吗?
我希望我的查询返回这样结构的结果,其中tags
是数组或类似数组:
id | name | tags
1 a [[1, "name1", "color1"], [2, "name2", color2"]]
2 b [[1, "name1", "color1"), (3, "name3", color3"]]
Run Code Online (Sandbox Code Playgroud)
我希望这个查询可以工作,但它给了我一个错误:
SELECT i.id, i.name, array_agg(t.tag_ids, t.tag_names, t.tag_colors) as tags
FROM ITEMS
LEFT OUTER JOIN (
SELECT trm.target_record_id
, array_agg(tag_id) as tag_ids
, array_agg(t.tag_name) as tag_names
, array_agg(t.tag_color) as tag_colors
FROM tags_record_maps trm
INNER JOIN tags t on t.id = trm.tag_id
GROUP BY trm.target_record_id
) t on t.target_record_id = i.id;
Run Code Online (Sandbox Code Playgroud)
错误:
Run Code Online (Sandbox Code Playgroud)PG::UndefinedFunction: ERROR: function array_agg(integer[], character varying[], …
我有一个这样的餐桌员工
name value
'e1' 'rahul'
'e2' 'priya'
'e3' 'abhijit'
Run Code Online (Sandbox Code Playgroud)
我需要从两列中提取json,结果是这样的
{'e1':'rahul','e2':'priya','e3':'abhijit'}
Run Code Online (Sandbox Code Playgroud)
我尝试了以下查询,结果如下
select row_to_json((name,value)) from employee
O/P
{'f1':'e1','f2':'rahul'}
{'f2':'e1','f2':'priya'}
{'f3':'e1','f2':'abhijit'}
Run Code Online (Sandbox Code Playgroud)
我不想要那里的 f1 和 f2 名称,请指教!