Конвертировать Oracle в T-SQL, чтобы получить общее количество просмотров в месяц - PullRequest
0 голосов
/ 24 октября 2019

Я пытаюсь перенести некоторые запросы Oracle в T-SQL из-за планируемой миграции. Следующий запрос ORACLE должен отображать общее количество посещений (просмотров) веб-платформы, которую я использую.

Очевидно, TO_CHAR и TO_DATE не поддерживаются в SQL, как в Oracle. Вместо этого я попытался использовать функции CONVERT и CAST.

SELECT TO_CHAR (VISIT_TIME,'YYYY.MM') as mydate, count (*) as visits 
FROM AO_05769A_VISIT_ENTITY 
INNER JOIN user_mapping ON AO_05769A_VISIT_ENTITY.USER_KEY = user_mapping.USER_KEY 
WHERE lower_username not in ('admin') 
AND VISIT_TIME > to_date( '30/04/2018 23-50-00', 'DD/MM/YYYY HH24-MI-SS' ) 
GROUP BY TO_CHAR (VISIT_TIME,'YYYY.MM') 
ORDER BY TO_CHAR (VISIT_TIME,'YYYY.MM')

Вывод должен представлять собой таблицу с месяцами (YYYY.MM формат) и общим количеством просмотров за месяц. Запрос oracle работает как талисман, но я не могу управлять запросом TSQL, чтобы правильно обеспечить желаемый результат. Столбец VISIT_TIME хранит дату / время в следующем формате: 2018-04-19 17:45:24.820, а USER_KEY сопоставляется с таблицей user_mapping для получения фактического имени пользователя.

Ответы [ 3 ]

0 голосов
/ 24 октября 2019

Другой подход заключается в использовании комбинации replace и convert:

-- convert style 23 returns yyyy-mm-dd - take only the first 7 chars and replace the '-' with '.'
SELECT REPLACE(CONVERT(char(7) VISIT_TIME, 23), '-','.') as mydate, count (*) as visits 
FROM AO_05769A_VISIT_ENTITY 
INNER JOIN user_mapping 
    ON AO_05769A_VISIT_ENTITY.USER_KEY = user_mapping.USER_KEY 
WHERE lower_username not in ('admin') 
AND VISIT_TIME > '2018-04-30T25:50:00' -- Always use ISO8601 as datetime format for string literals
GROUP BY REPLACE(CONVERT(char(6) VISIT_TIME, 23), '-','.')
ORDER BY mydate -- the order by clause can use the aliases in the select clause
0 голосов
/ 24 октября 2019

Вы можете использовать комбинацию CONVERT и SQL Server Дата и время Стили . Здесь мы используем стиль 102 , который отображается как yyyy.MM.dd, и мы используем CHAR(7), чтобы взять только первые 7 символов, которые дают yyyy.MM:

SELECT CONVERT(CHAR(7), VISIT_TIME, 102) as mydate, count (*) as visits 
FROM AO_05769A_VISIT_ENTITY 
INNER JOIN user_mapping ON AO_05769A_VISIT_ENTITY.USER_KEY = user_mapping.USER_KEY 
WHERE lower_username not in ('admin') 
AND VISIT_TIME > '2018-04-30 23:50:00' 
GROUP BY CONVERT(CHAR(7), VISIT_TIME, 102) 
ORDER BY mydate
0 голосов
/ 24 октября 2019

Я бы просто использовал функции YEAR() и MONTH(). Следующее близко:

SELECT YEAR(VISIT_TIME), MONTH(VISIT_TIME), COUNT(*) as visits 
FROM AO_05769A_VISIT_ENTITY ve INNER JOIN
     user_mapping um
     ON ve.USER_KEY = um.USER_KEY 
WHERE lower_username not in ('admin') AND
      VISIT_TIME > '2018-04-03 23:50:00'
GROUP BY YEAR(VISIT_TIME), MONTH(VISIT_TIME) 
ORDER BY YEAR(VISIT_TIME), MONTH(VISIT_TIME);

Для точного эквивалента вы можете использовать FORMAT():

SELECT FORMAT(VISIT_TIME, 'yyyy.MM') as yyyymm, COUNT(*) as visits 
FROM AO_05769A_VISIT_ENTITY ve INNER JOIN
     user_mapping um
     ON ve.USER_KEY = um.USER_KEY 
WHERE lower_username not in ('admin') AND
      VISIT_TIME > '2018-04-03 23:50:00'
GROUP BY FORMAT(VISIT_TIME, 'yyyy.MM') 
ORDER BY yyyymm;

У меня проблемы с вызовом строкового столбца в формате YYYY.MM, связанного сдата, поэтому я назвал это ггггмм.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...