For the last three hours:
WHERE column BETWEEN DATE_SUB(NOW(), INTERVAL 3 HOUR)
AND NOW()
For the last seven hours:
WHERE column BETWEEN DATE_SUB(NOW(), INTERVAL 7 HOUR)
AND NOW()
For the last twelve hours:
WHERE column BETWEEN DATE_SUB(NOW(), INTERVAL 12 HOUR)
AND NOW()
If you're wanting to specify a data as a string, use:
WHERE column BETWEEN DATE_SUB(STR_TO_DATE('2010-07-08 07:57:45', '%Y-%m-%d %T'), INTERVAL 3 HOUR)
AND STR_TO_DATE('2010-07-08 07:57:45', '%Y-%m-%d %T')
...though honestly, you could use this just as well:
WHERE column BETWEEN STR_TO_DATE('2010-07-08 04:57:45', '%Y-%m-%d %T')
AND STR_TO_DATE('2010-07-08 07:57:45', '%Y-%m-%d %T')
If that doesn't work, then I wonder if the column is storing values as strings/varchar rather than DATETIME.
Reference: