相关疑难解决方法(0)

设置PostgreSQL实例的时区

我使用最新的Zend框架与PostgreSQL数据库进行通信.我的一些数据库表有一个now()添加当前时间戳的字段.但是,对于不同的请求,db连接的时区可能不同.

是否可以在每个连接的基础上设置PostgreSQL数据库的时区?我知道你可以将驱动程序选项传递给Zend_Db的实例,所以我认为这就是诀窍.

php postgresql timezone zend-framework

5
推荐指数
2
解决办法
7267
查看次数

Rails 3 DateTime和time begin_of_day end_of_day格式不正确

我试图使用此代码在特定日期查找事件:

Event.where('starttime BETWEEN ? AND ?', DateTime.now.beginning_of_day, DateTime.now.end_of_day)
Run Code Online (Sandbox Code Playgroud)

在rails控制台中,如果我运行,DateTime.now.beginning_of_day我会得到我所期望的:

2012年4月9日星期一00:00:00 -0700

我可以看到问题出在哪里,但在rails控制台中查看SQL.不知何故,当日期进入SQL查询时,它会自动格式化为错误的日期和时间.

SELECT "events".* FROM "events" WHERE (starttime BETWEEN '2012-04-09 07:00:00' AND '2012-04-10 06:59:59')
Run Code Online (Sandbox Code Playgroud)

这给了我从今天到明天不同的结果,正如上面的sql所说的那样.我可以看到,当DateTime.now.beginning_of_day也使DateTime.now.end_of_day进入sql查询时,它们的格式不正确.我需要以某种方式格式化吗?知道为什么会到今天的7点和明天的7点?

我不知道它是否有所作为,但我正在使用PostgreSQL.

谢谢!

postgresql ruby-on-rails ruby-on-rails-3

5
推荐指数
1
解决办法
8799
查看次数

关于在postgresql中使用时区的策略

我需要在我的应用程序中使用多个时区.

基本上我的系统生成数据,来自地球上任何地方的客户都可以访问它.

由于我的数据有一个相关的时间戳,我想到了以下处理时区的策略.

在Postgres:

  • 使用::timestamptz我的时间戳的类型创建我的表.没有时区的时间戳不允许混合::timestamp,::timestamptz在我的情况下看起来像一颗定时炸弹.

  • 将我的PG服务器系统的时区设置为UTC.

  • 设置timezone='UTC'postgresql.conf(可能并不需要,如果系统的TZ是UTC,但我是一个有点偏执,它花了我什么).

  • 创建表时添加以下检查:

    CONSTRAINT timestamp_must_be_utc CHECK(date_part('timezone':: text,"my_timestamp_field")= 0 :: double precision)

  • 以UTC格式存储我的所有时间戳

在客户端(python + pytz)

  • 将客户的时区存储在他的个人资料中,例如 'America/Los Angeles'

  • 在查询数据时将时区信息发送到postgres,这样我就能获得类似的东西SELECT xxxx FROM yyyy WHERE my_ts >= '2012-11-27 19:13:00+01'::timestamptz,让Postgres转换为UTC.或者我可以使用pytz进行转换,但似乎Postgres会做得很好.

  • 根据客户的时区转换时间戳,以便我可以正确显示数据+时间戳.

总而言之,我计划在任何地方使用UTC来存储和查询数据,并在显示数据时只使用时区转换.

我对Postgres及其处理时区的方式没有多少经验.我知道处理不同时区的日期和时间是多么困难(一旦你必须使用航班时刻表,你就会学到使用UTC是唯一可行的日期和时间微积分的方法)这就是我要问的原因这个问题让我更有经验的postgres用户可以确认或纠正我的策略.

有趣的链接:

postgresql timezone datetime timestamp

5
推荐指数
1
解决办法
3569
查看次数

模型的日期时间字段与本地主机在 heroku 上的存储方式不同

脚步:

在我的本地主机服务器上,我在位于太平洋时区的浏览器中选择时间 2013 年 1 月 18 日上午 10 点 - 上午 11 点。然后我在 heroku 上的生产服务器上选择完全相同的时间。

如您所见,保存到数据库的内容的输出是不同的。我希望生产作为本地主机运行,并在将时间存储为 UTC 时考虑时区。这是什么原因造成的?heroku 服务器在 EST 中,但这并没有考虑到这种行为。

控制器:

  def create
    puts params[:event][:starts_at]
    @event = Event.create!(params[:event])
    puts @event.starts_at
  end
Run Code Online (Sandbox Code Playgroud)

输出本地主机:

2013 年 1 月 18 日星期五 10:00:00 GMT-0800(太平洋标准时间)

2013-01-18 18:00:00 UTC

输出 Heroku(生产):

2013 年 1 月 18 日星期五 10:00:00 GMT-0800(太平洋标准时间)

2013-01-18 10:00:00 UTC

架构:

 t.datetime "starts_at"
Run Code Online (Sandbox Code Playgroud)

环境:

Ruby on Rails 3.2.11

红宝石 1.9.3

Postgres

postgresql timezone ruby-on-rails heroku ruby-on-rails-3.2

5
推荐指数
1
解决办法
3122
查看次数

按月计算的累计值总和,填写缺失的月份

我有这个数据表,我想知道是否有可能创建一个查询,按月计算累积总和,考虑到当月的所有月份.

