SQL Server - сортируйте поле даты временной метки в подзапросе, а затем форматируйте для просмотра - PullRequest
0 голосов
/ 03 мая 2018

У меня есть запрос (SQL Server 2012), который объединяет метки времени UNIX из двух разных таблиц в один столбец, что само по себе работает нормально. Запрос должен быть отсортирован (по убыванию) по объединенному столбцу даты И преобразован в читаемый формат.

Если я попытаюсь выполнить сортировку после конвертации даты, она не будет работать, поскольку теперь она является VARCHAR и возвращает:

05/02/2018
06/01/2017
07/03/2016

Сначала я попытался включить преобразование даты в предложение ORDER BY, но это явно не работает.

Тогда я подумал, что мог бы использовать подзапрос для выполнения сортировки, а затем выполнить преобразование в основном запросе (см. Ниже то, что у меня сейчас есть), но это возвращает ошибку:

Неправильное использование опции NEXT в операторе FETCH.

Я не использую оператор извлечения, поэтому мне интересно, есть ли в моем вложении что-то, что SQL Server не нравится.

Любые подсказки будут потрясающими.

-- Convert Epoch timestamp format to readable (and unsortable) dd/MM/yyyy format
SELECT CONVERT(VARCHAR(10), DATEADD(second, OuterTable.thedate-DATEDIFF(second, GETDATE(), GETUTCDATE()), CONVERT(DATETIME, '1970-01-01', 103)), 103) AS FinalDate
  FROM (

 -- Subquery only exists to do a proper date sort
 SELECT thedate
   FROM 
   (
       SELECT 

        -- Determine which date to use
         CASE WHEN x.dateX IS NOT NULL
              THEN x.dateX
              ELSE y.dateY
              END AS thedate

        -- Get date from first table
         FROM (
             SELECT id, dateX -- date is in Epoch format (BIGINT)
               FROM tableX
         ) AS x

        -- Get date from second table
         JOIN (
             SELECT id, dateY -- date is in Epoch format (BIGINT)
               FROM tableY
         ) AS y
         ON x.id = y.id
   )

-- Perform sort while date is still in epoch format
ORDER BY thedate DESC

) AS OuterTable

1 Ответ

0 голосов
/ 03 мая 2018

IMO это должно работать для вас:

SELECT CONVERT(VARCHAR(10), DATEADD(second, COALESCE(x.dateX, y.dateY) - DATEDIFF(second, GETDATE(), GETUTCDATE()), CONVERT(DATETIME, '1970-01-01', 103)), 103) AS FinalDate
FROM tableX AS x
INNER JOIN tableY AS y
ON x.id = y.id
ORDER BY COALESCE(x.dateX, y.dateY) DESC;

Не уверен, когда копируешь / вставляешь функцию CONVERT. Так сложно ли конвертировать эпоху в дд / мм / гггг в MSSQL?

...