0

我目前正在尝试将以下信息转换为可用的日期字段。

我有以下内容:

Date      |Period|Product

0000-00-00|   31 |Skies

0000-00-00|  17  |Shoes

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

期间是自四月财政年度以来的月数。

        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,但是由于我正在使用的 Period 表是倒退的(也是我见过的最糟糕的事情) DateDiff 没有做我需要的事情。

它没有做我需要的原因是第 24 期(2011-03)之后的月份是第 1 期(2011-04)所以它不是连续的。它只是愚蠢的。同样适用于期间 36 (2010-03) 下一个期间是 25 (2010-04)

任何能解决这个问题的人都会立即赢得我的尊重。天哪,这很难解决。

在 MYSQL 中工作,但乐于接受任何解决方案。谢谢

(感谢为我编辑这些东西的人,我找不到如何给文本一个像样的布局。)

4

1 回答 1

1

我不确定我是否正确理解了您的问题,但您可以简单地使用 mysql 的DATE_ADD函数将月份添加到日期中(并使用其他日期/时间函数来操作它们)

所以 2012 年 4 月加上 4 给你八月,这就是你要找的,对吧?

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)

计算两个日期之间的月份是用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 |
+------------+

在我让我的大脑休息之后终于发现,它是那些森林 - 树的东西之一。;)

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;

我保证,这将始终一举返回正确的日期。:)

于 2012-06-17T23:02:02.393 回答