2013-06-27 2 views
0

Я пытаюсь захватить любую запись с ctime сегодня. Для некоторых reaosn, & завтра и & вчера нету каких-либо значений. Если я удалю strtotime(), их значения являются строковыми представлениями даты, полученной от mktime. Что я делаю неправильно с strtotime?Дата строки не конвертировать в timestamp

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;

`

+0

вот что оп спрашивает - почему они не получают значения для '$ завтра' и' $ вчера' – sgroves

+0

Ах, извините. Ну, тег был «postgresql», поэтому я предположил, что он рассматривает его как проблему Pg. Мой плохой, убрал несоответствующие/неправильные комментарии. –

ответ

3

Все ответы до сих пор сосредоточены на стороне PHP, но с другой стороны, я хотел бы сказать, что правильное решение заключается в использовании функции PostgreSQL, а также изменить код РНР:

public function fetchToday() 
{ 
    $q = "SELECT * FROM $this->_table WHERE ctime < 'tomorrow'::timestamptz AND ctime > 'yesterday'::timestamptz;";  
    return $this->fetchBySelect($q); 
} 
+0

pg_query(): запрос не выполнен: ERROR: не может использовать тип integer для метки времени с часовым поясом. LINE 1: SELECT * FROM motd WHERE ctime <1372402800 :: timestamptz AND ... – smulholland2

+0

нм, который сработал. ти. забыл изменить $ завтра и $ сегодня на «tomrrow» и «today». Почувствуйте, как объяснить, почему это работает? назовите меня ссылкой? снова. – smulholland2

+1

http://www.postgresql.org/docs/current/interactive/datatype-datetime.html#DATATYPE-DATETIME-SPECIAL-TABLE имеет всю информацию. –

2

Использование strtotime на возвращаемое значение mktime не имеет никакого смысла. Обе функции возвращают временную метку Unix, поэтому используйте одну или другую. Я предлагаю strtotime, потому что он прост в использовании:

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

Каждый из этих возвращений метки времени, соответствующее полуночи до начала дня, который выглядит так, как вы хотите.

+0

mktime не дает мне временную метку. это моя проблема. это дает мне строку. – smulholland2

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.

EDIT: на основе предыдущих сообщений выглядит так, как ваш столбец ctime является отметкой времени unix, поэтому мой второй пример - путь. strtotime("+1 day") вернет int, представляющий временную метку unix NOW + 1 Day, и наоборот для -1 Day.

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», используйте только дату().

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); 
}