date_added                    | qty
------------------------------------
2015-08-04 22:28:24.633784-03 | 1
2015-05-20 20:22:29.458541-03 | 1
2015-04-08 14:16:09.844229-03 | 1
2015-04-07 23:10:42.325081-03 | 1
2015-07-06 18:50:30.164932-03 | 1
2015-08-22 15:01:54.03697-03  | 1
2015-08-06 18:25:07.57763-03  | 1
2015-04-07 23:12:20.850783-03 | 1
2015-07-23 17:45:29.456034-03 | 1
2015-04-28 20:12:48.110922-03 | 1
2015-04-28 13:26:04.770365-03 | 1
2015-05-19 13:30:08.186289-03 | 1
2015-08-06 18:26:46.448608-03 | 1
2015-08-27 16:43:06.561005-03 | 1
2015-08-07 12:15:29.242067-03 | 1
Run Code Online (Sandbox Code Playgroud)

我需要这样的结果:

Jan|0
Feb|0
Mar|0
Apr|5
May|7
Jun|7
Jul|9
Aug|15
Run Code Online (Sandbox Code Playgroud)

sql postgresql aggregate-functions window-functions generate-series

5
推荐指数
1
解决办法
6436
查看次数

将 UTC 时间戳转换为 timestamptz

如何将timestampUTC 格式转换为timestamptz

如果我的本地时区是 GMT-1 并且我运行:

select '2017-01-01 00:00:00'::timestamptz

我得到:

2017-01-01 00:00:00-01

但我想要:

2017-01-01 01:00:00-01

postgresql timezone timestamp

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

在 PostgreSQL 中正确处理 TIME WITH TIME ZONE

我们有一个表格,里面装满了来自另一个系统的遗留报告的数据。该表的列反映了报告的相同结构。

以下是表的缩写结构:

CREATE TABLE IF NOT EXISTS LEGACY_TABLE (
  REPORT_DATE DATE NOT NULL,
  EVENT_ID BIGINT PRIMARY KEY NOT NULL,
  START_HOUR TIMESTAMP WITHOUT TIME ZONE,
  END_HOUR TIME WITHOUT TIME ZONE,
  EXPECTED_HOUR TIME WITHOUT TIME ZONE
);
Run Code Online (Sandbox Code Playgroud)

我们正在重构这个表来处理不同客户端的不同时区。新结构将类似于:

CREATE TABLE IF NOT EXISTS LEGACY_TABLE (
  REPORT_DATE DATE NOT NULL,
  EVENT_ID BIGINT PRIMARY KEY NOT NULL,
  START_HOUR TIMESTAMP WITH TIME ZONE,
  END_HOUR TIME WITH TIME ZONE,
  EXPECTED_HOUR TIME WITH TIME ZONE
);
Run Code Online (Sandbox Code Playgroud)

这些小时字段表示由 REPORT_DATE 列表示的一天中的特定时间点。我的意思是每个 TIME 列都代表 REPORT_DATE 中指定的一天中的一个时刻。

其他一些需要考虑的点:

  • 我们不知道为什么我们从旧系统收到的报告中的 START_HOUR 是 …

postgresql timezone date-arithmetic dst

5
推荐指数
1
解决办法
1154
查看次数

使用PostgreSQL处理时间

我有一个表datetime字段.我很难理解我是如何处理这个问题的,部分是因为我不明白时间如何转换为数字.我使用以下命令创建了一个表:

CREATE TABLE tracking.time_record
(
  date date, 
  "time" time without time zone,
  id character(100)
)
Run Code Online (Sandbox Code Playgroud)

我的数据示例如下:

"2012-04-18" | "18:33:19.612" | "2342342384" 
Run Code Online (Sandbox Code Playgroud)

例如,如何运行查询以便我可以检查在某一天id具有时间值的所有值> 10 pm

我意识到,因为我的时间存储在一个字符类型变量中,所以这样的东西不起作用:

SELECT * FROM tracking.time_record 
WHERE "time" > "04:33:38.884" AND date > "2012-04-18"
Run Code Online (Sandbox Code Playgroud)

(这是我对时间/日期跟踪的第一次探索 - 我应该选择不同的列名)

sql postgresql time datetime

4
推荐指数
1
解决办法
9573
查看次数

默认时间戳格式和小数秒

我正在尝试将 Postgres 数据库中的时间戳格式化为某种格式:

YYYY-MM-DD HH24:MI:SS
Run Code Online (Sandbox Code Playgroud)

通过做:

update myTable set tds = to_char(tds, 'YYYY-MM-DD HH24:MI:SS')::timestamp;
Run Code Online (Sandbox Code Playgroud)

我设法将以前存储的所有内容都设置tds为这种格式。但是,任何新添加的条目都会返回到:YYYY-MM-DD HH24:MI:SS.MS因为默认设置为now()

如何更改此设置,以便新添加的条目也具有以下格式:YYYY-MM-DD HH24:MI:SS

format postgresql datetime timestamp default

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

从now()函数中减去小时数

我们有一台24x7全天候运行的机器.每天我都会报告每小时生产的件数.在我们的例子中,一个工作日意味着'2015-06-16 06:00:00'到'2015-06-17 06:00:00'.

这是我的代码:

select date_trunc('hour', t_el_eventlog.eventtime at time zone 'CET') as hours,
       count (distinct t_el_eventlog.serialnumber) as count
from t_el_eventlog
where eventtime at time zone 'CET' between '2015-06-16 06:00:00'
                                       and '2015-06-17 06:00:00'
and sourceid = '44'
group by hours
order by hours asc
Run Code Online (Sandbox Code Playgroud)
  • 我的Postgres版本:"PostgreSQL 9.4.1,由Visual C++编译构建1800,32位"

  • 我正在处理的两列数据类型:

    eventtime timestamp without time zone
    sourceid  integer NOT NULL
    
    Run Code Online (Sandbox Code Playgroud)
  • 时区是"欧洲/柏林".

通过上面的查询,我得到了我想要的信息,但我必须每天更改日期.是否可以将该now()功能用作我的情况的默认值,这样我就不必每天手动更改日期?

sql postgresql timezone datetime date-arithmetic

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