有没有更简便的方法 
我求2个日期之间的相差的小时数,
如下 
所select left(timediff(date1,date2), length(timediff(date1,date2))-6 )这个已经满足要求
但在考虑有更简单的写法  (比如用locate 等 ,最好timediff只出现一次)

解决方案 »

  1.   

    mysql> set @d1='2010-01-03 15:30:00';
    Query OK, 0 rows affected (0.00 sec)mysql> set @d2='2010-01-04 17:40:00';
    Query OK, 0 rows affected (0.00 sec)mysql> select hour(timediff(@d2,@d1));
    +-------------------------+
    | hour(timediff(@d2,@d1)) |
    +-------------------------+
    |                      26 |
    +-------------------------+
    1 row in set (0.02 sec)mysql>
      

  2.   

    hour(timediff(@d2,@d1));
    恒不幸经过检验发现失败       这个hour不能区别正负  ,
    而 select left(timediff(date1,date2), length(timediff(date1,date2))-6 ) 
    通过前面 的- 号 来区分 正负。所以 楼上方法有局限
      

  3.   

    mysql> select SUBSTRING_INDEX(timediff(@d1,@d2),':',1);
    +------------------------------------------+
    | SUBSTRING_INDEX(timediff(@d1,@d2),':',1) |
    +------------------------------------------+
    | -26                                      |
    +------------------------------------------+
    1 row in set (0.00 sec)mysql> select SUBSTRING_INDEX(timediff(@d2,@d1),':',1);
    +------------------------------------------+
    | SUBSTRING_INDEX(timediff(@d2,@d1),':',1) |
    +------------------------------------------+
    | 26                                       |
    +------------------------------------------+
    1 row in set (0.00 sec)mysql>
      

  4.   

    strong 
    不愧是版主 原创  MYSQL:GROUP_CONCAT,SUBSTRING_INDEX的妙用(转) 收藏
     
    在一个表ta中数据为:
    +----+------+
    | id | name |
    +----+------+
    | 1 | a    |
    | 1 | b    |
    | 1 | c    |
    | 1 | d    |
    | 2 | a    |
    | 2 | b    |
    | 2 | c    |
    | 3 | d    |
    +----+------+
    从里面取数据要求完成如下效果:
    +----+--------+
    | id | name    |
    +----+--------+
    | 1 | a,b,c,d |
    | 2 | a,b,c    |
    | 3 | d          |
    +----+--------+
    在MySQL4.1中,加入了GROUP_CONCAT这个函数,我们就可以很轻松的完成这个任务
    SQL代码   1. SELECT `id`,GROUP_CONCAT( ` name ` ORDER BY ` name ` DESC SEPARATOR ',' ) AS name FROM `ta` GROUP BY `id`  但是如果要取得每个ID的前2个数据时即完成如下效果:
    +----+------+
    | id | name |
    +----+------+
    | 1 | a,b    |
    | 2 | a,b    |
    | 3 | d       |
    +----+------+
    因为GROUP_CONCAT函数虽然支持ORDER BY但是却不支持LIMIT,这个时候只能用变通的手段了,用SUBSTRING_INDEX函数,这个函数在MySQL手册中的说明是:
    SQL代码   1. SUBSTRING_INDEX(str,delim, count )   
       2. 返回字符串 str 中在第 count 个出现的分隔符 delim 之前的子串。如果 count 是一个正数,返回从最后的(从左边开始计数)分隔符到左边所有字符。如果 count 是负数,返回从最后的(从右边开始计数)分隔符到右边所有字符:   在上面一个例子中,我们使用“,”来分隔数据,取前面2个,就可以这样写:
    SQL代码   1. SELECT `id`,SUBSTRING_INDEX( SELECT `id`,GROUP_CONCAT( ` name ` ORDER BY ` name ` DESC SEPARATOR ',' ), ',' ,2) AS ` name ` FROM `ta` GROUP BY `id` http://blog.csdn.net/wujumao/archive/2009/09/30/4620784.aspx
    MySQL 字符串函数:字符串截取[作/译者]:鹏城万里    [日期]:2008-09-19    [来源]:本站原创    [查看]: 3423【鹏城万里】 发表于 www.sqlstudy.com
    MySQL 字符串函数:字符串截取MySQL 字符串截取函数:left(), right(), substring(), substring_index()。还有 mid(), substr()。其中,mid(), substr() 等价于 substring() 函数,substring() 的功能非常强大和灵活。1. 字符串截取:left(str, length)mysql> select left('sqlstudy.com', 3);
    +-------------------------+
    | left('sqlstudy.com', 3) |
    +-------------------------+
    | sql                     |
    +-------------------------+2. 字符串截取:right(str, length)mysql> select right('sqlstudy.com', 3);
    +--------------------------+
    | right('sqlstudy.com', 3) |
    +--------------------------+
    | com                      |
    +--------------------------+3. 字符串截取:substring(str, pos); substring(str, pos, len)3.1 从字符串的第 4 个字符位置开始取,直到结束。mysql> select substring('sqlstudy.com', 4);
    +------------------------------+
    | substring('sqlstudy.com', 4) |
    +------------------------------+
    | study.com                    |
    +------------------------------+3.2 从字符串的第 4 个字符位置开始取,只取 2 个字符。mysql> select substring('sqlstudy.com', 4, 2);
    +---------------------------------+
    | substring('sqlstudy.com', 4, 2) |
    +---------------------------------+
    | st                              |
    +---------------------------------+3.3 从字符串的第 4 个字符位置(倒数)开始取,直到结束。mysql> select substring('sqlstudy.com', -4);
    +-------------------------------+
    | substring('sqlstudy.com', -4) |
    +-------------------------------+
    | .com                          |
    +-------------------------------+3.4 从字符串的第 4 个字符位置(倒数)开始取,只取 2 个字符。mysql> select substring('sqlstudy.com', -4, 2);
    +----------------------------------+
    | substring('sqlstudy.com', -4, 2) |
    +----------------------------------+
    | .c                               |
    +----------------------------------+我们注意到在函数 substring(str,pos, len)中, pos 可以是负值,但 len 不能取负值。4. 字符串截取:substring_index(str,delim,count)4.1 截取第二个 '.' 之前的所有字符。mysql> select substring_index('www.sqlstudy.com.cn', '.', 2);
    +------------------------------------------------+
    | substring_index('www.sqlstudy.com.cn', '.', 2) |
    +------------------------------------------------+
    | www.sqlstudy                                   |
    +------------------------------------------------+4.2 截取第二个 '.' (倒数)之后的所有字符。mysql> select substring_index('www.sqlstudy.com.cn', '.', -2);
    +-------------------------------------------------+
    | substring_index('www.sqlstudy.com.cn', '.', -2) |
    +-------------------------------------------------+
    | com.cn                                          |
    +-------------------------------------------------+4.3 如果在字符串中找不到 delim 参数指定的值,就返回整个字符串mysql> select substring_index('www.sqlstudy.com.cn', '.coc', 1);
    +---------------------------------------------------+
    | substring_index('www.sqlstudy.com.cn', '.coc', 1) |
    +---------------------------------------------------+
    | www.sqlstudy.com.cn                               |
    +---------------------------------------------------+ 本文由 www.sqlstudy.com 原创,版权所有,转载请注明作者和出处!本文链接:http://www.sqlstudy.com/sql_article.php?id=2008091902