2010-11-17 126 views
1

为了简单起见,我有一个表中的两个字段:用另一个字段中的单个INT更新MySQL日期字段?

  • 日期1(YYYY-MM-DD格式)
  • 日(单或两位数字的天格式,1-31)

我希望能够使用Day内的值更新Date 1,但我不想多次调用(首先选择,读取结果,然后使用同一个表的结果更新)。

最终在我的呼叫的 '设计'(其不工作)将是:

UPDATE SET表日期1 = DATE(Y-(M + 1) - 天的(值) );

或在PHP中:

date("Y-m-d", mktime(0,0,0,date('m')+1, VALUE(Day), date('Y'))); 

这可能吗?

UPDATE

==

虽然我已经能够利用一些下面的代码,我不知道MySQL是“聪明”,足以运行计算,因为我有它。我的新代码是:

UPDATE表设置日期1 = CONCAT(YEAR(CURDATE()), ' - ',MONTH(ADDDATE(CURDATE(), 间隔1个月)), ' - ', Day1)

虽然这会返回正确的“新月”和“新的一天”,但当当月是十二月时,年份将错误。

例如:如果当前日期是2010-12-02。 Day字段中的首选数据为12.处理完脚本后,Date 1字段应更新为2011-01-12,但在上面的代码中,它只会输出到2010-01-12。

+0

我不明白你在做什么。 “日”是否存储实际的日期日期编号,或者是否将其递增?我认为摆脱你的Day字段和使用日期操作函数会让你更容易。通过使用两列来存储您可以从其中获得的相同数据,会产生很大的风险。 – Cfreak 2010-11-17 15:47:20

+0

@Cfreak - 它不是相同的数据。日期1字段可以随时更新,但是当某些操作发生时,该字段的DAY部分将更新为存储在日期字段中的值。至于你的最后一点,有两个“类似”数据的字段,其中一个是tinyint并不是“很大的风险” – JM4 2010-11-17 15:49:25

回答

1

没有测试过,但我认为你缺少的是CONCAT

UPDATE table SET datefield = CONCAT(YEAR(datefield),'-',MONTH(datefield),'-',dayfield); 

重读你questioon后,这听起来像你想添加的天,那会是这样(没有测试过,太 - 看看DATE_ADD and INTERVAL):

UPDATE table SET datefield = DAT_ADD(datefield, INTERVAL dayfield DAYS); 
+0

你有问题的第一部分是完全正确的,现在唯一的'额外'是增加MONTH值由一个(所以当记录被更新时,月份增加一个,日期值被改变(如你的代码那样)并且年份相应地相应(即如果更新发生在2010年12月2日;日期字段是12;在进程运行后,日期1现在是2011年1月12日 – JM4 2010-11-17 16:11:54

+0

我不希望'添加'天,只能将该天改为下一个月。 – JM4 2010-11-17 16:13:58

相关问题