0

我正在尝试用ctime今天的 a 来获取任何记录。对于某些原因,&tomorrow 和 &yesterday 没有任何值。如果我删除strtotime()它们的值是从mktime. 我在做什么错strtotime

PHP:

public function fetchToday()
{
    $tomorrow  = strtotime(mktime(0, 0, 0, date("m")  , date("d")+1, date("Y")));
    $yesterday  = strtotime(mktime(0, 0, 0, date("m")  , date("d")-1, date("Y")));      
    $q = "SELECT * FROM $this->_table WHERE ctime < $tomorrow AND ctime > $yesterday";      
    return $this->fetchBySelect($q);
}

错误:

ModelFactory - 'ERROR: syntax error at or near "AND" LINE 1: SELECT * FROM motd WHERE ctime < AND ctime >

PostrgeSQL 表字段:

ctime timestamp(0) with time zone

询问:

SELECT * FROM motd WHERE ctime < 1372402800 AND ctime > 1372230000;

`

4

5 回答 5

3

为什么不只是:

$tomorrow  = date("Y-m-d", strtotime("+1 day")); // sets tomorrow = 2013-06-28
$yesterday  = date("Y-m-d", strtotime("-1 day")); // sets tomorrow = 2013-06-26

这是假设您的 ctime 列是 MySQL 日期戳。如果它是一个unix时间戳,那么:

$tomorrow  = strtotime("+1 day");
$yesterday  = strtotime("-1 day");

由于 strtotime 将参数转换为 unix 时间戳。您的代码使用 strtotime 和 mktime 都是多余的。

编辑:根据以前的帖子,看起来你的 ctime 列是一个 unix 时间戳,所以我的第二个例子是要走的路。 将返回一个表示Daystrtotime("+1 day")的 unix 时间戳的 int ,并为.NOW + 1-1 Day

于 2013-06-27T20:53:59.153 回答
3

到目前为止,所有答案都集中在 php 方面,但另一方面,我想说正确的解决方案是使用 PostgreSQL 功能,并将 php 代码更改为:

public function fetchToday()
{
    $q = "SELECT * FROM $this->_table WHERE ctime < 'tomorrow'::timestamptz AND ctime > 'yesterday'::timestamptz;";      
    return $this->fetchBySelect($q);
}
于 2013-06-27T20:56:39.387 回答
2

strtotime在返回值上使用mktime是没有意义的。这两个函数都返回一个 Unix 时间戳,因此请使用其中一个。我建议strtotime是因为它易于使用:

$tomorrow  = strtotime('tomorrow');
$yesterday = strtotime('yesterday');

这些中的每一个都返回与一天开始前的午夜相对应的时间戳,这看起来就像您想要的那样。

于 2013-06-27T20:51:57.860 回答
1

我认为这些语句中存在错误,因此它们会产生空字符串并使查询失败。

$tomorrow  = strtotime(mktime(0, 0, 0, date("m")  , date("d")+1, date("Y")));
$yesterday  = strtotime(mktime(0, 0, 0, date("m")  , date("d")-1, date("Y")));      

mktime() 返回 unix 时间戳,您不需要使用 strtime()。

这取决于您如何在数据库中存储数据。如果它们保留为 TIMESTAMP,则省略 strtotime。

如果您将它们保留为 ISO,例如“YYYY-MM-DD”,则仅使用 date()。

于 2013-06-27T20:54:40.253 回答
1
public function fetchToday()
{
    $tomorrow = strtotime("+1 day", strtotime(date("Y-m-d H:i:s"))); 
    $yesterday= strtotime("-1 day", strtotime(date("Y-m-d H:i:s"))); 
    $q = "SELECT * FROM ".$this->_table." WHERE ctime < ".$tomorrow." AND ctime > ".$yesterday;      
    return $this->fetchBySelect($q);
}
于 2013-06-27T20:59:18.873 回答