【问题标题】:Using a converted Unix Timestamp to query the database使用转换后的 Unix 时间戳查询数据库
【发布时间】:2011-08-03 22:54:53
【问题描述】:

我目前正在使用这个:

$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 才会关闭。有没有办法从捕获的时间中抽出一分钟来解决这个问题?

【问题讨论】:

  • 您收到的错误信息是什么?
  • 警告:mysql_num_rows() 期望参数 1 是资源,布尔值在 E:\wamp\www\app\webroot\erc\index.php 第 185 行给出 警告:mysql_num_rows() 期望参数 1作为资源,在第 197 行的 E:\wamp\www\app\webroot\erc\index.php 中给出的布尔值

标签: php mysql unix timestamp timetable


【解决方案1】:

您插入的时间戳需要作为字符串引用,因此您需要

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

最好使用允许您进行参数绑定的 SQL 框架,按如下方式指定查询,并在 PHP 中将 ? 绑定到 $current_local_time。

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 周围的引号了。

【讨论】:

  • 嗨,Ken,我在变量名周围添加了单引号,但查询没有返回任何结果。 $current_local_time 当前设置为 22:50(越南时间),而我设置的开放时间为今晚 23:59,因此如果返回结果,它应该显示为 open。还有什么我需要改变的吗?感谢您的帮助
  • 22:50 早于 23:59,所以不在营业时间。 (除非你的意思是 t.close 是 23:59)。
  • 对不起,我应该更清楚,我的意思是 t.close 是 23:59。我想我现在已经使用单引号让它工作了,但是我不得不删除 UNIX_TIMESTAMP。我将用我目前拥有的内容更新我的帖子......只是在一分钟内测试它
  • 嗨,肯,我已经更新了我的问题。你知道底部的答案吗?谢谢
  • @user:真的,您应该针对类似的问题发布一个新问题。答案是expr BETWEEN min AND max 等价于(min &lt;= expr AND expr &lt;= max)。如果你想要不同的东西,你必须拼出比较运算符,并跳过BETWEEN。
猜你喜欢
  • 2015-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-19
  • 2011-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多