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