2017-04-14 81 views
1

下面的代碼可以正常工作,但我想將日期的形狀更改爲「2017年3月1日「而不是 」2017年3月1日「SQL:顯示「2017年3月01日」而不是「2017-03-01」與組

SELECT 
    * 
FROM 
( 
    SELECT 
     [MessageType].[Name], 
     CASE WHEN (Format([OccuredAtUtc], 'yyyy-MM-dd') LIKE '2017-03%') THEN Format([OccuredAtUtc], 'yyyy-MM-dd') 
      ELSE NULL               
      END AS [Time], 
     COUNT(*) AS [Count] 
    FROM @Table 
    INNER JOIN @Table ON 
    GROUP BY Format([OccuredAtUtc], 'yyyy-MM-dd'), 
      [MessageType].[Name] 
) s 
WHERE ([Time] IS NOT NULL) 
ORDER BY [Time] ASC 

OUTUPUT:

NAME_______TIME______COUNT____ 
HTTP 2017-03-01 21 
HTTP 2017-03-02 37 
HTTP 2017-03-03 42 
. 
. 
HTTP 2017-03-31 29 
  • 但是,如果使用CONVERT(VARCHAR(11),[OccuredAtUtc],106)THEN在我的代碼後,有一個與GROUP()的一個問題 ING所以我沒有得到的日期計算正確了

一下如果我嘗試使用 CONVERT(VARCHAR 11 [OccuredAtUtc],106)代碼:

//一切變爲被comented ... 2個東西

SELECT 
    * 
FROM 
( 
    SELECT 
     [MessageType].[Name], 
     CASE WHEN (Format([OccuredAtUtc], 'yyyy-MM-dd') LIKE '2017-03%') THEN CONVERT(VARCHAR(11), [OccuredAtUtc], 106)  --Format([OccuredAtUtc], 'yyyy-MM-dd') 
      ELSE NULL               
      END AS [Time], 
     COUNT(*) AS [Count] 
    FROM @Table 
    INNER JOIN @Table ON 
    GROUP BY [OccuredAtUtc], --Format([OccuredAtUtc], 'yyyy-MM-dd') 
      [MessageType].[Name] 
) s 
WHERE ([Time] IS NOT NULL) 
ORDER BY [Time] ASC 

我得到這個NON GROUPED OUTPUT:

HTTP 01 Mar 2017 1 
HTTP 01 Mar 2017 1 
HTTP 01 Mar 2017 1 
HTTP 01 Mar 2017 2 
HTTP 01 Mar 2017 1 
HTTP 01 Mar 2017 1 
. 
. 
HTTP 02 Mar 2017 1 
. 
. 
HTTP 31 Mar 2017 1 

想有一些問題與數據類型

或與GROUP BY [OccuredAtUtc] ...(從端部5行) ...如果我在GROUP BY中使用整個「CONVERT(VARCHAR(11),[OccuredAtUtc],106)」,則會跳出一個錯誤

這是否有一些簡單的解決方案?我只需要獲得格式,與「2017年3月1日」的日期輸出...

在[OccuredAtUtc]原日期:

2017-03-01 12:16:58.5080000 
2017-03-01 18:11:53.3090000 
2017-03-01 18:34:18.3090000 
2017-03-01 20:42:28.8570000 
2017-03-01 21:10:36.7070000 
. 
. 
. 

預先感謝您!

+0

而是使用的轉換在內部選擇查詢。你可以嘗試在外部選擇轉換,取代選擇*使用選擇colnames,轉換(varchar(11),datecolumn,106) – Kapil

回答

2

您的查詢似乎不必要的複雜。我想這你想要做什麼:

SELECT [MessageType].[Name], 
     CONVERT(VARCHAR(11), [OccuredAtUtc], 106) AS [Time], 
     COUNT(*) AS [Count] 
FROM @Table t INNER JOIN -- I assume these table names are not the real name 
    @Table t2 
    ON . . . 
WHERE OccuredAtUtc >= '2017-03-01' AND 
     OccuredAtUtc < '2017-04-01' 
GROUP BY (CONVERT(VARCHAR(11), [OccuredAtUtc], 106), 
     [MessageType].[Name] 

注:

  • 你並不需要一個子查詢。
  • FROM條款過於簡化;我假設表名不是@table
  • 使用where子句過濾之前的聚合。這比聚合後過濾更有效。
  • 在日期上進行直接比較比在列上使用函數調用(可使用索引過濾行)更有效。
+0

非常感謝你@Gordon Linof!這幫了我很多。 :) –

0

如果你使用SQL Server 2012+,你可以使用FORMAT功能,這是FORMAT(DateColumn,'dd MMM yyyy')

相關問題