我正在处理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)
似乎必须有一种更简单的方法来忽略周围的时区.有任何想法吗?
我想在PostgreSQL数据库中获取两个日期(包括它们)之间的日期列表.例如,如果我有:
那么结果应该是:
29 june 2012
30 june 2012
1 july 2012
2 july 2012
3 july 2012
Run Code Online (Sandbox Code Playgroud)
在PostgreSQL中执行此操作的最佳方法是什么?
谢谢.
Postgres可以使用date_trunc函数对时间戳进行舍入(截断),如下所示:
date_trunc('hour', val)
date_trunc('minute', val)
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种方法将时间戳截断到最近的5分钟边界,例如,14:26:57变为14:25:00.直截了当的方式是这样的:
date_trunc('hour', val) + date_part('minute', val)::int / 5 * interval '5 min'
Run Code Online (Sandbox Code Playgroud)
由于这是查询的性能关键部分,我想知道这是否是最快的解决方案,或者是否有一些我忽略的快捷方式(与Postgres 8.1+兼容).
我的数据库是Postgres 8.我需要将数据类型转换为另一个.这意味着,列数据类型之一是varchar并且需要int在SELECT语句中将其转换为Postgres .
目前,我获取字符串值并将其转换int为Java.
有什么办法吗?示例代码将受到高度赞赏.
我想将以下SQL代码从MS SQL-Server移植到PostgreSQL.
DECLARE @iStartYear integer
DECLARE @iStartMonth integer
DECLARE @iEndYear integer
DECLARE @iEndMonth integer
SET @iStartYear = 2012
SET @iStartMonth = 4
SET @iEndYear = 2016
SET @iEndMonth = 1
;WITH CTE
AS
(
SELECT
--@iStartYear AS TheStartYear
@iStartMonth AS TheRunningMonth
,@iStartYear AS TheYear
,@iStartMonth AS TheMonth
UNION ALL
SELECT
--CTE.TheStartYear AS TheStartYear
--@iStartYear AS TheStartYear
CTE.TheRunningMonth + 1 AS TheRunningMonth
--,CTE.TheStartYear + (CTE.TheRunningMonth / 12) AS TheYear
,@iStartYear + (CTE.TheRunningMonth / 12) AS TheYear
,(CTE.TheMonth + 1 -1) % …Run Code Online (Sandbox Code Playgroud) 我有不均匀分布的数据(wrt日期)几年(2003-2008).我想查询一组给定的开始和结束日期的数据,按PostgreSQL 8.3中任何支持的时间间隔(日,周,月,季,年)对数据进行分组(http://www.postgresql.org/docs /8.3/static/functions-datetime.html#FUNCTIONS-DATETIME-TRUNC).
问题是某些查询会在所需的时间段内提供连续的结果,如下所示:
select to_char(date_trunc('month',date), 'YYYY-MM-DD'),count(distinct post_id)
from some_table where category_id=1 and entity_id = 77 and entity2_id = 115
and date <= '2008-12-06' and date >= '2007-12-01' group by
date_trunc('month',date) order by date_trunc('month',date);
to_char | count
------------+-------
2007-12-01 | 64
2008-01-01 | 31
2008-02-01 | 14
2008-03-01 | 21
2008-04-01 | 28
2008-05-01 | 44
2008-06-01 | 100
2008-07-01 | 72
2008-08-01 | 91
2008-09-01 | 92
2008-10-01 | 79
2008-11-01 | 65
(12 rows)
Run Code Online (Sandbox Code Playgroud)
但有些人因为没有数据而错过了一些间隔,因为这个:
select …Run Code Online (Sandbox Code Playgroud) 我使用PostgreSQL 8.4.11并发现奇怪的错误.当我查询时:
SELECT "documents_document"."given_on"
FROM "documents_document"
WHERE (EXTRACT('month' FROM "documents_document"."given_on") = 1
AND "documents_document"."given_on"
BETWEEN '1-01-01 00:00:00' and '1-12-31 23:59:59.999999')
ORDER BY "documents_document"."created_on" DESC
Run Code Online (Sandbox Code Playgroud)
我得到了结果:
given_on
------------
2002-01-16
2011-01-25
2012-01-12
2012-01-12
2012-01-12
2012-01-20
2012-01-19
2012-01-13
2012-01-31
2012-01-16
2012-01-31
2012-01-12
...
Run Code Online (Sandbox Code Playgroud)
为什么?
我希望日期在1-01-01 ... 1-12-31.
我有一组电子邮件地址和日期,这些电子邮件地址已添加到表格中.对于不同的日期,可以有多个电子邮件地址条目.例如,如果我有下面的数据集.我希望得到我们在所述日期和3天前之间的不同电子邮件的日期和计数.
Date | email
-------+----------------
1/1/12 | test@test.com
1/1/12 | test1@test.com
1/1/12 | test2@test.com
1/2/12 | test1@test.com
1/2/12 | test2@test.com
1/3/12 | test@test.com
1/4/12 | test@test.com
1/5/12 | test@test.com
1/5/12 | test@test.com
1/6/12 | test@test.com
1/6/12 | test@test.com
1/6/12 | test1@test.com
Run Code Online (Sandbox Code Playgroud)
如果我们使用3的日期,结果集看起来会像这样
date | count(distinct email)
-------+------
1/1/12 | 3
1/2/12 | 3
1/3/12 | 3
1/4/12 | 3
1/5/12 | 2
1/6/12 | 2
Run Code Online (Sandbox Code Playgroud)
我可以使用下面的查询获得日期范围的明确计数,但是希望按天计算范围,这样我就不必手动更新数百个日期的范围.
select test.date, count(distinct test.email)
from test_table as test
where test.date between '2012-01-01' and '2012-05-08' …Run Code Online (Sandbox Code Playgroud) 我想是从generate_series,每个月的统计和计数的ID在每月的总和.这个SQL适用于PostgreSQL 9.1:
SELECT (to_char(serie,'yyyy-mm')) AS year, sum(amount)::int AS eintraege FROM (
SELECT
COUNT(mytable.id) as amount,
generate_series::date as serie
FROM mytable
RIGHT JOIN generate_series(
(SELECT min(date_from) FROM mytable)::date,
(SELECT max(date_from) FROM mytable)::date,
interval '1 day') ON generate_series = date(date_from)
WHERE version = 1
GROUP BY generate_series
) AS foo
GROUP BY Year
ORDER BY Year ASC;
Run Code Online (Sandbox Code Playgroud)
这是我的输出
"2006-12" | 4
"2007-02" | 1
"2007-03" | 1
Run Code Online (Sandbox Code Playgroud)
但我想得到的是这个输出(1月份的"0"值):
"2006-12" | 4
"2007-01" | 0
"2007-02" | 1
"2007-03" | 1
Run Code Online (Sandbox Code Playgroud)
因此,如果有一个月没有id,那么它应该被列出.任何想法如何解决这个问题?
以下是一些示例数据: …
在Postgres 9.1数据库中,我试图在给定月份生成一系列周,但有一些限制.我需要所有星期一的星期一开始,并在他们开始或结束另一个月时被削减.
例:
对于2013年2月,我想生成一个这样的系列:
start
------------------------
2013-02-01 00:00:00+00
2013-02-04 00:00:00+00
2013-02-11 00:00:00+00
2013-02-18 00:00:00+00
2013-02-25 00:00:00+00
Run Code Online (Sandbox Code Playgroud)
我现在的查询看起来像这样:
SELECT GREATEST(date_trunc('week', dates.d),
date_trunc('month',dates.d)) as start
FROM generate_series(to_timestamp(1359676800),to_timestamp(1362095999), '1 week') as dates(d)
Run Code Online (Sandbox Code Playgroud)
这个查询让我获得了前4个星期,但它从25日开始错过了一周.上周有可能上场吗?