2016-05-17 32 views
1

我有一列有創建行時的時間戳。MySQL選擇創建日期的顯示編號

我需要找到一種方式來獲得全部來自同一個「日」的行,並給每行顯示數字顯示是這樣的:

+---------------------+ 
| order_date   | // output should be: 
+---------------------+ 
| 2016-05-11 13:01:41 | // 2016051101 
| 2016-05-11 15:54:14 | // 2016051102 
| 2016-05-11 17:16:18 | // 2016051103 
| 2016-05-11 17:35:12 | // 2016051104 
| 2016-05-11 17:55:16 | // 2016051105 
| 2016-05-12 07:16:48 | // 2016051201 
| 2016-05-12 09:30:57 | // 2016051202 
| 2016-05-12 09:56:19 | // 2016051203 
| 2016-05-13 11:27:21 | // 2016051301 
| 2016-05-14 10:15:56 | // 2016051401 
| 2016-05-15 11:35:07 | // 2016051501 
| 2016-05-15 11:39:48 | // 2016051502 
| 2016-05-15 11:40:12 | // 2016051503 
+---------------------+ 

的Mysql能做到這一點?或者應該像php一樣處理這個問題?


最終的查詢使用:

SELECT t.order_date, 
    concat(
    DATE_FORMAT(t.order_date, '%Y%m%d'), 
    LPAD(
(SELECT COUNT(*) FROM hz_order s WHERE s.order_date<= t.order_date AND DATE(s.order_date) = DATE(t.order_date)), 
2, 
0))display 
    FROM hz_order t 
    ORDER BY `display` ASC 
+2

是的。或者是。 :-) – Strawberry

+1

我有點不確定是否希望選擇查詢也能生成並插入訂單號,或訂單號是否全部就緒。 – Epodax

+0

沒有插入需要,訂單有它的id,但具有日計數的訂單號僅用於顯示。 –

回答

3

是的,你可以用相關的查詢做,像這樣:

SELECT t.order_date, 
     concat(DATE_FORMAT(t.order_date, '%Y%m%d'), 
       (SELECT COUNT(*) FROM YourTable s 
       WHERE s.order_date<= t.order_date 
       AND DATE(s.order_date) = DATE(t.order_date))) 
FROM YourTable t 

這將生成日期爲YYYYMMDD +計數。

+0

我試過了,但是顯示語法錯誤。 –

+0

你能告訴我這個錯誤嗎? – sagi

+0

在第6行'FROM hz_order t'附近使用的正確語法 –

0

是的,你可以做到這一點 -

SELECT CONCAT(DATE_FORMAT(date_field, '%Y%m%d'), 
LPAD(COUNT(date_field), 2, '0')) 
FROM table_name 
GROUP BY DATE(date_field) 
ORDER BY date_field DESC 

DATE_FORMAT(date_field, '%Y%m%d')將日期格式類似yyyymmdd

LPAD(COUNT(date_field), 2, '0')會生成一個字符串,用左邊距填充(0)到2個位置,並計算該日期。

+0

我得到一個錯誤:#1055 - 表達#1的SELECT列表不在GROUP BY子句中,並且包含非聚集列'projecthz.hz_order.order_date',它在功能上不依賴於GROUP BY子句中的列;這與sql_mode = only_full_group_by –

+0

不兼容,即使沒有FULL_GROUP_BY,這也不太正確。這將簡單地將字符串連接到當天所有值的計數。 – Strawberry

0

下面是使用MySQL的一種方法。其他方法在更大的數據集上會更快。

SELECT x.* 
    , CONCAT(DATE_FORMAT(x.order_date,'%Y%m%d'),LPAD(COUNT(*),2,0))oi 
    FROM my_table x 
    JOIN my_table y 
    ON DATE(y.order_date) = DATE(x.order_date) 
    AND y.order_date <= x.order_date 
GROUP 
    BY x.order_date;