SQL日期时间转换
问题描述:
我有这样的SQL:SQL日期时间转换
`table1`.`DateField` >= DATE_SUB(NOW(), INTERVAL {$days} DAY
我table1.DateField是在2010-03-10 10点05分50秒的格式。
{$ days}的值可能是4小时或3天。我怎样才能使上述的SQL聪明足以知道这一点?我应该使用
`table1`.`DateField` >= DATE_SUB(NOW(), INTERVAL {$days} DAY_HOUR
答
“能在4小时或3天” - 它不能4 HOUR
或3 DAY
?
您是否必须担心无效单位甚至恶意(用户)输入?
您可以测试给定的字符串,并将单位“转换”为MySQL可以理解的内容。
<?php
$pattern = '!^(\d+) (.+)$!';
$units = array(
'days'=>'DAY',
'hours'=>'HOUR',
'minutes'=>'MINUTE'
);
foreach(array('14 days', '7 hours', '11 hours', '1 or 1=1') as $userinput) {
echo "\n", $userinput, ': ';
if (!preg_match($pattern, $userinput, $m) || !isset($units[$m[2]])) {
echo "error, cause: ...\n";
continue;
}
$sql = sprintf(' ...
WHERE
`table1`.`DateField` >= Now() - INTERVAL %d %s', $m[1], $units[$m[2]]
);
echo $sql, "\n";
}
打印
14 days: ...
WHERE
`table1`.`DateField` >= Now() - INTERVAL 14 DAY
7 hours: ...
WHERE
`table1`.`DateField` >= Now() - INTERVAL 7 HOUR
11 hours: ...
WHERE
`table1`.`DateField` >= Now() - INTERVAL 11 HOUR
1 or 1=1: error, cause: ...
答
你不能,你要解决的是:
"`table1`.`DateField` >= DATE_SUB(NOW(),
INTERVAL {$hoursOrDays} ".($isDays?"DAY":"HOUR")