1

例如:

如果我们在表中有如下记录:

25/06/2009
28/12/2009
19/02/2010
16/04/2011
20/05/2012

我想根据从当前日期开始的 6 个月间隔拆分/选择此日期。结果应该是:从现在开始 0-6 个月:第一次记录 从现在开始 7-12 个月:第二次记录...

如果你把它变得简单,那将非常感激,因为我让它变得非常愚蠢和复杂,比如:

declare variable like t1=curdate()+6 
t2=curdate()+12

...

然后选择记录以适合 curdate() 和 t1,然后是 t1 和 t2 等。

谢谢,

河。

4

5 回答 5

1

更正:如果它倒退,需要使用模数,而不是整数除法 - 抱歉......

如果 MonthCount 是一个计算值,它计算自特定 12 月 31 日以来的月数,并且 mod 是模除法(输出除法后的余数)

Select [Column list here] 
From Table
Group By Case When MonthCount Mod 12 < 6 
         Then 0 Else 1 End  

例如,在 SQL Server 中,您可以使用 DateDiff 函数

Select [Column list here] 
From Table
Group By Case When DateDiff(month, myDateColumn, curdate) % 12 < 6 
         Then 0 Else 1 End

(在 SQL Server 中,百分号是取模运算符)

这会将所有记录分组到每个包含六个月数据的存储桶中

于 2009-05-27T19:25:11.777 回答
0

不完全是你想要完成的,但你可以使用 DATEDIFF 函数来区分每条记录的范围:

SELECT t.MonthGroup, SUM(t.Counter) AS TotalCount
FROM (    
      SELECT Counter, (DATEDIFF(m, GETDATE(), Date) / 6) AS MonthGroup
      FROM Table
     ) t
GROUP BY t.MonthGroup

这将使用表达您想要的日期范围组的表达式创建一个子查询。然后它将按此日期范围组对子查询进行分组,然后您可以对结果做任何您想做的事情。

编辑:我根据您的示例修改了示例。

于 2009-05-27T19:40:30.030 回答
0

如果您使用的是 SQL Server:

SELECT *,
    (
        FLOOR
        (
            (
                DATEDIFF(month, GETDATE(), date_column)
                - CASE WHEN DAY(GETDATE()) > DAY(date_column) THEN 1 ELSE 0 END
            ) / 6.0
        ) * 6
    ) AS SixMonthlyInterval
FROM your_table

如果您使用的是 MySQL:

SELECT *,
    (
        FLOOR
        (
            (
                ((YEAR(date_column) - YEAR(CURDATE())) * 12)
                + MONTH(date_column) - MONTH(CURDATE())
                - CASE WHEN DAY(CURDATE()) > DAY(date_column) THEN 1 ELSE 0 END
            ) / 6.0
        ) * 6
    ) AS SixMonthlyInterval
FROM your_table
于 2009-05-29T00:49:28.487 回答
0
SELECT (DATEDIFF(MONTH, thedate, GETDATE()) / 6) AS semester,
       SUM(receipt)
FROM thetable
GROUP BY semester
ORDER BY semester

关键思想是按为您提供“学期”的表达式进行分组和排序。

于 2009-05-27T19:28:55.513 回答
0

这个问题真的让我很困惑,因为我实际上无法想出一个简单的解决方案。该死。

我能做到的最好的就是对以下内容进行绝对的混蛋,您可以在其中创建一个临时表,将“期间”插入其中,重新加入您的原始表,然后将其分组。

假设您的内容表具有以下内容

ID int
Date DateTime
Counter int

你试图counter在六个月的时间内总结所有的

DECLARE @min_date datetime
select @min_date = min(date) from test

DECLARE @max_date datetime
select @max_date = max(date) from test


DECLARE @today_a datetime
DECLARE @today_b datetime
set @today_a = getdate()
set @today_b = getdate()

CREATE TABLE #temp (startdate DateTime, enddate DateTime)

WHILE @today_a > @min_date
BEGIN
    INSERT INTO #temp (startDate, endDate) VALUES (dateadd(month, -6, @today_a), @today_a)
    SET @today_a = dateadd(month, -6, @today_a)
END
WHILE @today_b < @max_date
BEGIN
    INSERT INTO #temp (startDate, endDate) VALUES (@today_b, dateadd(month, 6, @today_b))
    SET @today_b = dateadd(month, 6, @today_b)
END

SELECT * FROM #temp

SELECT 
    sum(counter), 
    'Between ' + Convert(nvarchar(10), startdate, 121) + ' => ' +  Convert(nvarchar(10), enddate, 121) as Period
FROM test t
    JOIN #Temp ht
        ON t.Date between ht.startDate AND ht.EndDate
GROUP BY 
    'Between ' + Convert(nvarchar(10), startdate, 121) + ' => ' +  Convert(nvarchar(10), enddate, 121)

DROP TABLE #temp

我真的希望有人能想出一个更好的解决方案,我的大脑显然已经融化了。

于 2009-05-27T19:29:00.147 回答