2010-08-07 165 views
0

我有这样的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

“能在4小时或3天” - 它不能4 HOUR3 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: ... 
1

你不能,你要解决的是:

"`table1`.`DateField` >= DATE_SUB(NOW(), 
    INTERVAL {$hoursOrDays} ".($isDays?"DAY":"HOUR")