Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.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
Postgresql Postgres:在timestampz上查询特定日期不会返回任何数据,而我可以在Postgres客户端中看到数据_Postgresql - Fatal编程技术网

Postgresql Postgres:在timestampz上查询特定日期不会返回任何数据,而我可以在Postgres客户端中看到数据

Postgresql Postgres:在timestampz上查询特定日期不会返回任何数据,而我可以在Postgres客户端中看到数据,postgresql,Postgresql,我是postgres的新手,在这里发布之前,我已经在谷歌上搜索了大约1小时 希望你能帮我解决这个可能微不足道的问题 我有一个使用此架构创建的数据库LTC: CREATE TABLE LTC ( id SERIAL PRIMARY KEY, time timestamptz, side CHAR(4), price REAL, v REAL, n INT

我是postgres的新手,在这里发布之前,我已经在谷歌上搜索了大约1小时

希望你能帮我解决这个可能微不足道的问题

我有一个使用此架构创建的数据库LTC:

CREATE TABLE LTC (
       id       SERIAL PRIMARY KEY,
       time     timestamptz,
       side     CHAR(4),
       price    REAL,
       v        REAL,
       n        INT
    );
我想通过查询从javascript获取time='2017-08-12T03:58:26.563Z'ISO字符串的所有数据。我知道当时数据库中有100多行数据,我在我的postgres客户端中看到了这些数据

下面是我正在做的查询:

select * from LTC where time = '2017-08-12T03:58:26.563Z'::timestamptz
为什么我没有得到结果

编辑:

仍然不确定它为什么不起作用,但我写了一篇关于它的文章:

在JavaScript中:

var date    = new Date('2017-08-12T03:58:26.563Z').toISOString(); // actual time passed as parameter in my function, hard-coded for the example
var reg     = new RegExp("([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})\.[0-9]*Z","gmi");
var start   = date.replace(reg, function(match,year,month,day,hour,min,sec,ms) {
    return year+'-'+month+'-'+day+'T'+hour+':'+min+':00.000Z';
});
var end     = date.replace(reg, function(match,year,month,day,hour,min,sec,ms) {
    var min = parseInt(min)+1;
    if (min<=9) {
        min = '0'+min;
    }
    return year+'-'+month+'-'+day+'T'+hour+':'+min+':00.000Z';
});

var query   = "select * from LTC where time >= '"+start+"'::timestamptz and time < '"+end+"'::timestamptz"; // This works
试着在两者上都使用date_trunc‘second’时间戳,以确保数字精度不会让你感到不快。您的客户可能没有显示额外的小数位数,从而使等式失效

另一种可能的解决方案是给出x和y之间的范围,以避免数值相等问题

如果您能够获得使用pg_dump表示的数据的精确副本,我们将更容易提供帮助。如果您熟悉pg_dump,我们可以使用您使用的数据进行测试

您可能要检查的最后一件事是明确说明您所引用的时区。我通常使用不带时区的时间戳来避免这个问题,但是自动将时区设置为不同的值也可能会使您感到厌烦。测试的一个好方法是选择两个值,比如

select *, l.time = p.ts as test
from LTC l, (select '2017-08-12T03:58:26.563Z'::timestamptz as ts) p
;
编辑:

我建立了一个测试,试图重现你的行为:

CREATE TABLE LTC (
 id serial
 , time timestamptz
 );

 INSERT INTO LTC (time)
 values ('2017-08-12T03:58:26.56312345'::timestamptz)
 returning *;

 select *
 from LTC 
 where time = '2017-08-12T03:58:26.563Z'::timestamptz
 ;

 select *, l.time = p.ts as test
from LTC l, (select '2017-08-12T03:58:26.563Z'::timestamptz as ts) p
;
我在这里得到的实际上是:

1;"2017-08-12 03:58:26.563123-04";"2017-08-11 23:58:26.563-04";f

希望您能看到正在发生的事情—“2017-08-12T03:58:26.563Z”:时间戳被解释为UTC时间,然后转换为我的时区UTC-04,因此所比较的实际上是一个完全不同的日期!将来,并排显示这种类型的相等是一种很好的方法,可以测试您是否正在执行您认为是的,特别是在自动转换经常发生的日期/时间方面。

仍然不知道为什么它不起作用,但我尝试了您的范围解决方案,它解决了问题。我发布了JS代码来生成query.Ouch。这是一个痛苦的JS脚本!如果您只需要分钟精度,可以在数据库端尝试以下替代逻辑:从LTC中选择*,其中date_trunc'minute',time::timestamp=date_trunc'minute','2017-08-12T03:58:26.563Z'::timestamp;。转换为时间戳似乎解决了我在使用timestamp时遇到的一些自动转换问题,至少在您没有明确地传递时区的情况下是这样。