SQL Получите интервал от 9:32 до 10:02 как интервал 9:30 и 10:03 и 10:32 как 10:00 - PullRequest
0 голосов
/ 04 июля 2019

Я использую SQL, и мне нужно получить этот результат, но я не знаю как.Что мне нужно, это узнать, какой интервал существует время.Пожалуйста, обратитесь к приведенному ниже примеру

     ---------------------- 
    | Time   |    Interval|
    ----------------------|
    | 9:03   |    9:00    |
    | 9:02   |    8:30    |
    | 9:32   |    9:00    |
    | 9:33   |    9:30    |
    ----------------------- 

Пример матрицы интервалов

    ----------------------------- 
    | Interval   |    Time       |
    -----------------------------|
    | 9:00   |    9:02 - 9:31:59 |
    | 9:30   |    9:32 - 10:01:59|
    | 10:00  |    10:02- 10:31:59|
    ----------------------- ------

Таким образом, в основном 9:03 - 9:32 существует в 9:00 интервале часов, а 9:33 - 10:02 существует в интервале 9:30

У меня есть этот запрос

      SELECT CONVERT(time(7),DATEADD(MINUTE,(DATEPART(MINUTE, '10:32:00') / 
             30)*30,(DATEADD(HOUR, DATEDIFF(HOUR, 0, '10:32:00'), 0))))

, но это самое дальнее, что я могу придумать, результат должен быть 10:00 интервал.Вы можете указать мне правильное направление или дать несколько советов

Ответы [ 4 ]

1 голос
/ 04 июля 2019

Следующее решение использует DATEDIFF с MINUTE против смещения 00:02, чтобы сначала скорректировать разницу, затем сокращает время до 30-минутных интервалов, используя минуты как целые числа и выполняя / 30 * 30 и, наконец, преобразовать результат обратно в TIME.

DECLARE @Times TABLE (ClockTime TIME)

INSERT INTO @Times (ClockTime)
VALUES 
    ('08:57'),
    ('08:58'),
    ('08:59'),
    ('09:00'),
    ('09:01'),
    ('09:02'),
    ('09:03'),
    ('09:05'),
    ('09:31'),
    ('09:31:59'),
    ('09:32'),
    ('10:32'),
    ('23:02'),
    ('23:03'),
    ('23:31:15')


SELECT
    T.ClockTime,
    MinutesMinus2 = DATEDIFF(MINUTE, '00:02', T.ClockTime),
    MinutesMinus2On30Intervals = DATEDIFF(MINUTE, '00:02', T.ClockTime) / 30 * 30,
    MinutesMinus2On30IntervalsAsTime = CONVERT(
        TIME, 
        DATEADD(
            MINUTE, 
            DATEDIFF(MINUTE, '00:02', T.ClockTime) / 30 * 30, -- MinutesMinus2On30Intervals
            0))
FROM
    @Times AS T

Результаты:

+------------------+---------------+----------------------------+----------------------------------+
|    ClockTime     | MinutesMinus2 | MinutesMinus2On30Intervals | MinutesMinus2On30IntervalsAsTime |
+------------------+---------------+----------------------------+----------------------------------+
| 08:57:00.0000000 |           535 |                        510 | 08:30:00.0000000                 |
| 08:58:00.0000000 |           536 |                        510 | 08:30:00.0000000                 |
| 08:59:00.0000000 |           537 |                        510 | 08:30:00.0000000                 |
| 09:00:00.0000000 |           538 |                        510 | 08:30:00.0000000                 |
| 09:01:00.0000000 |           539 |                        510 | 08:30:00.0000000                 |
| 09:02:00.0000000 |           540 |                        540 | 09:00:00.0000000                 |
| 09:03:00.0000000 |           541 |                        540 | 09:00:00.0000000                 |
| 09:05:00.0000000 |           543 |                        540 | 09:00:00.0000000                 |
| 09:31:00.0000000 |           569 |                        540 | 09:00:00.0000000                 |
| 09:31:59.0000000 |           569 |                        540 | 09:00:00.0000000                 |
| 09:32:00.0000000 |           570 |                        570 | 09:30:00.0000000                 |
| 10:32:00.0000000 |           630 |                        630 | 10:30:00.0000000                 |
| 23:02:00.0000000 |          1380 |                       1380 | 23:00:00.0000000                 |
| 23:03:00.0000000 |          1381 |                       1380 | 23:00:00.0000000                 |
| 23:31:15.0000000 |          1409 |                       1380 | 23:00:00.0000000                 |
+------------------+---------------+----------------------------+----------------------------------+

Вы также можете параметризовать смещение с помощью переменной TIME на ваше время.изменения смещения:

DECLARE @TimeOffset TIME = '00:02'

SELECT
    Interval = CONVERT(
        TIME, 
        DATEADD(
            MINUTE, 
            DATEDIFF(MINUTE, @TimeOffset, T.ClockTime) / 30 * 30,
            0))
FROM
    @Times AS T
1 голос
/ 04 июля 2019

Я думаю, что это даст вам то, что вам нужно:

declare @testtable table (thedate time )

insert into @testtable values ( '09:03'),   ('09:02'),    ('09:32'),    ('09:33')

select 
thedate,
case when datepart(minute,thedate) between 0 and 2  then dateadd(minute, -30,cast(cast(datepart(hour,thedate) as varchar)+':00' as time))
             when datepart(minute,thedate) between 3 and 32 then cast(cast(datepart(hour,thedate) as varchar)+':00' as time)
             else dateadd(minute, +30,cast(cast(datepart(hour,thedate) as varchar)+':00' as time))
            end
from @testtable  

, который производит:

09:03:00.0000000    09:00:00.0000000
09:02:00.0000000    08:30:00.0000000
09:32:00.0000000    09:00:00.0000000
09:33:00.0000000    09:30:00.0000000
0 голосов
/ 04 июля 2019

Я даю ответ другим за идею, но думаю, что это более чисто и легко понять

DECLARE @date time = '07-04-2019 10:32:00'
SELECT CONVERT(time(7),DATEADD(MINUTE,(DATEPART(MINUTE, 
    CASE WHEN DATEPART(MINUTE, @date) = 31 THEN DATEADD(minute,-2,@date) WHEN DATEPART(MINUTE, @date) = 1 THEN DATEADD(minute,-2,@date) ELSE @date END
      ) / 30)*30,(DATEADD(HOUR, DATEDIFF(HOUR, 0, CASE WHEN DATEPART(MINUTE,@date) = 1 THEN DATEADD(HOUR,-1,@date) ELSE @date END), 0))))
0 голосов
/ 04 июля 2019

Обратите внимание, что я изменил строку временного диапазона interval на время начала и окончания. Если ваши данные в строке, рассмотрите возможность преобразования в 2 отдельных типа данных времени. В противном случае вам потребуется выполнить некоторый анализ строки в запросе

Как только данные представлены в нужном формате, запросом будет просто INNER JOIN

declare @sample table 
(
      [Time]        time(0)
)

insert into @sample 
values ('09:03'),   
       ('09:02'),    
       ('09:32'),     
       ('09:33')

declare @interval table
(
    [Interval]      time(0),
    [Time_Start]    time(0),
    [Time_End]      time(0)
)

insert into @interval
values  ('09:00', '09:02', '09:31:59'),
        ('09:30', '09:32', '10:01:59'),
        ('10:00', '10:02', '10:31:59')

select  s.Time, i.Interval
from    @sample s
        inner join @interval i  on  s.Time  between i.Time_Start and i.Time_End
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...