0

私は現在、次の情報を使用可能な日付フィールドに変換しようとしています。

私は次のものを持っています:

Date      |Period|Product

0000-00-00|   31 |Skies

0000-00-00|  17  |Shoes

0000-00-00|   4  |Etc...

期間は、4月会計年度からの月数です。

        Apri|May|June|July|Augu|Sept|Octo|Nove|Dece|Janu|Febu|Marc
2012   |1   |2  |3   |4   |5   |6   |7   |8   |9   |10  |11  |12    (Ends March 2013)

2011   |13  |14 |15  |16  |17  |18  |19  |20  |21  |22  |23  |24    (Ends March 2012)

2010   |25  |26 |27  |28  |29  |30  |31  |32  |33  |34  |35  |36    (Ends March 2011)

結果として私が探しているのは

Date      |Period|Product

2010-10-00|   31 |Skies

2011-08-00|  17  |Shoes

2012-07-00|   4  |Etc...

私はDateDiffを試しましたが、作業中のピリオドシートが逆方向になっているため(そしてこれまでに見た中で最悪のことです)、DateDiffは必要なことを実行しません。

必要なことを実行していない理由は、期間24(2011-03)の翌月が期間1(2011-04)であるため、連続していないためです。そのすぐ下の愚かな。同じことが期間36(2010-03)にも当てはまります。次の期間は25(2010-04)です。

これを解決できる人は誰でも私の即座の尊敬を得る。良い神々これはうまくいくのが苦痛でした。

MYSQLで作業していますが、どんな解決策でも喜んで引き受けます。ありがとう

(私のために編集してくれた人のおかげで、テキストに適切なレイアウトを与える方法を見つけることができませんでした。)

4

1 に答える 1

1

あなたの質問を正しく理解しているかどうかはわかりませんが、mysql のDATE_ADD関数を使用して日付に月を追加するだけです (そして、他の日付/時刻関数を使用してそれらを操作します) 。

2012 年 4 月に 4 を足すと 8 月になります。

SELECT DATE_ADD(CONCAT(2012,'-04-01'),INTERVAL 4 MONTH),
MONTHNAME(DATE_ADD(CONCAT(2012,'-04-01'),INTERVAL 4 MONTH));


+--------------------------------------------------+-------------------------------------------------------------+
| DATE_ADD(CONCAT(2012,'-04-01'),INTERVAL 4 MONTH) | MONTHNAME(DATE_ADD(CONCAT(2012,'-04-01'),INTERVAL 4 MONTH)) |
+--------------------------------------------------+-------------------------------------------------------------+
| 2012-08-01                                       | August                                                      |
  +--------------------------------------------------+-------------------------------------------------------------+
1 row in set (0.00 sec)

編集:あなたが計算したいのは、今年の4月から与えられたデータである可能性があるという印象を受けます-テーブル内の月は、DATE_SUBで行われます。ご覧のとおり、YEAR() および NOW() 関数を使用して現在の年を取得できます。

SELECT DATE_SUB(CONCAT(YEAR(NOW()),'-04-01'),INTERVAL 4 MONTH),
MONTHNAME(DATE_SUB(CONCAT(YEAR(NOW()),'-04-01'),INTERVAL 4 MONTH));


+---------------------------------------------------------+--------------------------------------------------------------------+
| DATE_SUB(CONCAT(YEAR(NOW()),'-04-01'),INTERVAL 4 MONTH) | MONTHNAME(DATE_SUB(CONCAT(YEAR(NOW()),'-04-01'),INTERVAL 4 MONTH)) |
+---------------------------------------------------------+--------------------------------------------------------------------+
| 2011-12-01                                              | December                                                           |
+---------------------------------------------------------+--------------------------------------------------------------------+
1 row in set (0.02 sec)

2 つの日付の間の月の計算はPERIOD_DIFFで行われますが、特定の形式が必要で、1 桁しかない月には先頭に 0 を追加する必要があります。

SELECT 
PERIOD_DIFF(CONCAT(YEAR(NOW()),'04'),    -- year + '04' for YYYYMM
            CONCAT(YEAR('2011-08-01'),   -- year YYYY
                   IF(MONTH('2011-08-01') < 10, -- got 2 digits for month?
                       CONCAT('0',MONTH('2011-08-01')), -- no, prepend '0' 
                       MONTH('2011-08-01')) -- yes just return month
             )
) AS difference;

+------------+
| difference |
+------------+
|          8 |
+------------+

脳を休ませてようやく見つけたのは、森のようなものの 1 つだった。;)

SET @period=15;  

SELECT DATE_ADD(  -- use date_add so we can go back and forwards in time
  CONCAT(YEAR(NOW()) - FLOOR(IF(@period < 10,0,IF(@period < 12,-1,@period/12 - IF(@period%12 = 0,2,0))) ) ,'-03-01'), -- start from march this year so +1  equals april, subtract 1 year per 12 months
INTERVAL
 IF(@period%12 < 10,@period%12,@period%12 - 12) -- ignore the full years, if rest < 10 add (APR - DEC) else subtract (rest - 12 to get negative number)
MONTH) 
AS result;

これは常に 1 回の急襲で正しい日付を返すことを保証します。:)

于 2012-06-17T23:02:02.393 に答える