我有一个MySQL表,它将对象的出生和死亡事件存储为单独的行。我正在尝试编写一个查询,它将在给定时间获得所有“生活对象”。踢球者的出生和死亡时间戳存储为字符串。
系统具有历史方面,需要从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
查询时?
答案 0 :(得分:1)
您可以对它们进行zeropad然后进行比较:
LPAD(start_timestamp,20,'0') > LPAD(another_timestamp,20,'0')
20个字符的限制是任意的,您应该根据需要进行更改。
此外,它可能会让您的生活更容易在表格中存储填充值。