postgres SQL[负日期间隔和别名,仅在条件子句中不起作用]
我带着两个我在博士后似乎无法理解的小奇怪来找你们: 一, 我正在计算用户何时可以发出下一个请求[每8小时一次],但如果你查看条目16,我得到的是1天-06:20:47,而不是18:00:00,不像其他行。[LASTREQUESTED表是一个简单的时间戳,与第16行的其他条目没有什么不同],这是为什么 二, 在同一个请求中,如果我尝试在时间列上添加一个条件,编译器会说它不存在,尽管使用它来排序是可以的。我不明白为什么postgres SQL[负日期间隔和别名,仅在条件子句中不起作用],sql,postgresql,Sql,Postgresql,我带着两个我在博士后似乎无法理解的小奇怪来找你们: 一, 我正在计算用户何时可以发出下一个请求[每8小时一次],但如果你查看条目16,我得到的是1天-06:20:47,而不是18:00:00,不像其他行。[LASTREQUESTED表是一个简单的时间戳,与第16行的其他条目没有什么不同],这是为什么 二, 在同一个请求中,如果我尝试在时间列上添加一个条件,编译器会说它不存在,尽管使用它来排序是可以的。我不明白为什么 SELECT (DATE_TRUNC('seconds', CURRENT
SELECT (DATE_TRUNC('seconds', CURRENT_TIMESTAMP - "LASTREQUESTED")
- INTERVAL '8 hours') AS "TIME"
FROM "USER" AS u
JOIN "REQUESTLOG" AS r ON u."ID" = r."ID"
WHERE "TIME" > 0
ORDER BY "TIME";
我现在不知道它为什么会这样计算,可能是因为你从另一个间隔中减去了一个间隔,但是当你将计算改为Timestamp减去Timestamp时,它会按预期工作:
DATE_TRUNC('seconds', CURRENT_TIMESTAMP - (LASTREQUESTED + INTERVAL '8 hours'))
看
关于2:基于标准SQL,选择列表中的列是在FROM/WHERE/GROUP BY/have之后,但在ORDER之前计算的,这就是为什么不能在WHERE中使用别名。有一些是伊兹克·本·甘基于MS SQL Server编写的,但与PostgreSQL类似。问题1:负小时数,但正天数?
根据,这是PostgreSQL与SQL标准不同的情况:
根据SQL标准,区间值的所有字段必须具有相同的符号…。PostgreSQL允许字段具有不同的符号
内部间隔值存储为月、日和秒。之所以这样做是因为一个月的天数不同,如果涉及夏令时调整,一天可以有23或25个小时。月份和天数字段是整数,而秒字段可以存储分数
您可以通过以下查询看到一个更极端的例子:
=# select interval '1 day' - interval '300 hours';
?column?
------------------
1 day -300:00:00
(1 row)
所以这不是一个以秒为单位的时间间隔,用一种奇怪的方式表示;相反,它是一个0个月+1天-1080000.0秒的间隔。如果确定获取这些时间间隔的时间戳不存在夏令时问题,则可以使用将天转换为24小时周期,并获取更合理的时间间隔:
=# select justify_hours(interval '1 day' - interval '300 hours');
justify_hours
--------------------
-11 days -12:00:00
问题2:选择列不能在何处使用?
这是标准的PostgreSQL行为。看见会议提出的解决办法包括:
将表达式重复两次,一次在SELECT列表中,一次在WHERE子句中。我做这件事的次数比我想记住的要多
SELECT (my - big * expression) AS x
FROM stuff
WHERE (my - big * expression) > 5
ORDER BY x
创建一个没有WHERE过滤器的子查询,并将WHERE条件放在外部查询中
SELECT *
FROM (SELECT (my - big * expression) AS x
FROM stuff) AS subquery
WHERE x > 5
ORDER BY x
使用WITH语句实现类似于子查询技巧的功能
2个不同的问题应该放在2个不同的问题帖子里,我认为。问题2似乎是重复的。非常感谢,这是非常有洞察力的!
SELECT *
FROM (SELECT (my - big * expression) AS x
FROM stuff) AS subquery
WHERE x > 5
ORDER BY x