【问题标题】:For each minute add row between ranges每分钟在范围之间添加行
【发布时间】:2018-05-05 02:58:44
【问题描述】:

我有日期范围的表格

我需要在这个范围之间添加行。我必须把这张表细化到几分钟。我怎样才能添加这些额外的行

【问题讨论】:

  • 标记您正在使用的 dbms。在日期/时间方面,许多产品远不符合 ANSI SQL。
  • 你能展示一个你想要的结果样本吗?
  • 同时指定预期结果。 (请记住,这里的大多数人都想要格式化文本,而不是图像。)
  • 你试过什么?向我们展示您当前的查询尝试。
  • 到目前为止,我已经尝试在 sql 中找到解决方案,否则它只是一个脚本

标签: sql tsql datetime date-range


【解决方案1】:

@MatthewBaker 的递归 CTE 选项只需稍作更改即可满足您的需求。

WITH
   by_minute
AS
(
    SELECT *, datetime_from, minute_marker FROM your_table
    UNION ALL
    SELECT *, DATEADD(minute, 1, minute_marker) FROM by_minute WHERE DATEADD(minute, 1, minute_marker) < datetime_to
)

SELECT
    *
FROM
    by_minute
OPTION
    (MAXRECURSION 0)

OPTION (MAXRECURSION 0) 允许 SQL Server 继续递归生成超出默认值 100 的分钟数。不过,如果生成的时间间隔超过几百分钟,我不建议这样做(可能最多 1天 [1440 分钟]).

在这种情况下,更简单的方法是使用一个数字表,然后简单地加入它。

创建此类表的示例可能是:https://www.mssqltips.com/sqlservertip/4176/the-sql-server-numbers-table-explained--part-1/

从那里,您只需加入您需要的行数...

SELECT
    yourTable.*,
    DATEADD(minute, Numbers.[Number], yourTable.datetime_from)  AS minute_marker
FROM
    yourTable
INNER JOIN
     dbo.Numbers
         ON  Numbers.[Number] >= 0
         AND Numbers.[Number] <  DATEDIFF(minute, yourTable.datetime_from, yourTable.datetime_to)

我的另一个建议是不要使用第 59 秒来表示一分钟的结束。如果您在 59.600 秒时获得数据怎么办?那是在那一分钟结束之后但在新一分钟开始之前?而是使用包含开始和排他结束的标记...

The first minute of 2012 = '2012-01-01 00:00:00.000' -> '2012-01-01 00:01:00.000'
The final minute of 2012 = '2012-12-31 23:59:00.000' -> '2013-01-01 00:00:00.000'

有了这样的结构,您只需要my_point_in_time &gt;= start AND my_point_in_time &lt; end,并且您无需担心所使用的数据类型的精度。

(它也匹配人类自然语言。当我们说between 1 and 2 之类的东西时,我们通常指的是&gt;= 1 AND &lt; 2。)

【讨论】:

    【解决方案2】:

    如果您使用以下内容:

    WITH    cte
          AS (SELECT    CAST('2017-01-01 00:00:00' AS DATETIME) AS startTime
              UNION ALL
              SELECT    DATEADD(MINUTE, 1, startTime)
              FROM      cte
              WHERE     startTime < '2017-01-02 00:00:00'
             )
    SELECT  *
    FROM    cte
    

    选项(MAXRECURSION 0)

    它会给你一分钟一分钟的结果。在你想要的范围内替换。然后,您可以使用它作为编写插入的基础。迭代 CTE 不是最有效的,但可能是最简单的

    【讨论】:

    • 虽然他的递归级别涵盖了示例等范围,但我相信这会很好。虽然,为了让 OP 使用这一点,我怀疑您可能需要查看您对他的具体案例的回答 (我怀疑 OP 是否已经知道如何修改 CTE 以从他拥有的行开始并在适当的时候停止点。)
    • @MatBailie 你可能是对的。我在这里发布的更多的是获得答案的垫脚石,而不是完整的解决方案。您的解决方案是一个更全面的答案,并得到了我的 +1。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多