我想知道过去30天内星期一到星期日的数量。我是否可以选择最近30天的日期和星期几,而不需要实际的数据库表?类似于:
SELECT --everything between
convert(date,GETDATE()), DATENAME(DW, GETDATE())
--and
convert(date,GETDATE() - 30), DATENAME(DW, GETDATE())
我想知道过去30天内星期一到星期日的数量。我是否可以选择最近30天的日期和星期几,而不需要实际的数据库表?类似于:
SELECT --everything between
convert(date,GETDATE()), DATENAME(DW, GETDATE())
--and
convert(date,GETDATE() - 30), DATENAME(DW, GETDATE())
您可以使用递归CTE:
;WITH CTE AS
(
SELECT convert(date,GETDATE()) sDate, DATENAME(DW, GETDATE()) sDayofWeek
UNION ALL
SELECT DATEADD(DAY,-1,sDate), DATENAME(DW, DATEADD(DAY,-1,sDate))
FROM CTE
WHERE sDate > GETDATE()-29
)
SELECT * FROM CTE
嗯,有几种方法可以做到这一点。
预计时间:思考一下,如果您想要过去30天每天的数量,您可能只需进行一些数学运算即可,而无需返回30条记录。
在任何30天的周期内,每周有4个实例,再加上2天。因此,您真正需要知道的就是您所在周期的第一天和第二天是星期几。这些星期有5个实例。
WITH cteCount AS (
SELECT DATENAME(dw, GETDATE()) dw, 1 ix
UNION ALL
SELECT DATENAME(dw, DATEADD(d, -ix, GETDATE())), ix+1 FROM cteCount WHERE ix<30
)
SELECT dw, COUNT(1) cnt FROM cteCount GROUP BY dw
几种解决方案:
SELECT ... From ... WHERE date > DATEADD(year, -1, GETDATE())
另外,我认为这个语句也适用于MySQL:
select date_sub(now(),interval 30 day)as Datebefore30days;
我很懒,只是加载一个临时表,然后在该临时表上执行分组选择
DECLARE @tmpDates TABLE (calDate DATETIME)
DECLARE @beginDate DATETIME
SET @beginDate = DATEADD(day,-30,GETDATE())
WHILE @beginDate < GETDATE()
BEGIN
INSERT INTO @tmpDates ([calDate]) VALUES (@beginDate)
SET @beginDate = DATEADD(DAY,1,@beginDate)
END
SELECT DATEPART(dw,[calDate]) AS [weekDay], COUNT(1) AS [dayCount]
FROM @tmpDates
GROUP BY DATEPART(dw,[calDate])
最近30天每个星期的点击次数:
SELECT DATENAME(dw,GETDATE())+' 5 times' as results
UNION ALL
SELECT DATENAME(dw,DATEADD(day,-1,GETDATE()))+' 5 times'
UNION ALL
SELECT DATENAME(dw,DATEADD(day,-2,GETDATE()))+' 4 times'
UNION ALL
SELECT DATENAME(dw,DATEADD(day,-3,GETDATE()))+' 4 times'
UNION ALL
SELECT DATENAME(dw,DATEADD(day,-4,GETDATE()))+' 4 times'
UNION ALL
SELECT DATENAME(dw,DATEADD(day,-5,GETDATE()))+' 4 times'
UNION ALL
SELECT DATENAME(dw,DATEADD(day,-6,GETDATE()))+' 4 times'
这实际上是关于将30除以7的问题
这给了我
results
Thursday 5 times
Wednesday 5 times
Tuesday 4 times
Monday 4 times
Sunday 4 times
Saturday 4 times
Friday 4 times