Как создать четверть дня из части времени из метки времени в SQL-сервере - PullRequest
0 голосов
/ 18 октября 2019

У меня есть набор данных, который содержит переменную start_time, которая является DateTimeStamp переменной, содержащей значения, такие как:

Start_Time
2019-06-19 02:10:52.563
2019-07-24 02:00:05.037
2019-07-31 07:24:44.187
2019-08-11 16:52:24.343

Что я хочу сделать, это преобразовать каждую из этих временных меток в четвертьдень (т. е. четыре четверти дня делаются из 6 часов, так что первый квартал начинается с чч: мм: сс с 00:00:00 до 05:59:59, а второй квартал начинается с 06:00:00 и заканчивается в 11: 59: 59, а четверть 3 начинается в 12:00:00 и заканчивается в 17:59:59, четвертая четверть начинается в 18:00:00 до 11:59:59). Таким образом, результат будет выглядеть так:

Start_Time                 Quarter
2019-06-19 02:10:52.563    Q1
2019-07-24 02:00:05.037    Q1
2019-07-31 07:24:44.187    Q2
2019-08-11 16:52:24.343    Q3
..... and so forth

Я смог извлечь часть времени из приведенных выше данных:

 SELECT convert(char(8), start_time, 108) [time] from MyTable;

Но не уверен, как попасть в кварталы. Может кто-нибудь помочь, пожалуйста?

Ответы [ 3 ]

2 голосов
/ 18 октября 2019

Обратите внимание, что ниже приведено для MySQL (неверный тег вопроса) - решение SQL Server находится ниже этого ответа

Этого можно добиться, выбрав HOUR из start_time и затем с помощью оператора CASE:

SELECT start_time,
       CASE
         WHEN start_hour < 6 THEN 'Q1'
         WHEN start_hour < 12 THEN 'Q2'
         WHEN start_hour < 18 THEN 'Q3'
         ELSE 'Q4'
       END AS `time`
  FROM (
       SELECT start_time,
              HOUR(start_time) AS start_hour
         FROM MyTable
       ) a

Выходы:

start_time              time
2019-06-19T02:10:53Z    Q1
2019-07-24T02:00:05Z    Q1
2019-07-31T07:24:44Z    Q2
2019-08-11T16:52:24Z    Q3

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

SELECT start_time,
       CONCAT('Q', FLOOR(HOUR(start_time) / 6 + 1)) AS `time`
  FROM  MyTable

Это просто делит HOUR из start_time на 6, добавляет 1 (так что вы не получаете Q0) и использует FLOOR, чтобы уменьшить его до ближайшего целого числа.

MySQL sqlfiddle

РЕДАКТИРОВАТЬ После обсуждения неправильной метки СУБД

После осознания того, что вы фактически используете SQL Server вместо MySQL, найдите следующеекоторый достигнет того же в SQL Server:

SELECT start_time,
       CONCAT('Q', FLOOR(DATEPART(HOUR, start_time) / 6 + 1)) AS [time]
  FROM  MyTable

Вывод:

start_time              time
2019-06-19T02:10:53Z    Q1
2019-07-24T02:00:05Z    Q1
2019-07-31T07:24:44Z    Q2
2019-08-11T16:52:24Z    Q3

SQL Server sqlfiddle

1 голос
/ 18 октября 2019

Вы можете использовать это, чтобы получить число между 1 и 4:

(extract(Hour from start_time) / 6) + 1

Редактировать:

Извлечение часа отличается для SQL Server

datepart(hour, Start_Time)/6+1
0 голосов
/ 18 октября 2019

Мне удалось получить способ, который я хотел получить от SQL Server 12:

-- Converting the date into quarters 

select a.*, 
CASE     
     WHEN a.STime BETWEEN '00:00:00' AND '05:59:59' THEN 'Q1'     
     WHEN a.STime BETWEEN '06:00:00' AND '11:59:59' THEN 'Q2' 
     WHEN a.STime BETWEEN '12:00:00' AND '17:59:59' THEN 'Q3'     
     ELSE 'Q4' 
END AS QuarterOfTheDay 
FROM (SELECT convert(char(8), start_time, 108) as STime from MyTable) a;

Я не смог использовать два других ответа, так как HOUR () вернул как ошибку:

Msg 195, Level 15, State 10, Line 36
 'HOUR' is not a recognized built-in function name.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...