按日期分组的最简单方法

时间:2013-07-29 22:09:52

标签: sql

Microsoft SQL:

我有一个数据库查询,它将字符串转换为日期然后聚合:

WEEK(CAST(myDateField as DATE)) AS dt
...
GROUP BY dt

但是,此WEEK函数返回一个数字。如果我有多年,我需要添加YEAR()函数。有没有更好的方法CAST/CONVERT这个到一个日期字段?如果日期按星期汇总并带有日期格式,那就没问题了(甚至更好):

2010-01-07
2010-01-14
2010-01-21等

2 个答案:

答案 0 :(得分:1)

在MySQL中有功能:STR_TO_DATE()

您必须指定日期格式,例如:

STR_TO_DATE('2013-05-01','%Y-%m-%d');

对于MSSQL,您需要按格式ID定义日期的确切格式:

SELECT convert(datetime, '10/23/2016', 101) -- mm/dd/yyyy

SELECT convert(datetime, '2016.10.23', 102) -- yyyy.mm.dd

SELECT convert(datetime, '23/10/2016', 103) -- dd/mm/yyyy

SELECT convert(datetime, '23.10.2016', 104) -- dd.mm.yyyy

SELECT convert(datetime, '23-10-2016', 105) -- dd-mm-yyyy

答案 1 :(得分:1)

我不确定你想要什么作为输出。您似乎想要获得每周的第一个日期。

如果您的数据“密集”(意味着每个日期都有数据),您可以执行以下操作:

select min(myDateField) as dt
...
GROUP BY year(myDateField), week(myDateField);

尽管您的代码中有cast(),但我相信名为“MyDateField”的字段会存储为日期/日期时间而不是字符串。

如果您想将日期转换为ISO标准:

select convert(varchar(10), min(myDateField), 121),  -- puts it in YYYY-MM-DD format (my favorite)

最后,也许你根本不想使用week()。也许你只是想找到一周的第一天。您可以通过从日期中减去星期几来完成此操作:

select dateadd(dd, datepart(dw, 1 - myDateField), myDateField) as dt
...
GROUP BY dateadd(dd, datepart(dw, 1 - myDateField), myDateField);

使用此结构,group byselect具有相同的参数。