2015-01-21 260 views
0

我的表中有两个STRING字段,它们组成日期和时间。我想连接这些字段,将它们转换为日期,以便我可以在选定时间之间获取值。我想我在查询中遇到str_to_date格式的问题。下面是我在表中MySQL选择查询,concat并转换为日期两个字段并与时间间隔进行比较

theDate  theTime 
Mon, Jan 20 7:00 pm 
Mon, Jan 20 9:00 pm 
Tue, Jan 21 5:00 pm 

的PHP:

date_default_timezone_set('EST'); 
//trying to set up the same format as the concatenated fields will be 
$now = date('D, M j g:i a'); 
include('..//db_connect.php'); 
try { 
    $stmt = $conn->query("SELECT * FROM table1 WHERE STR_TO_DATE(CONCAT(theDate, ' ', theTime), '%a, %b %e %l:%i %p') 
     BETWEEN (STR_TO_DATE('$now', '%a, %b %e %l:%i %p') - INTERVAL 4 HOUR AND STR_TO_DATE('$now', '%a, %b %e %l:%i %p') - INTERVAL 10 HOUR)"); 
    $results = $stmt->fetchAll(PDO::FETCH_ASSOC); 
    print_r($results); 
} catch (Exception $e) { 
    echo $stmt."<br>".$e->getMessage(); 
} 

我得到的是语法错误near 'HOURS AND STR_TO_DATE('Wed, Jan 21 7:07', '%a, %b %e %l %i') - INTERVAL 10 HOURS' at line 2。查询有什么问题?另外,有没有办法打印查询本身,查看连接的值,以查看格式化的值?

回答

1

有一点是错误的是小时。必须是小时

+0

现在我刚刚得到'...服务器版本的错误,以便在第2行附近使用正确的语法 – denikov 2015-01-21 12:35:15

0

我认为您需要在某个地方通过...也是您在STR_TO_DATE时错过了冒号:。这是小时奇异 尝试这样的:

// Assuming $now is in the format '2014 Wed, Jan 21 7:07' 
SELECT STR_TO_DATE('$now', '%Y %a, %b %e %l:%i') - INTERVAL 4 HOUR; 

按的问题,我想你可以做这样的分离查询的第二部分:

SELECT STR_TO_DATE('$now', '%Y %a, %b %e %l:%i') - INTERVAL 4 HOUR, STR_TO_DATE('$now', '%a, %b %e %l:%i %p') - INTERVAL 10 HOUR; 

然后显示效果,看看正在查找的实际值是多少。

+0

我刚刚在第2行出现语法错误...... – denikov 2015-01-21 12:36:52

+0

更改括号的BETWEEN为:'BETWEEN(STR_TO_DATE('$ now','%a,%b%e%l%i%p') - INTERVAL 4 HOUR)AND(STR_TO_DATE('$ now','%a, %b%e%l%i%p') - INTERVAL 10 HOUR)' – 2015-01-21 12:38:15

0

这是您的查询:

SELECT * 
FROM table1 
WHERE STR_TO_DATE(CONCAT(theDate, ' ', theTime), '%a, %b %e %l %i %p') 
     BETWEEN (STR_TO_DATE('$now', '%a, %b %e %l %i %p') - INTERVAL 4 HOURS AND 
       STR_TO_DATE('$now', '%a, %b %e %l %i %p') - INTERVAL 10 HOURS) 

这并不完全像MySQL的句法。有几个小问题 - hoursBETWEEN附近的括号,BETWEEN值错误。也许这是你想要的吗?

SELECT * 
FROM table1 
WHERE STR_TO_DATE(CONCAT(theDate, ' ', theTime), '%a, %b %e %l %i %p') 
      BETWEEN date_sub(now(), interval 10 hours) AND 
        date_sub(now(), interval 4 hours); 

您应该在数据库中使用本机类型的日期和时间,而不是将它们存储为字符串。如果他们是字符串,不要给他们名字,如“日期”和“时间”,这表明他们是不是他们的东西。

+0

我这样做的原因是因为表格中的值的格式。它们都是字符串,我想让它们 – denikov 2015-01-21 12:40:15

+0

另外对于我的问题的第二部分...有没有一种方法来回显查询本身,以查看搜索表时使用的格式化值? – denikov 2015-01-21 12:41:04

+0

@denikov ...。对于第二部分,只需在'select'子句中包含'str_to_date()'表达式。 – 2015-01-21 12:50:05

0

我猜你的错误是,你正在使用HOURS代替HOUR,但我建议一个更好的解决方案中使用date_sub()和MySQL now()方法到是这样的:

SELECT * FROM table1 WHERE myDate BETWEEN date_sub(now(), INTERVAL 4 HOUR) AND date_sub(now(), INTERVAL 10 HOUR);

的其他sugestion是拯救日期时间字段为datetime而不是string之后的工作量较少。

+0

我知道这样保存会更好......这不是客户端如何构建数据库的方式。我无法控制值的保存方式 – denikov 2015-01-21 12:43:16

相关问题