Использование преобразованной метки времени Unix для запроса базы данных - PullRequest
0 голосов
/ 12 апреля 2011

Я сейчас использую это:

$rawsql = "SELECT 
*
FROM 
    _erc_foffices n 
INNER JOIN 
    _erc_openings o ON n.id = o.branch_id AND o.dotw = DAYOFWEEK(CURRENT_DATE()) 
INNER JOIN 
    _erc_openings_times t ON o.id = t.opening_id
WHERE 
(
    UNIX_TIMESTAMP(CURRENT_TIMESTAMP()) BETWEEN 
        UNIX_TIMESTAMP(CONCAT(CURRENT_DATE(), ' ', t.open))
    AND UNIX_TIMESTAMP(CONCAT(CURRENT_DATE(), ' ', t.close)) 
) 
AND 
(
    n.id = %d
)
    ;";

для запроса базы данных и возврата всех деталей из посольства, если оно открыто в данный момент.

Теперь, вместо CURRENT_TIMESTAMP(), мне нужно выяснить, находится ли время, хранящееся в переменной $current_local_time, между двумя значениями базы данных. Расписания должны храниться по местному времени, а не по лондонскому, поэтому я пытаюсь их преобразовать.

Я попытался заменить

WHERE 
    (
        UNIX_TIMESTAMP(CURRENT_TIMESTAMP()) BETWEEN
            UNIX_TIMESTAMP(CONCAT(CURRENT_DATE(), ' ', t.open))
        AND UNIX_TIMESTAMP(CONCAT(CURRENT_DATE(), ' ', t.close)) 
    ) 

с

WHERE 
    (
        UNIX_TIMESTAMP($current_local_time) BETWEEN 
            UNIX_TIMESTAMP(CONCAT(CURRENT_DATE(), ' ', t.open)) 
        AND UNIX_TIMESTAMP(CONCAT(CURRENT_DATE(), ' ', t.close)) 
    ) 

но я просто получаю сообщения об ошибках. Может кто-нибудь сказать, пожалуйста, как бы я это сделал правильно?

Спасибо за любую помощь

Редактировать: переменная $current_local_time берется так:

date_default_timezone_set('Europe/London');
$time = date("H:i", time());
$myDateTime = new DateTime($time, new DateTimeZone('GMT'));
$myDateTime->setTimezone(new DateTimeZone($timezone));
$current_local_time = $myDateTime->format('H:i:s');

и выводит как текущее время в другой стране, когда отображается эхо.

Редактировать 2:

Я изменил значение $ current_local_time на следующее:

$current_local_time = $myDateTime->format('H:i:s');
$timestamp2 = strtotime($current_local_time);

и предложение where к этому:

WHERE 
(
    '$timestamp2' BETWEEN 
        UNIX_TIMESTAMP(CONCAT(CURRENT_DATE(), ' ', t.open)) 
    AND UNIX_TIMESTAMP(CONCAT(CURRENT_DATE(), ' ', t.close)) 
) 

Это работает нормально, но если t.close установлено в 23:30, оно фактически не закроется до 23:31. Есть ли способ выделить минутку из захваченного времени, чтобы разобраться с этим?

1 Ответ

0 голосов
/ 12 апреля 2011

Отметка времени, которую вы вставляете, должна быть заключена в строку, поэтому вам нужно

WHERE 
    (
        UNIX_TIMESTAMP('$current_local_time') BETWEEN 
            UNIX_TIMESTAMP(CONCAT(CURRENT_DATE(), ' ', t.open)) 
        AND UNIX_TIMESTAMP(CONCAT(CURRENT_DATE(), ' ', t.close)) 
    ) 

Еще лучше использовать среду SQL, которая позволяет связывать параметры, указывать запрос следующим образом и привязывать ? к $current_local_time в PHP.

WHERE 
    (
        UNIX_TIMESTAMP(?) BETWEEN 
            UNIX_TIMESTAMP(CONCAT(CURRENT_DATE(), ' ', t.open)) 
        AND UNIX_TIMESTAMP(CONCAT(CURRENT_DATE(), ' ', t.close)) 
    ) 

РЕДАКТИРОВАТЬ: Я думаю, что вы хотите

(UNIX_TIMESTAMP(CONCAT(CURRENT_DATE(), ' ', t.open))     <=   '$timestamp2'
AND
'$timestamp2'    <    UNIX_TIMESTAMP(CONCAT(CURRENT_DATE(), ' ', t.close)))
--              ^^^ Note the less-than sign

Возможно, вам больше не нужны кавычки вокруг $timestamp2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...