有没有更简便的方法
我求2个日期之间的相差的小时数,
如下
所select left(timediff(date1,date2), length(timediff(date1,date2))-6 )这个已经满足要求
但在考虑有更简单的写法 (比如用locate 等 ,最好timediff只出现一次)
我求2个日期之间的相差的小时数,
如下
所select left(timediff(date1,date2), length(timediff(date1,date2))-6 )这个已经满足要求
但在考虑有更简单的写法 (比如用locate 等 ,最好timediff只出现一次)
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>
恒不幸经过检验发现失败 这个hour不能区别正负 ,
而 select left(timediff(date1,date2), length(timediff(date1,date2))-6 )
通过前面 的- 号 来区分 正负。所以 楼上方法有局限
+------------------------------------------+
| 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>
不愧是版主 原创 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