【问题标题】:How do I add time to a datetime field with an indexing value?如何将时间添加到具有索引值的日期时间字段?
【发布时间】:2024-04-20 02:20:02
【问题描述】:

如何为具有索引值的datetime 字段添加时间?

我的 RDBMS 是 SQL Server 2008 R2。

我想从中午开始为datetime 字段和每条记录取中午的基值并加上 15 秒并将其设置为记录。

例子

Record 1: DateTime Value = '12:00:00 pm'
Record 2: DateTime Value = '12:00:15 pm'
Record 3: DateTime Value = '12:00:30 pm'
...n...

我玩弄了一个 UPDATE 查询,但无法将其编入索引。我觉得这可能需要一个函数,但我不确定。

想法?

尊敬的,

【问题讨论】:

    标签: sql tsql datetime time sql-update


    【解决方案1】:

    假设您有一个表YourTable,其中有一个datetimeValue,您需要为每行填充一个以15 秒为增量的日期时间值。这里我使用列 ID 来指定行的顺序。

    declare @Start datetime = '2011-05-18T12:00:00'
    
    ;with cte as
    (
      select Value,
        row_number() over(order by ID) as rn
      from YourTable 
    )
    update cte set
      Value = dateadd(s, 15*(rn-1), @Start)
    

    【讨论】:

    • 这绝对完美。干净、清晰、优雅。 帽子提示
    【解决方案2】:

    使用递归 CTE(公用表表达式),您可以很容易地做到这一点:

    ;WITH DateTimes AS
    (
        SELECT 
            CAST('2011-05-18T12:00:00pm' AS DATETIME) AS YourTime,
            1 AS RowNum
    
        UNION ALL
    
        SELECT
            DATEADD(SECOND, 15, dt.YourTime),
            dt.RowNum + 1
        FROM
            DateTimes dt
        WHERE   
            dt.RowNum < 50
    )
    SELECT *
    FROM DateTimes
    

    请注意:您需要确保自己在达到默认的最大递归深度 100 之前停止递归(这就是我使用 RowNum 列的目的)-否则,SQL Server 会大声而清晰地告诉您它不喜欢这种递归 CTE :-)

    这会产生以下输出:

    YourTime                RowNum
    2011-05-18 12:00:00.000 1
    2011-05-18 12:00:15.000 2
    2011-05-18 12:00:30.000 3
    2011-05-18 12:00:45.000 4
    ....
    ....
    2011-05-18 12:12:00.000 49
    2011-05-18 12:12:15.000 50
    

    因此,如果您有一个没有时间的DATETIME 值:

    DECLARE @Today DATETIME 
    SET @Today = CAST(GETDATE() AS DATE)
    
    SELECT @Today   -- gives: 2011-05-18 00:00:00.000
    

    您可以轻松地从递归 CTE 向其添加时间值(您甚至可以将其调整为仅返回 TIME 并将其添加到您的 DATETIME 列):

    SELECT  
        CAST(YourTime AS TIME),
        @Today + CAST(YourTime AS TIME) AS 'NewValue'
    FROM TimeValues
    

    【讨论】:

      【解决方案3】:

      查看 DATEADD 函数,这可能会对您有所帮助。

      http://msdn.microsoft.com/en-us/library/ms186819.aspx

      【讨论】:

        最近更新 更多