【问题标题】:Insert N rows with date interval插入具有日期间隔的 N 行
【发布时间】:2014-01-17 23:28:24
【问题描述】:

我需要将行插入数据库,其中每一行都是相同的,除了一个日期列,它的日期应该为每个新行增加 1 周。所以,基本上是这样的:

  for(n = 0; n<X; n++)
      insert into events (date, title) values (start_date + 7*n, 'static title');

有什么 MySQL 技巧可以做到这一点吗?

【问题讨论】:

  • start_date 是如何确定的?
  • 是我给的,比如2014-01-22。目标是在未来 X 周后的每个星期三结束。
  • 插入事件(日期、标题)值(DATE_ADD(start_date, INTERVAL n WEEK), 'static title');

标签: mysql date insert


【解决方案1】:

你可以使用:

SELECT
 'static_title' AS title,
 DATE_ADD(@start_date, INTERVAL @i:=@i+1 WEEK) AS result_date
FROM
 (SELECT
 (two_1.id + two_2.id + two_4.id + 
 two_8.id + two_16.id) AS id
 FROM
 (SELECT 0 AS id UNION ALL SELECT 1 AS id) AS two_1
 CROSS JOIN (SELECT 0 id UNION ALL SELECT 2 id) AS two_2
 CROSS JOIN (SELECT 0 id UNION ALL SELECT 4 id) AS two_4
 CROSS JOIN (SELECT 0 id UNION ALL SELECT 8 id) AS two_8
 CROSS JOIN (SELECT 0 id UNION ALL SELECT 16 id) AS two_16
 ) AS sequence
 CROSS JOIN
-- @i:=0 for not including current week
 (SELECT @i:=-1, @start_date:=CURDATE()) AS init
WHERE
  sequence.id<10;

-这将产生 N 行(此处为 N=10)。要插入行,只需使用 INSERT .. SELECT 语法。小提琴是here。同样在示例中 start_date 设置为 CURDATE() - 当然,您可以在查询中轻松调整它。

【讨论】:

  • 哇,这还能做什么?我不确定我是否理解其中任何一个:p
  • 它将为您完成工作:p 实际上,由于 MySQL 中没有序列 - 所需的值是生成为 2 的幂的总和(如 3 = 2^1 + 2^0) - 以及所需的计数rows 派生自CROSS JOIN
  • 2 次方的交叉连接数与序列 id 之间是否有联系?例如,如果我想要 N=500,你需要更多吗?
  • 好吧,序列被生成作为2的幂的和(你可以单独执行查询来检查)。序列 id 将是连续整数,但要限制它有一些值,其中是 WHERE 子句。 IE。 sequence.id&lt;10 会将其限制为仅 1-st 10 个值,因此 1..10。事实上,这只需要生成行。在您的特定情况下,您可以摆脱@i(因为您需要连续添加一周)-因此可以简化上面的查询
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-19
  • 1970-01-01
  • 2018-11-23
  • 2021-07-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多