我有下表:
+-----------+-----------+------------+----------+
| id | user_id | start_date | end_date |
| (integer) | (integer) | (date) | (date) |
+-----------+-----------+------------+----------+
Run Code Online (Sandbox Code Playgroud)
字段start_date并end_date保持日期值,如YYYY-MM-DD.
此表中的条目如下所示:(1, 120, 2012-04-09, 2012-04-13).
我必须编写一个查询,可以获取匹配特定时间段的所有结果.
问题是,如果我想从获取的结果2012-01-01来2012-04-12,我得到0的结果即使是一个条目start_date = "2012-04-09"和end_date = "2012-04-13".
它是否正确?
SELECT *
FROM contract
JOIN team USING (name_team)
JOIN player USING(name_player)
WHERE name_team = ?
AND DATE_PART('YEAR',date_join)>= ?
AND DATE_PART('YEAR',date_leave)<= ?
Run Code Online (Sandbox Code Playgroud)
我的桌子上contract有球员姓名,球队名称以及他加入和离开俱乐部的日期.
我想制作一个功能,列出特定年份团队中的所有玩家.
上面的查询似乎没有工作......
我在RoR堆栈中,我必须编写一些实际的SQL来完成所有"打开"记录的查询,这意味着当前时间在指定的操作时间内.在hours_of_operations表中有两integer列opens_on并closes_on存储一个工作日,以及两个time字段opens_at并closes_at存储当天的相应时间.
我做了一个查询,将当前日期和时间与存储的值进行比较,但我想知道是否有一种方法可以转换为某种日期类型并让PostgreSQL完成剩下的工作?
查询的内容是:
WHERE (
(
/* Opens in Future */
(opens_on > 5 OR (opens_on = 5 AND opens_at::time > '2014-03-01 00:27:25.851655'))
AND (
(closes_on < opens_on AND closes_on > 5)
OR ((closes_on = opens_on)
AND (closes_at::time < opens_at::time AND closes_at::time > '2014-03-01 00:27:25.851655'))
OR ((closes_on = 5)
AND (closes_at::time > '2014-03-01 00:27:25.851655' AND closes_at::time < opens_at::time)))
OR
/* Opens in Past */
(opens_on < …Run Code Online (Sandbox Code Playgroud) 我正在创建一个在PostgreSQL 9.2.4中存储任意日期/时间范围的数据库.我想在这个数据库上设置一个约束,它强制日期/时间范围不重叠,不相邻(因为两个相邻的范围可以表示为单个连续范围).
为此,我使用EXCLUDE带有GiST索引的约束.这是我目前的约束:
ADD CONSTRAINT overlap_exclude EXCLUDE USING GIST (
box(
point (
extract(EPOCH FROM "from") - 1,
extract(EPOCH FROM "from") - 1
),
point (
extract(EPOCH FROM "to"),
extract(EPOCH FROM "to")
)
) WITH &&
);
Run Code Online (Sandbox Code Playgroud)
列from和to都是TIMESTAMP WITHOUT TIME ZONE,并且是以UTC格式存储的日期/时间(在我的应用程序中将数据插入这些列之前,我转换为UTC,并且我在postgresql.conf中将我的数据库的时区设置为"UTC").
但是,我想我可能遇到的问题是,这个约束正在做出(错误的)假设,即没有小于一秒的时间增量.
值得注意的是,对于我存储的特定数据,我只需要第二个分辨率.不过,我觉得我可能还是需要处理这个,因为SQL类型timestamp和timestamptz都超过一秒更高的分辨率.
我的问题是:是否有任何问题,只是假设第二个解决方案,因为这是我的所有应用程序需要(或想要),或者,如果有,我怎么能改变这个约束来处理一个秒的分数健壮的方式?
postgresql ×4
sql ×4
overlap ×2
range-types ×2
constraints ×1
date ×1
date-range ×1
datetime ×1