1. DATEDIFF函数
格式:DATEDIFF(date1, date2)
该函数用于求解 date1 与 date2 之间的** 天数 **之差。
例如:
SELECT DATEDIFF('2015-09-16', '2015-09-17') AS diffDay
结果为 -1。
从结果可以看出,该函数的比较是通过 date1 - date2,若结果为正数,表明 date1 大于 date2,否则表示 date1 小于 date2。
这个函数其实就是这么简单,但是经过我的一番度娘发现,这个函数在SQL Server数据库却有着更加复杂的实现。
格式:DATEDIFF(datepart, startdate, enddate)
其中datepart是表示要比较的时间范围,参考值如下表,startdate表示起始时间,enddate表示终止时间。
datepart | 缩写 |
---|---|
年 | yy,yyyy |
季度 | qq,q |
月 | mm,m |
年中的日 | dy,y |
日 | dd,d |
周 | wk,ww |
星期 | dw, w |
小时 | hh |
分钟 | mi, n |
秒 | ss, s |
毫秒 | ms |
微妙 | mcs |
纳秒 | ns |
<em> 个人感觉比较常用的是年、月、日、周、时、分、秒,其他几个俺木有使用过。</em>
使用这个函数完成MySQL的DATEDIFF函数的功能只需如下SQL语句。
SELECT DATEDIFF(d, '2015-09-16', '2015-09-17') AS diffDay
那么在MySQL中如何实现SQL Server中DATEDIFF函数类似的功能呢,那就需要用到TIMESTAMPDIFF函数了。
格式:TIMESTAMPDIFF(interval,datetime_expr1,datetime_expr2)
其中interval类似于SQL Server中DATEDIFF函数的datepart参数,取值如下表。
interval | 值 |
---|---|
FRAC_SECOND | 毫秒 |
SECOND | 秒 |
MINUTE | 分钟 |
HOUR | 小时 |
DAY | 天 |
WEEK | 星期 |
MONTH | 月 |
QUARTER | 季度 |
YEAR | 年 |
同样可以使用这个函数来MySQL中DATEDIFF函数的功能,只需使用如下的SQL语句。
SELECT TIMESTAMPDIFF(day, '2015-09-16', '2015-09-17') AS diffDay
因此,在使用MySQL求时间差时,建议使用TIMESTAMPDIFF函数,在SQL Server中求时间差时,使用DATEDIFF函数。
2.GROUP_CONCAT函数
格式:GROUP_CONCAT([DISTINCT] field [ORDER BY ASC/DESC fieldname] [SEPARATOR 'separator']
该函数的作用是可以结合group by语句进行数据表的“行列转换”,将相同分组的某字段的值通过分隔符拼接到一个字段中。
例如:
原始表student_course:
id | student_id | course_name |
---|---|---|
1 | 1 | 数据结构 |
2 | 1 | 计算机组成原理 |
3 | 2 | 数据结构 |
4 | 3 | 高等数学 |
5 | 3 | 算法分析 |
执行下面的SQL语句将得到如下结果。
SELECT student_id, GROUP_CONCAT(name) as names FROM student_course group by student_id
结果:
student_id | names |
---|---|
1 | 数据结构,计算机组成原理 |
2 | 数据结构 |
3 | 高等数学,算法分析 |
如果仅是需要展示数据,那么这样的结构也许可以满足需求,但是有些时候,我们可能需要进行真正的行列转换,那就需要使用到其他的函数了,可以参考下列文章。
http://www.cnblogs.com/oneivan/archive/2012/02/16/2353796.html
http://blog.csdn.net/kiki113/article/details/4105929