【问题标题】:Mysql Time - 2 hoursMysql 时间 - 2 小时
【发布时间】:2015-04-20 09:17:58
【问题描述】:

我在数据库中有一个存储日期的表格,但格式是这样的

2015-04-20 12:47:58

这次我需要回显,但是 -2 小时,有什么解决方案吗?我知道在数据库中使用时间戳会更容易,但我无权访问将日期插入其中的脚本。

    if ( !defined('IN_HLSTATS') )
    {
        die('Do not access this file directly.');
    }
// Global Server Chat History
    $showserver=0;
    if (isset($_GET['server_id']))
    {
        $showserver = valid_request(strval($_GET['server_id']), true);
    }
    if ($showserver == 0)
    {
        $whereclause = "hlstats_Servers.game='$game'";
    }
    else
    {
        $whereclause = "hlstats_Servers.game='$game' AND hlstats_Events_Chat.serverId=$showserver";
    }
    $db->query
    ("
        SELECT
            hlstats_Games.name
        FROM
            hlstats_Games
        WHERE
            hlstats_Games.code = '$game'
    ");
    if ($db->num_rows() < 1) error("No such game '$game'.");
    list($gamename) = $db->fetch_row();
    $db->free_result();
    pageHeader
    (
        array ($gamename, 'Server Chat Statistics'),
        array ($gamename=>"%s?game=$game", 'Server Chat Statistics'=>'')
    );
    flush();
    $servername = "(All Servers)";

    if ($showserver != 0)
    {
        $result=$db->fetch_array
        (
            $db->query
            ("
                SELECT
                    hlstats_Servers.name
                FROM
                    hlstats_Servers
                WHERE
                    hlstats_Servers.serverId = ".$db->escape($showserver)."
            ")
        );
        $servername = "(" . $result['name'] . ")";
    }
?>

<div class="block">
    <?php printSectionTitle("$gamename $servername Server Chat Log (Last ".$g_options['DeleteDays'].' Days)'); ?>
    <div class="subblock">
        <div style="float:left;">
            <span>
            <form method="get" action="<?php echo $g_options['scripturl']; ?>" style="margin:0px;padding:0px;">
                <input type="hidden" name="mode" value="chat" />
                <input type="hidden" name="game" value="<?php echo $game; ?>" />
                <strong>&#8226;</strong> Show Chat from
                <?php
/*
                    $result = $db->query
                    ("
                        SELECT
                            DISTINCT hlstats_Events_Chat.serverId,
                            hlstats_Servers.name
                        FROM
                            hlstats_Events_Chat
                        INNER JOIN
                            hlstats_Servers
                        ON
                            hlstats_Events_Chat.serverId = hlstats_Servers.serverId
                            AND hlstats_Servers.game='$game'
                        ORDER BY
                            hlstats_Servers.sortorder,
                            hlstats_Servers.name,
                            hlstats_Events_Chat.serverId ASC
                        LIMIT
                            0,
                            50
                    ");
*/

                    $result = $db->query
                    ("
                        SELECT
                            hlstats_Servers.serverId,
                            hlstats_Servers.name
                        FROM
                            hlstats_Servers
                        WHERE
                            hlstats_Servers.game='$game'
                        ORDER BY
                            hlstats_Servers.sortorder,
                            hlstats_Servers.name,
                            hlstats_Servers.serverId ASC
                        LIMIT
                            0,
                            50
                    ");

                    echo '<select name="server_id"><option value="0">All Servers</option>';
                    $dates = array ();
                    $serverids = array();
                    while ($rowdata = $db->fetch_array())
                    {
                        $serverids[] = $rowdata['serverId'];
                        $dates[] = $rowdata; 
                        if ($showserver == $rowdata['serverId'])
                            echo '<option value="'.$rowdata['serverId'].'" selected>'.$rowdata['name'].'</option>';
                        else
                            echo '<option value="'.$rowdata['serverId'].'">'.$rowdata['name'].'</option>';
                    }
                    echo '</select>';
                    $filter=isset($_REQUEST['filter'])?$_REQUEST['filter']:"";
                ?>
                Filter: <input type="text" name="filter" value="<?php echo htmlentities($filter); ?>" /> 
                <input type="submit" value="View" class="smallsubmit" />
            </form>
            </span>
        </div>
    </div>
    <div style="clear:both;padding-top:20px;"></div>
        <?php
            if ($showserver == 0)
            { 
                $table = new Table(
                    array
                    (
                        new TableColumn
                        (
                            'eventTime',
                            'Date',
                            'width=16'
                        ),
                        new TableColumn
                        (
                            'lastName',
                            'Player',
                            'width=17&sort=no&flag=1&link=' . urlencode('mode=playerinfo&amp;player=%k')
                        ),
                        new TableColumn
                        (
                            'message',
                            'Message',
                            'width=34&sort=no&embedlink=yes'
                        ),
                        new TableColumn
                        (
                            'serverName',
                            'Server',
                            'width=23&sort=no'
                        ),
                        new TableColumn
                        (
                            'map',
                            'Map',
                            'width=10&sort=no'
                        )
                    ),
                    'playerId',
                    'eventTime',
                    'lastName',
                    false,
                    50,
                    "page",
                    "sort",
                    "sortorder"
                );
            }
            else
            {
                $table = new Table(
                    array
                    (
                        new TableColumn
                        (
                            'eventTime',
                            'Date',
                            'width=16'
                        ),
                        new TableColumn
                        (
                            'lastName',
                            'Player',
                            'width=24&sort=no&flag=1&link=' . urlencode('mode=playerinfo&amp;player=%k')
                        ),
                        new TableColumn
                        (
                            'message',
                            'Message',
                            'width=44&sort=no&embedlink=yes'
                        ),
                        new TableColumn
                        (
                            'map',
                            'Map',
                            'width=16&sort=no'
                        )
                    ),
                    'playerId',
                    'eventTime',
                    'lastName',
                    false,
                    50,
                    "page",
                    "sort",
                    "sortorder"
                );
            }
            $whereclause2='';
            if(!empty($filter))
            {
                $whereclause2="AND MATCH (hlstats_Events_Chat.message) AGAINST ('" . $db->escape($filter) . "' in BOOLEAN MODE)";
            }
            $surl = $g_options['scripturl'];

            $result = $db->query
            ("
                SELECT SQL_NO_CACHE 
                    hlstats_Events_Chat.eventTime,
                    unhex(replace(hex(hlstats_Players.lastName), 'E280AE', '')) as lastName,
                    IF(hlstats_Events_Chat.message_mode=2, CONCAT('(Team) ', hlstats_Events_Chat.message), IF(hlstats_Events_Chat.message_mode=3, CONCAT('(Squad) ', hlstats_Events_Chat.message), hlstats_Events_Chat.message)) AS message,
                    hlstats_Servers.name AS serverName,
                    hlstats_Events_Chat.playerId,
                    hlstats_Players.flag,
                    hlstats_Events_Chat.map
                FROM
                    hlstats_Events_Chat
                INNER JOIN
                    hlstats_Players
                ON
                    hlstats_Players.playerId = hlstats_Events_Chat.playerId
                INNER JOIN 
                    hlstats_Servers
                ON
                    hlstats_Servers.serverId = hlstats_Events_Chat.serverId
                WHERE
                    $whereclause $whereclause2
                ORDER BY
                    hlstats_Events_Chat.id $table->sortorder
                LIMIT
                    $table->startitem,
                    $table->numperpage;
            ", true, false);
/*
                $whereclause = "hlstats_Events_Chat.serverId ";

            if($showserver == 0) {
                $whereclause .= "in (".implode($serverids,',').")";
            } else {
                $whereclause .= "= $showserver";
            }
*/

            $db->query
            ("
                SELECT
                    count(*)
                FROM
                    hlstats_Events_Chat
                INNER JOIN
                    hlstats_Players
                ON
                    hlstats_Players.playerId = hlstats_Events_Chat.playerId
                INNER JOIN 
                    hlstats_Servers
                ON
                    hlstats_Servers.serverId = hlstats_Events_Chat.serverId
                WHERE
                    $whereclause $whereclause2
            ");
            if ($db->num_rows() < 1) $numitems = 0;
            else 
            {
                list($numitems) = $db->fetch_row();
            }
            $db->free_result(); 

            $table->draw($result, $numitems, 95);
        ?><br /><br />
    <div class="subblock">
        <div style="float:right;">
            Go to: <a href="<?php echo $g_options["scripturl"] . "?game=$game"; ?>"><?php echo $gamename; ?></a>
        </div>
    </div>
</div>

eventTime 是 db 中带有日期的字段

if ($showserver == 0)
            { 
                $table = new Table(
                    array
                    (
                        new TableColumn
                        (
                            'eventTime',
                            'Date',
                            'width=16'
                        ),
                        new TableColumn
                        (
                            'lastName',
                            'Player',
                            'width=17&sort=no&flag=1&link=' . urlencode('mode=playerinfo&amp;player=%k')
                        ),
                        new TableColumn
                        (
                            'message',
                            'Message',
                            'width=34&sort=no&embedlink=yes'
                        ),
                        new TableColumn
                        (
                            'serverName',
                            'Server',
                            'width=23&sort=no'
                        ),
                        new TableColumn
                        (
                            'map',
                            'Map',
                            'width=10&sort=no'
                        )
                    ),
                    'playerId',
                    'eventTime',
                    'lastName',
                    false,
                    50,
                    "page",
                    "sort",
                    "sortorder"
                );
            }
            else
            {
                $table = new Table(
                    array
                    (
                        new TableColumn
                        (
                            'eventTime',
                            'Date',
                            'width=16'
                        ),
                        new TableColumn
                        (
                            'lastName',
                            'Player',
                            'width=24&sort=no&flag=1&link=' . urlencode('mode=playerinfo&amp;player=%k')
                        ),
                        new TableColumn
                        (
                            'message',
                            'Message',
                            'width=44&sort=no&embedlink=yes'
                        ),
                        new TableColumn
                        (
                            'map',
                            'Map',
                            'width=16&sort=no'
                        )
                    ),
                    'playerId',
                    'eventTime',
                    'lastName',
                    false,
                    50,
                    "page",
                    "sort",
                    "sortorder"
                );
            }

【问题讨论】:

  • 这个字段是什么类型的? varchar 还是 datatime?
  • 它的“日期时间”类型
  • $date = date('当前时间', strtotime('-2 小时'));
  • $cas=$db->query("选择 eventTime - 间隔 2 小时从 hlstats_Events_Chat");回声“$cas”;什么都没有出现
  • 如果您希望我们为您提供帮助,请分享您的其余代码。说我们的解决方案不起作用对您没有帮助。问题出在其他地方

标签: php time timestamp


【解决方案1】:

使用DATE_SUB 函数,您可以从日期时间字段值中减去时间间隔:

SELECT DATE_SUB(columnname, INTERVAL 2 HOUR) FROM tablename

【讨论】:

    【解决方案2】:

    使用 DateTime 对象:

    <?php
    // Long version
    $str = '2015-04-20 12:47:58'; // Your date
    $dateTime = DateTime::createFromFormat('Y-m-d H:i:s', $str); // Conversion to DateTime object
    $dateTime->sub(new DateInterval('PT2H')); // Substract 2 hours
    $formatedDate = $dateTime->format('Y-m-d H:i:s'); // Formatting the new date
    
    // Short version
    $formatedDate = DateTime::createFromFormat('Y-m-d H:i:s', $str)->sub(new DateInterval('PT2H'))->format('Y-m-d H:i:s');
    ?>
    

    【讨论】:

      【解决方案3】:

      使用 INTERVAL 或 DATE_SUB

      SELECT '2015-04-20 12:47:58' - INTERVAL 2 HOUR;
      SELECT DATE_SUB('2015-04-20 12:47:58', INTERVAL 2 HOUR);
      

      SQL 小提琴http://sqlfiddle.com/#!9/9eecb/7404

      【讨论】:

        【解决方案4】:

        使用间隔:

        SELECT date - INTERVAL 2 HOUR FROM yourtable
        

        返回:2015-04-20 10:47:58

        先这样试一下看看效果,连表或字段都不要命名,只选择:

        SELECT '2015-04-20 12:47:58' - INTERVAL 2 HOUR 
        

        给:2015-04-20 10:47:58

        在 PHP 中,你需要执行这个查询:

        $result = $db->query('SELECT eventTime - INTERVAL 2 HOUR AS newdate FROM hlstats_Events_Chat');
        while($row = $result->fetch_assoc()){
            echo $row['newdate'];
        }
        

        【讨论】:

        • 它有效,请确保您的表名和字段正确,“yourtable”只是示例。
        • 我知道,一切都是正确的,尝试了所有已经给出的解决方案,但没有任何工作
        • 只要选择 eventTime 就可以了,还是一开始就不起作用?
        • @PeterRybar 好的,我用php代码编辑过,我看到你试图直接回显结果,这样试试。
        【解决方案5】:

        对我来说听起来像是时区问题?

        您可以在查询前使用 mysql set time_zone = '-02:00';

        SELECT NOW();
        SET time_zone = '-02:00';
        SELECT NOW();
        

        但您可能只想获取您所在时区的时间,无论您的数据库设置是 -2 小时。

        $dbDate = '2015-04-20 12:47:58';
        $dbTimezone = 'UTC'; // ?
        $yourTimezone = 'Europe/Amsterdam'; // that's where i am (UTC +2)
        
        $newDate = new DateTime($dbDate, new DateTimeZone($dbTimezone));
        $newDate->setTimeZone(new DateTimeZone($yourTimezone));
        
        echo $newDate->format('Y-m-d H:i:s'); // will echo UTC + 2 in this case..
        

        【讨论】:

          猜你喜欢
          • 2011-10-01
          • 2010-10-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多