1

例:

次のようなテーブルレコードがある場合:

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

現在の日付から始まる 6 か月間隔に従って、この日付を分割/選択したいと考えています。結果は次のようになります: 今から 0 ~ 6 か月後: 最初のレコード 今から 7 ~ 12 か月後: 2 番目のレコード ...

次のように非常にばかげて複雑にしたので、これを単純にすると、非常に高く評価されます。

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

...

次に、curdate() と t1、次に t1 と t2 などの間に収まるようにレコードを選択します。

ありがとう、

r.

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 では、パーセント記号はモジュラス演算子です)

これにより、すべてのレコードがそれぞれ 6 か月分のデータを含むバケットにグループ化されます

于 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
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そして、すべての を 6 か月で合計しようとしています。

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 に答える
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 に答える