【问题标题】:MySQL. Start new row in case of end of monthmysql。在月底开始新行
【发布时间】:2017-10-06 09:08:55
【问题描述】:

我想知道有没有办法解决这个问题。

所以我的行有一个日期类型的列,每天增加 1 天(直到相应的月底)。在新月份的开始,必须生成一个新行,并且更新将重新开始,直到该月的那天,依此类推..

【问题讨论】:

  • 是什么导致日期每天递增?
  • 如何创建初始行?我想你必须用你的编程语言而不是 sql 来捕捉它。
  • 您好,我正在使用 ETL,Talend。在 tMysqlInput 中,我有一个 CURDATE() 函数,它每天递增,因为该作业被编程为每晚运行。
  • 我猜你需要修改你的函数以认识到它需要在遇到新月份时插入而不是更新。

标签: mysql date intervals talend


【解决方案1】:

这是一种思考 MySQL 的 SQL 方言中的问题的方法。

首先,您需要一个将datestamp 更改为每个月唯一的值的函数。那是LAST_DAY(datestamp)。它从任意输入生成DATETIME 值,例如2017-09-30 00:00:00

接下来,您可以利用 MySQL 的INSERT ... ON DUPLICATE KEY UPDATE 功能。您将创建一个表months,其中包含这些列

   month_ending DATETIME
   category     VARCHAR(20)
   sum_of_input INT

然后你将month_ending, category 变成一个唯一的复合索引。

然后你做这样的事情

 INSERT INTO months                    /* warning! not debugged! */
        (month_ending, category, sum_of_input)
 VALUES (LAST_DAY(?date), ?category, ?value)
 ON DUPLICATE KEY 
 UPDATE months
    SET sum_of_input = sum_of_input + ?value
  WHERE month_ending=LAST_DAY(?date) 
    AND category=?category

但是,这具有颈部疼痛大、难以调试的特点。使用 ETL 系统中的功能来完成这项汇总工作更有意义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 2021-02-10
    • 2016-10-21
    • 2018-01-10
    相关资源
    最近更新 更多