我目前正在尝试将以下信息转换为可用的日期字段。
我有以下内容:
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工作,但很乐意接受任何解决方案。 感谢
(感谢为我编辑这些内容的人,我找不到如何为文本提供合适的布局。)
答案 0 :(得分:1)
我不确定我是否正确理解了您的问题,但您只需使用mysql的DATE_ADD函数添加月份(并使用other date/time functions进行操作)
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计算2个日期之间的月份,但它需要特定的格式,而只有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;
我保证,这将始终以1次方式返回正确的日期。 :)