1

我有一个 MySQL 表,将对象的出生和死亡事件存储为单独的行。我正在尝试编写一个查询,该查询将在给定时间获取所有“活体”。更重要的是出生和死亡时间戳存储为字符串。

该系统具有历史特征,要求日期从 0000-00-00 00:00 开始,这是 MySQL 或 UNIX 都无法处理的。

我可以使用以下方法成功对表格进行排序:

ORDER BY CHAR_LENGTH(start_timestamp) ASC, start_timestamp ASC

但我正在寻找一个在比较字符串时包含此 ORDER BY 规则的查询。

我目前的功能如下:

global $mysqli,$db_table_prefix;
$stmt = $mysqli->prepare("SELECT object_id FROM ".$db_table_prefix."user_events WHERE start_timestamp < ? AND event_id = ?");
$stmt->bind_param("ii",$time,$birth);
$stmt->execute();
$stmt->bind_result($object_id);
while ($stmt->fetch()){
    $row[] = $object_id;
}
$stmt->close(); 

    if(!empty($row)){
        $stmt = $mysqli->prepare("SELECT object_id FROM ".$db_table_prefix."user_events WHERE start_timestamp > ? AND event_id = ? AND object_id IN (".join(",",$row).")");
        $stmt->bind_param("ii",$time,$death);
        $stmt->execute();
        $stmt->bind_result($object_id);
        while ($stmt->fetch()){
            $row2[] = array("object_id" => $object_id);
        }
        $stmt->close();
        if(!empty($row2)){
            return $row2;
        }else{
            return FALSE;
        }

这里的问题是 MySQL 没有按照我想要的方式比较字符串。所以一串“1000000000”(10)小于“900000000”(9)。

有没有办法做到这一点:

WHERE start_timestamp > ?

遵循与此相同的规则:

ORDER BY CHAR_LENGTH(start_timestamp) ASC, start_timestamp ASC

查询时?

4

1 回答 1

1

您可以对它们进行零填充,然后进行比较:

LPAD(start_timestamp,20,'0') > LPAD(another_timestamp,20,'0')

20 个字符的限制是任意的,您应该酌情更改它。

此外,在表格中存储填充值可能会让您的生活更轻松。

于 2013-09-11T10:27:21.193 回答