如何使用索引值为datetime字段添加时间?

时间:2011-05-18 15:58:43

标签: sql tsql datetime time sql-update

如何使用索引值为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查询,但我无法将其编入索引。我觉得这可能需要一个功能,但我不确定。

想法?

此致,

3 个答案:

答案 0 :(得分:2)

假设您有一个YourTabledatetime的表Value,您需要填充每行增加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)

答案 1 :(得分:1)

使用递归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

答案 2 :(得分:0)

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

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