【问题标题】:Create date table of every second between two dates创建两个日期之间每秒的日期表
【发布时间】:2021-03-14 07:29:26
【问题描述】:

我需要在两个输入日期之间创建一个每秒的表格

例如在 01/01/2015 00:00:01 和 05/01/2016 00:00:00 之间

所以 3m 行的预期输出如下所示:

这需要CLR吗?功能。有人有例子吗?

【问题讨论】:

  • CLR 还是 CTE?你当然不需要CLR。递归 CTE 可能...
  • 秒数上限是多少?
  • 我需要 4-5 年,所以可能不会超过 2 亿(5 年 157,680,000)
  • 好的,然后我必须将 Tally 扩展到 10 亿行:/

标签: sql sql-server date tsql


【解决方案1】:

Tally 将是(到目前为止)最快的方法。虽然您也可以使用 rCTE 来完成此操作,但如果您要执行此操作 100,000 秒(甚至数百万秒),它会很快变慢。

DECLARE @StartDate datetime2(0) = '2020-01-01T17:00:00',
        @EndDate datetime2(0) = '2020-03-02T01:30:45';

WITH N AS (
    SELECT N
    FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N)),
Tally AS (
    SELECT TOP (DATEDIFF_BIG(SECOND,@StartDate,@EndDate)+1)
           ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) - 1  AS I
    FROM N N1, N N2,  N N3,  N N4, N N5, N N6, N N7, N N8, N N9) --Up to 1B rows (a little under under 32 years)
SELECT DATEADD(SECOND,T.I,@StartDate)
FROM Tally T;

【讨论】:

  • (10,000,000 行受影响) - 这似乎停止在 10M 行,这不是一年。这是我的数据库端未正确配置的设置吗?
  • @AndusM 注意我updated 在你的comment 之后的答案。在我写答案的时候,我不知道你需要超过 1 亿行,因为你没有回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-05
  • 2021-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多