SQL哪位大神可以将字段日期不断循环增加时间,直到截止日期

image.png

Start_time 开始时间,count_hour 递增小时,截止日期 2030-01-01

SQL 阿聪聪 发布于 2024-3-1 08:36 (编辑于 2024-3-1 08:38)
1min目标场景问卷 立即参与
回答问题
悬赏:3 F币 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共4回答
最佳回答
0
青春只因年少Lv6中级互助
发布于2024-3-1 08:40

如果您想使用 Microsoft SQL Server (MSSQL) 来生成一个从某个开始时间递增小时直到 2030-01-01 的时间序列,您可以使用一个递归的公共表表达式 (CTE)。以下是一个示例 SQL 查询,该查询生成从特定开始时间开始,每个小时递增的日期序列,直到 2030-01-01。

请注意,您需要将 @Start_Time 替换为您的实际开始时间。例如,如果您想从 2023-01-01 00:00:00 开始,那么您可以这样设置它。

sql复制代码

DECLARE @Start_Time DATETIME = '2023-01-01 00:00:00'; -- 设置开始时间  
DECLARE @EndDate DATE = '2030-01-01'; -- 设置截止日期  
WITH RecursiveCTE AS (
SELECT  
@Start_Time AS TimeValue
UNION ALL  
SELECT  
DATEADD(HOUR, 1, TimeValue)
FROM  
RecursiveCTE
WHERE  
DATEADD(HOUR, 1, TimeValue) <= @EndDate  
)
SELECT  
TimeValue
FROM  
RecursiveCTE
OPTION (MAXRECURSION 0); -- 允许无限递归,但请注意这可能会导致性能问题或资源耗尽,根据您的数据量和系统资源进行调整

这个查询首先声明了开始时间和截止日期。然后,它使用了一个名为 RecursiveCTE 的递归公共表表达式 (CTE),该表达式从开始时间开始,并在每个递归步骤中增加一个小时,直到达到或超过截止日期。最后,它从 CTE 中选择所有生成的时间值。

OPTION (MAXRECURSION 0) 允许递归无限次进行,但在实际生产环境中,您可能需要设置一个更合理的限制来避免潜在的性能问题或资源耗尽。

请确保在执行此查询之前备份您的数据库,并在一个安全的环境中测试它,以确保它符合您的期望和性能要求。

最佳回答
0
JL98Lv6中级互助
发布于2024-3-1 11:13

如果你想要创建一个SQL查询,该查询将从Start_time开始,每次增加count_hour小时,直到达到或超过2030-01-01,并且你想要这种增加是循环的(例如,如果Start_time是2023-12-31 22:00,count_hour是2,则生成的日期序列将包括2023-12-31 24:00和2030-01-01 00:00),你可以使用SQL的递归公共表表达式(Recursive Common Table Expressions, CTEs)来实现这一点。

以下是一个使用SQL的通用递归CTE的示例,这个示例应该适用于大多数支持递归CTE的数据库系统(如SQL Server, PostgreSQL, Oracle等):

sql

WITH RECURSIVE DateSeries AS (

    SELECT 

        Start_time + INTERVAL count_hour HOUR AS [Date],

        count_hour

    UNION ALL

        SELECT 

            DATE_ADD([Date], INTERVAL count_hour HOUR) AS [Date],

            count_hour

        FROM DateSeries

        WHERE DATE_ADD([Date], INTERVAL count_hour HOUR) < '2030-01-01'

)

SELECT [Date]

FROM DateSeries

ORDER BY [Date];

请注意,上面的SQL语句中使用了INTERVAL和DATE_ADD函数,这些函数在MySQL中可用。如果你使用的是其他数据库系统,你可能需要使用该系统特定的日期和时间函数。例如,在SQL Server中,你会使用DATEADD函数而不是DATE_ADD,而在PostgreSQL中,你会使用INTERVAL但语法略有不同。

对于SQL Server,它应该是这样的:

sql

WITH RECURSIVE DateSeries AS (

    SELECT 

        DATEADD(HOUR, count_hour, Start_time) AS [Date],

        count_hour

    UNION ALL

        SELECT 

            DATEADD(HOUR, count_hour, [Date]) AS [Date],

            count_hour

        FROM DateSeries

        WHERE DATEADD(HOUR, count_hour, [Date]) < '2030-01-01'

)

SELECT [Date]

FROM DateSeries

ORDER BY [Date];

在Oracle中,你可能会使用INTERVAL和ADD_HOURS:

sql

WITH RECURSIVE DateSeries AS (

    SELECT 

        Start_time + count_hour * INTERVAL '1' HOUR AS [Date],

        count_hour

    UNION ALL

        SELECT 

            [Date] + count_hour * INTERVAL '1' HOUR AS [Date],

            count_hour

        FROM DateSeries

        WHERE [Date] + count_hour * INTERVAL '1' HOUR < TO_DATE('2030-01-01', 'YYYY-MM-DD')

)

SELECT [Date]

FROM DateSeries

ORDER BY [Date];

请确保根据你使用的数据库系统调整上述查询中的日期和时间函数。此外,由于递归查询可能会生成大量数据,因此在大型数据集上使用时需要谨慎,以避免性能问题。

最佳回答
0
快乐星光Lv5中级互助
发布于2024-3-1 11:25

可以参照下面的递归方式,看能不能用

WITH x AS

    (SELECT 100 AS count_hour ,'2024-02-28' as start_time

UNION ALL

SELECT count_hour + 1 AS count_hour,start_time FROM x WHERE count_hour < DATEDIFF(hour, start_time, getdate())+100)

SELECT * FROM x;

-- select DATEDIFF(hour, '2024-02-28', getdate()) -- 结果未59

image.png

最佳回答
0
姬迷怎滴Lv5初级互助
发布于2024-3-1 12:55(编辑于 2024-3-1 13:01)

oracle数据库

SELECT

日期,

小时,

TO_DATE( 日期,'yyyy-MM-dd') + NUMTODSINTERVAL(SUM(小时) OVER (ORDER BY 序号 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 'HOUR') AS 累计日期

FROM

table;

image.png

  • 5关注人数
  • 368浏览人数
  • 最后回答于:2024-3-1 13:01
    请选择关闭问题的原因
    确定 取消
    返回顶部