微软 SQL:
我有一个将字符串转换为日期然后聚合的数据库查询:
WEEK(CAST(myDateField as DATE)) AS dt
...
GROUP BY dt
但是,此WEEK
函数返回一个数字。如果我有多年,我需要添加一个YEAR()
功能。有没有更好的方法来CAST/CONVERT
处理一个日期字段?如果日期也以日期格式按周聚合,那会很好(甚至更可取):
2010-01-07
2010-01-14
2010-01-21 等
微软 SQL:
我有一个将字符串转换为日期然后聚合的数据库查询:
WEEK(CAST(myDateField as DATE)) AS dt
...
GROUP BY dt
但是,此WEEK
函数返回一个数字。如果我有多年,我需要添加一个YEAR()
功能。有没有更好的方法来CAST/CONVERT
处理一个日期字段?如果日期也以日期格式按周聚合,那会很好(甚至更可取):
2010-01-07
2010-01-14
2010-01-21 等
在 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
我不确定你想要什么作为输出。似乎您正试图获得每周的第一个日期。
如果您的数据“密集”(意味着您在每个日期都有数据),您可以执行以下操作:
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 by
和select
具有相同的论点。