SQL Server - выберите каждую секунду в день - PullRequest
3 голосов
/ 03 февраля 2012

Использование: SQL Server 2008 R2

Я хотел бы написать запрос, который будет выбирать (упорядочено, в одном столбце) каждую секунду дня в формате datetime.

Пример.

2012-02-02 00:00:00
2012-02-02 00:00:01
2012-02-02 00:00:02
2012-02-02 00:00:03
2012-02-02 00:00:04
...
2012-02-02 23:59:58
2012-02-02 23:59:59

Да, серьезно.

Я могу создать таблицу чисел, если это необходимо, что может быть полезно, если я могу преобразовать целочисленные значения в datetime.

Спасибозаранее.

Ответы [ 3 ]

6 голосов
/ 03 февраля 2012

Предполагается, что таблица чисел со значениями до 86 400 ... количество секунд в дне.

Для иллюстрации я создаю таблицу чисел здесь ... но вы должны сделать это заранее.

SET NOCOUNT ON

DECLARE @YourDate DATETIME
SET @YourDate = '2/2/2012'

DECLARE @Numbers TABLE (Number INT)
DECLARE @Index INT

SET @Index = 0
WHILE (@Index < 86400)
BEGIN
    INSERT INTO @Numbers VALUES (@Index)
    SET @Index = @Index + 1
END

SELECT DATEADD(SECOND, n.Number, @YourDate)
FROM @Numbers n
WHERE n.Number < 86400
3 голосов
/ 03 февраля 2012

Если вы не хотите полагаться на таблицу или рекурсивные CTE, используйте несколько перекрестных объединений. Если вам нужно больше чисел для вашей последовательности, просто добавьте больше перекрестных объединений - вы можете быстро преодолеть несколько миллионов.

DECLARE @start_date AS DATETIME = '2012-02-02';
WITH L0 AS (SELECT 1 AS C UNION ALL SELECT 1),       --      2
     L1 AS (SELECT L0.C FROM L0 CROSS JOIN L0 AS B), --      4
     L2 AS (SELECT L1.C FROM L1 CROSS JOIN L1 AS B), --     16
     L3 AS (SELECT L2.C FROM L2 CROSS JOIN L2 AS B), --    256
     L4 AS (SELECT L3.C FROM L3 CROSS JOIN L3 AS B), --  65536
     L5 AS (SELECT L4.C FROM L4 CROSS JOIN L4 AS B), --   Alot
      N AS (SELECT ROW_NUMBER() OVER(ORDER BY L5.C) AS n FROM L5),
      D AS (SELECT DATEADD(SECOND, n - 1, @start_date) AS d, n FROM N)
SELECT d from D where n <= (60 * 60 * 24)
2 голосов
/ 03 февраля 2012

Если вы не хотите полагаться на другую таблицу, используя CTE, в то время как, вероятно, более интенсивной ЦП может быть другой вариант.

;WITH q (TimeOfDay) AS (
    SELECT  DATEADD(dd, DATEDIFF(dd, 0, GETDATE()), 0)
    UNION ALL
    SELECT  DATEADD(ss, 1, q.TimeOfDay)
    FROM    q
    WHERE   DAY(GETDATE()) = DAY(DATEADD(ss, 1, q.TimeOfDay))
)
SELECT  *
FROM    q
OPTION  (MAXRECURSION 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...