2017-04-14 40 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')

相关问题