我有一個日期字段在查詢中,我也希望得到GROUP BY報告是這樣的:如何在SQL Server中按YEAR-MM對DATE字段進行分組?
DATE COUNT
2010-01 10
2010-02 2
...
2010-12 24
2012-13 34
什麼是正確的語法獲取此SQL Server上?
我有一個日期字段在查詢中,我也希望得到GROUP BY報告是這樣的:如何在SQL Server中按YEAR-MM對DATE字段進行分組?
DATE COUNT
2010-01 10
2010-02 2
...
2010-12 24
2012-13 34
什麼是正確的語法獲取此SQL Server上?
所有這些轉換爲字符串的工作,但我覺得這種方法更有效,儘管不那麼易讀:
SELECT m = DATEADD(MONTH, DATEDIFF(MONTH, 0, [DATE]), 0), COUNT(*)
FROM dbo.TheTable
GROUP BY DATEADD(MONTH, DATEDIFF(MONTH, 0, [DATE]), 0);
如果你不想重複表達,則:
;WITH x AS (SELECT m = DATEADD(MONTH, DATEDIFF(MONTH, 0, [DATE]), 0)
FROM dbo.TheTable)
SELECT m, COUNT(*)
FROM x GROUP BY m;
這種方式輸出仍然是一個日期/時間值,可以用於其他事情。它不涉及任何雜亂的字符串轉換。
我認爲一個轉換爲字符串比使用多個日期函數的工作更少。這真的更有效率嗎? – RedFilter
@RedFilter這將產生與單個字符串轉換完全相同的計劃。獎勵是作爲日期時間類型保留的 - 所以你可以格式化輸出,如果你想,但你仍然可以使用它作爲日期時間類型。 –
@RedFilter其實我可以證明我爲什麼總是使用日期時間操作。在這些封面之下,這些真的是非常簡單的使用整數的數學運算,已知比字符串更高效。與轉換/分組完全相同的查詢是唯一的區別是使用日期操作而不是字符串分組更快速:秒http://sqlfiddle.com/#!6/b155e/10 –
SELECT CAST(DATEPART(year, dateCol) as VARCHAR) + '-' + CAST(DATEPART(month, dateCol) as VARCHAR) as Date, count(*) As Count
FROM myTable
GROUP BY CAST(DATEPART(year, dateCol) as VARCHAR) + '-' + CAST(DATEPART(month, dateCol) as VARCHAR)
事實上,要獲得當月的前導零,你需要使用這個語句來代替SELECT CONVERT(VARCHAR(7),GETDATE(),120) – Mangist
Varchar沒有長度? Nooooooo .... http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/bad-habits-to-kick-declaring-varchar-without-length.aspx –
@AaronBertrand它被記錄爲'varchar '''鑄造'和'轉換'的目的默認長度爲'30'。我一直在使用它,同時永遠不會忘記在任何其他地方指定長度。 – GSerg
你可以簡單地做:
select convert(char(7), @myDate, 20)
例
declare @myDate as DateTime
set @myDate = '2012-06-23'
select convert(char(7), @myDate, 20)
輸出
-------
2012-06
。因此完整的語句應該是這樣的:
select convert(char(7), myDate, 20), count(*) as Count
from MyTable
group by convert(char(7), myDate, 20)
更新
樣本數據包括價值2012-13
。我會假設這是一個錯字,短劃線之後的數字代表該月份。
CONVERT(VARCHAR(7), CreationDate, 120) as Date
不,這個線程是在Mysql語法上,這是SQL Server – Mangist
@Mangist:答案SeanJohnson鏈接到SQL Server將會工作 - 它比這裏的答案更清晰 – Andomar
等一下,什麼是'2012- 13'? 13是一年中的哪一週? – RedFilter