我使用最新的Zend框架与PostgreSQL数据库进行通信.我的一些数据库表有一个now()添加当前时间戳的字段.但是,对于不同的请求,db连接的时区可能不同.
是否可以在每个连接的基础上设置PostgreSQL数据库的时区?我知道你可以将驱动程序选项传递给Zend_Db的实例,所以我认为这就是诀窍.
我试图使用此代码在特定日期查找事件:
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.
谢谢!
我需要在我的应用程序中使用多个时区.
基本上我的系统生成数据,来自地球上任何地方的客户都可以访问它.
由于我的数据有一个相关的时间戳,我想到了以下处理时区的策略.
在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用户可以确认或纠正我的策略.
有趣的链接:
脚步:
在我的本地主机服务器上,我在位于太平洋时区的浏览器中选择时间 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
我有这个数据表,我想知道是否有可能创建一个查询,按月计算累积总和,考虑到当月的所有月份.
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
如何将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
我们有一个表格,里面装满了来自另一个系统的遗留报告的数据。该表的列反映了报告的相同结构。
以下是表的缩写结构:
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 中指定的一天中的一个时刻。
其他一些需要考虑的点:
我有一个表date和time字段.我很难理解我是如何处理这个问题的,部分是因为我不明白时间如何转换为数字.我使用以下命令创建了一个表:
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)
(这是我对时间/日期跟踪的第一次探索 - 我应该选择不同的列名)
我正在尝试将 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?
我们有一台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()功能用作我的情况的默认值,这样我就不必每天手动更改日期?