SQL-запрос для перечисления всех часов дня в формате datetime в одном столбце

#sql-server #tsql

#sql-сервер #tsql

Вопрос:

Мне нужен запрос, который возвращает все часы дня в 12-часовом формате, например: 12:00, 1:00, 2:00 и т.д. Это будет использоваться в SSRS в качестве поля выбора для параметра времени. Мне нужно выбрать записи в пределах диапазона дат, а затем из диапазона времени в этом диапазоне дат. У меня есть этот запрос, который возвращает время в 24-часовом формате, но он не работает должным образом в SSRS:

 With CTE(N)
AS
(
SELECT 0
UNION ALL
SELECT N 30
FROM CTE
WHERE N 5<24*60
)

SELECT CONVERT(TIME,DATEADD(minute,N,0) ,108)
FROM CTE
OPTION (MAXRECURSION 0)
  

Комментарии:

1. Что означает «не работает должным образом»?

2. Я не слишком уверен, он просто неправильно возвращает записи, когда они находятся в 24-часовом формате. Это исключает определенные, и я не могу понять причину, почему

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

4. Из того, что вы объяснили… Я думаю, вы хотите, чтобы это было вашим оператором select… SELECT CONVERT(varchar(15),CONVERT(TIME,DATEADD(minute,N,0) ,108),100)

Ответ №1:

Вот как я бы это сделал:

 DECLARE @t time(1) = '00:00'; --I use 1 as when I use REPLACE later it means that I can "identify" the correct :00 to remove

WITH N AS(
    SELECT N
    FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL)) N(N)),
Tally AS(
    SELECT TOP 24 ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) -1 AS I
    FROM N N1, N N2),
Times AS(
    SELECT DATEADD(HOUR, I,@t) AS [Time]
    FROM Tally)
SELECT T.[Time],
       REPLACE(CONVERT(varchar(12),T.Time,9),':00.0',' ') AS TimeString
FROM Times T
ORDER BY T.[Time] ASC;
  

Обратите внимание, что я возвращаю как a, так time и varchar тип данных; оба важны, поскольку порядок данных для a varchar изначально был бы совершенно другим, и если вы используете SSRS, я подозреваю, что вам нужно значение TimeString для представления, а не фактическое значение.