2010-08-07 162 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")