- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们有一台 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
我的 Postgres 版本:“PostgreSQL 9.4.1,由 Visual C++ build 1800 编译,32 位”
我正在处理的两列的数据类型:
eventtime timestamp without time zone
sourceid integer NOT NULL
时区是“欧洲/柏林”。
通过上面的查询,我得到了我想要的信息,但我必须每天更改日期。是否可以使用 now()
函数作为我的案例的默认值,这样我就不必每天手动更改日期?
最佳答案
时间戳
的答案您需要了解数据类型timestamp
(timestamp without time zone
)和timestamptz
(timestamp with time区域
)。如果您不这样做,请先阅读此内容:
AT TIME ZONE
构造将 timestamp
转换为 timestamptz
,这几乎可以肯定是 错误的举动你的情况:
WHERE eventtime AT TIME ZONE 'CET' BETWEEN '2015-06-16 06:00:00' AND '2015-06-17 06:00:00'
First, it kills performance. Applying AT TIME ZONE
to the column eventtime
makes the expression not sargable. Postgres cannot use plain indexes on eventtime
. But even without index, sargable expressions are cheaper. Adjust filter values instead of manipulating every row value.
You could compensate with a matching expression index, but it's probably just a misunderstanding and wrong anyway.
What happens in that expression?
AT TIME ZONE 'CET'
transforms the timestamp
value eventtime
to timestamptz
by appending the time offset of your current time zone. When using a time zone name (not a numeric offset or an abbreviation), this also takes DST rules (daylight saving time) into account, so you get a different offset for "winter" timestamps. Basically you get the answer to the question:
What's corresponding UTC timestamp for the given timestamp in the given time zone?
When displaying the result to the user it is formatted as local timestamp with the according time offset for the current time zone of the session. (May or may not be the same as the one used in the expression).
The string literals on the right side have no data type to them, so the type is derived from the assignment in the expression. Since that's timestamptz
now, both are cast to timestamptz
, assuming the current time zone of the session.
What's the corresponding UTC timestamp for the given timestamp for the time zone setting of the current session.
The offset can vary with DST rules.
Long story short, if you always operate with the same time zone: CET
or 'Europe/Berlin'
- same thing for present-day timestamps, but not for historic or (possibly) future ones, you can just cut the cruft.
The second problem with the expression:
is almost always wrong with BETWEEN
timestamp
values. See:
SELECT date_trunc('hour', eventtime) AS hour
, count(DISTINCT serialnumber) AS ct -- sure you need distinct?
FROM t_el_eventlog
WHERE eventtime >= now()::date - interval '18 hours'
AND eventtime < now()::date + interval '6 hours'
AND sourceid = 44 -- don't quote the numeric literal
GROUP BY 1
ORDER BY 1;
now()
是 SQL 标准 CURRENT_TIMESTAMP
的 Postgres 实现。两者都返回 timestamptz
(不是 timestamp
!)。您可以使用任何一个。now()::date
等同于 CURRENT_DATE
。两者都取决于当前的时区设置。
你应该有一个索引的形式:
CREATE INDEX foo ON t_el_eventlog(sourceid, eventtime)
或者,允许仅索引扫描:
CREATE INDEX foo2 ON t_el_eventlog(sourceid, eventtime, serialnumber)
如果您在不同的时区操作,事情会变得更加复杂,您应该对所有内容使用 timestamptz
。
timestamptz
在问题更新之前,时区似乎很重要。在处理不同时区时,“今天” 是当前时区的函数依赖。人们往往会忘记这一点。
要仅使用 session 的当前时区设置,请使用与上述相同的查询。如果在不同的时区执行,实际上结果是错误的。 (同样适用于上述内容。)
无论 session 的当前时区设置如何,要保证给定时区(在您的情况下为“欧洲/柏林”)的正确结果,请改用此表达式:
((now() AT TIME ZONE 'Europe/Berlin')::date - interval '18 hours')
AT TIME ZONE 'Europe/Berlin' -- 2nd time to convert back
请注意 AT TIME ZONE
构造为 timestamptz
输入返回 timestamp
,反之亦然。
正如一开始提到的,这里有所有血淋淋的细节:
关于sql - 从 now() 函数中减去小时数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30894296/
我有两个列表,我想从 neg 中减去列表 pos 中元素的频率。所以: neg = [x for x in all[:800000]] pos = [x for x in all[800000:]]
我有两个列表,我想从 neg 中减去列表 pos 中元素的频率。所以: neg = [x for x in all[:800000]] pos = [x for x in all[800000:]]
我正在尝试减去 2 个标准逻辑向量并得到错误 p2 <= p1(11 downto 0)- idata(11 downto 0); Error (10327): VHDL error at sub.v
我将以下代码嵌入到类中。每当我运行 distToPoint 时,它都会给出错误“不支持的操作数类型 -: 'NoneType' 和 'float'” 我不知道为什么它会返回 NoneType 和如何让
这一直让我想知道, 假设我有这种情况: select (...long sub query..) - (...long sub query..) 我想把 - 放在条件中,这意味着有时它会是 - 有时是
我有两个 vector 。我需要从 vector1 中删除 vector2 中的内容。 [编辑:不清楚这是否意味着按照下面的链接或设置差异进行逐元素减法] 我使用 Visual Studio 2010
我有一张这样的 table : id product_property_id product_id amount type 1 1 145 10
我有两个 boolean 值列表 buy_machine 和 broken_machine。我想创建第三个列表 working_machines,它是购买的机器数量的总和并减去坏机器的数量。 我尝试了
我似乎可以解决这个问题。我有两个来自 sql 的访问者/国家/地区列表 us,us,uk,fr,uk,uk,uk 和 us,uk 我用 array_count_values() 将它们制成数组: Ar
我在 javascript 中减去时间时遇到了麻烦,尽管我已经谷歌搜索了 2 天但没有任何运气:( 我正在尝试为调查问卷计时。当用户开始调查问卷时,会记录时间戳。当用户完成/单击提交时,会记录新的时间
我正在尝试对 flex 搜索中索引的字段进行一些分析。 其中两个字段是“start_time”和“end_time”。我基本上希望将这两个字段的差异分组,即('end_time'-'start_tim
我有一个函数,它接收两个 BigDecimal 数字,即 bd1 和 bd2 作为参数。该函数应减去 bd1 - db2 并返回 bd1 和 bd2 的小数位数均为 2,结果的小数位数也应仅为 2但使
根据ldt_code中的ld源代码here。没有将dl_main传递给phdr的上下文,我对为什么通过减去虚拟地址来推断main_map的加载地址有些困惑。 我跟踪过的代码: 1124 static
我进行了多次重复测量的治疗,我想减去每次治疗的每个时间点的对照值。数据集的形状是这样的,有多年、物种和处理。 ID Year Species Treatment value 1 2010 x
我正在尝试查找一次旅行的矩形区域,可以在此处找到更多上下文 我在下面的代码中遇到的错误是: "Exception in thread "main" java.lang.ArrayIndexOutOfB
我一直在尝试使用 pandas dataframe 减去我读入 python 的列之间的日期和时间。我写的代码如下: Time = df['t'] - df['t'].shift(1) + df['t
I want to subtract all values in a[nn,...,0] by b[nn] while keeping the original structure of the ar
假设我有两个列表:List l1,和 Listl2 请帮助我如何在 2 个列表之间合并、减去和相交。谢谢。 注意:我使用的是 .NET 2.0,所以我不能使用 LINQ。谢谢。 最佳答案 以下是伪代码
这个问题不太可能对任何 future 的访客有帮助;它只与一个较小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于全世界的互联网受众。如需帮助使此问题更广泛适用,visit the
我正在尝试运行以下代码: extern crate unicase; use unicase::UniCase; use std::collections::HashSet; fn main() {
我是一名优秀的程序员,十分优秀!