#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
для представления, а не фактическое значение.