例如:
如果我们有以下表格记录:
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等。
谢谢,
河
答案 0 :(得分: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中,百分号是模数运算符)
这会将所有记录分组到每个包含六个月数据的存储桶
答案 1 :(得分:0)
SELECT (DATEDIFF(MONTH, thedate, GETDATE()) / 6) AS semester,
SUM(receipt)
FROM thetable
GROUP BY semester
ORDER BY semester
关键的想法是通过表达式进行分组和排序,为您提供“学期”。
答案 2 :(得分: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
我真的希望有人可以提出一个更好的解决方案,我的大脑明显已经融化了。
答案 3 :(得分: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
这将创建一个子查询,其表达式表示您想要的日期范围组。然后,它会按此日期范围组对子查询进行分组,然后您可以根据结果执行任何操作。
编辑:我根据您的示例修改了示例。
答案 4 :(得分: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