首页 文章

使用sql查询选择最近30天

提问于
浏览
6

我在寻找过去30天内周一,周二,周三,周四,周五,周六,周日的数量 . 我可以在没有实际数据库表的情况下选择最近30天的日期和星期几吗?就像是

SELECT --everything between
convert(date,GETDATE()), DATENAME(DW, GETDATE())
--and
convert(date,GETDATE() - 30), DATENAME(DW, GETDATE())

6 回答

  • 1

    您可以使用递归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
    
  • 1
    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
    
  • 12

    几个解决方案:

    SELECT ... From ... WHERE date > DATEADD(year, -1, GETDATE())
    

    另外,我认为这个声明适用于MySQL:

    select date_sub(now(),interval 30 day)as Datebefore30days;
    
  • 1

    嗯,有几种方法可以做到这一点 .

    • 您可以使用循环和INSERT语句填充临时表,然后选择表的内容 . 实际上,您可以创建一个表值UDF来执行此操作 .

    • 您还可以创建30个SELECT语句,并将它们全部组合在一起 . 但是,坦率地说,我认为你选择1会更好 .

    ETA:想一想,如果你想要的只是过去30天内每周的每一天的数量,你可以用一些数学来做,而不返回30条记录 .

    在任何30天期间,每周每天有4个实例,再加上2天 . 因此,您真正需要的是知道您所在时期的第一天和第二天的哪一天 . 一周中的那些日子有5个实例 .

  • 1

    我很懒,只需加载一个临时表,然后在临时表上选择一个组

    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])
    
  • 1

    在过去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
    

相关问题