【问题标题】:Running a `SELECT` for a range of dates to populate a table为一系列日期运行“SELECT”以填充表格
【发布时间】:2018-04-11 21:27:19
【问题描述】:

我有一个(有些复杂的)SELECT 语句,它根据特定的时间戳从表中提取特定日期的行子集。天真,像

SELECT id, runTime
  FROM ...
...
 WHERE runTime < @MyTime

@MyTime 是一些日期时间参数。我需要在很长一段时间内连续运行SELECT(比如说,从 6 月 1 日到今年 11 月 1 日),将结果存储在已经创建的MyOutTable 中,字段为idrunTimecontrolDate,其中controlDate 是用于从我的表中检索 id 和 runTime 的日期值。

在 SQL 中是否有避免使用 Python 的简短方法来执行此操作?假设有一些存储过程,它接受开始和结束日期参数并生成所需的数据,填充输出表?

非常感谢

【问题讨论】:

  • 你的意思是controlDate 是@MyTime?
  • @shockwave 是的,但我需要一系列

标签: sql for-loop select stored-procedures sap-ase


【解决方案1】:
INSERT INTO MyOutTable ( ControlDate, id, runTime )
SELECT '2017-10-30' as ControlDate, id, runTime
FROM ...
...
WHERE runTime < @MyTime

请注意,没有 VALUES 关键字,ControlDate 值是常量文字,但您也可以在此处使用 CURDATE() 或类似名称。

【讨论】:

  • 是的,但我需要一个控制日期范围,而不仅仅是 1
  • 您如何知道特定原始记录的正确日期?
  • 我不确定你在问什么。有一系列controlDate,我需要为每个人提供一张表格,从 6 月 1 日到 11 月 1 日。
  • 然后您生成一个数字表,使用 DATEADD() 将数字投影到您需要的日期,并将其连接到您的 SELECT
  • 我找到了很多在 SQL Server 中生成整数列表的方法,但它们都不能在 Sybase 中工作——你知道怎么做吗?谢谢
【解决方案2】:

您可以使用带有日期/时间的子查询并使用join 逻辑:

select d.dte, . . .
from (select cast('2017-06-01' as datetime) as dte union all
      select cast('2017-06-02' as datetime) as dte union all
      . . .
     ) d join
     . . .
     on runTime < d.dte;

【讨论】:

  • 这样我必须在内部选择中编写大约 150 个选择,有什么方法可以自动将所有日期从 2017-06-012017-11-01
  • @gt6989b 。 . .对于 Sybase,我不知道。您可以使用日历表。在 SQL Server 中,您可以使用递归 CTE。也许 Sybase 有不同的技巧。
猜你喜欢
  • 2012-04-25
  • 2020-01-12
  • 1970-01-01
  • 2013-08-02
  • 1970-01-01
  • 1970-01-01
  • 2016-11-08
相关资源
最近更新 更多