Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
postgres SQL[负日期间隔和别名,仅在条件子句中不起作用]_Sql_Postgresql - Fatal编程技术网

postgres SQL[负日期间隔和别名,仅在条件子句中不起作用]

postgres SQL[负日期间隔和别名,仅在条件子句中不起作用],sql,postgresql,Sql,Postgresql,我带着两个我在博士后似乎无法理解的小奇怪来找你们: 一, 我正在计算用户何时可以发出下一个请求[每8小时一次],但如果你查看条目16,我得到的是1天-06:20:47,而不是18:00:00,不像其他行。[LASTREQUESTED表是一个简单的时间戳,与第16行的其他条目没有什么不同],这是为什么 二, 在同一个请求中,如果我尝试在时间列上添加一个条件,编译器会说它不存在,尽管使用它来排序是可以的。我不明白为什么 SELECT (DATE_TRUNC('seconds', CURRENT

我带着两个我在博士后似乎无法理解的小奇怪来找你们:

一,

我正在计算用户何时可以发出下一个请求[每8小时一次],但如果你查看条目16,我得到的是1天-06:20:47,而不是18:00:00,不像其他行。[LASTREQUESTED表是一个简单的时间戳,与第16行的其他条目没有什么不同],这是为什么

二,

在同一个请求中,如果我尝试在时间列上添加一个条件,编译器会说它不存在,尽管使用它来排序是可以的。我不明白为什么

   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