С рекурсивным CTE (Common Table Expression) вы можете сделать это довольно легко:
;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