Запрос SQL-сервера в DB2

Все, Есть вопрос. У меня есть запрос, который отлично работает в sql server db. Чтобы запустить то же самое в DB2, что нужно сделать.

SELECT 

     EMPID
    ,TOTALSECONDS /3600 AS Hours
    ,((TOTALSECONDS % 3600) /60) AS Minutes
    ,(TOTALSECONDS % 60) AS Seconds
    ,STATUS
    ,[DATE]
    FROM
    (SELECT
    SUM(DATEDIFF(ss,STARTDATETIME,ENDDATETIME)) AS TOTALSECONDS,
    EMPID,STATUS,
    CONVERT(VARCHAR,STARTDATETIME,10) AS [DATE]
    FROM <TABLE>
    WHERE CONVERT(DATE,STARTDATETIME) = 'xxxx-xx-xx'
    GROUP BY EMPID,STATUS,CONVERT(VARCHAR,STARTDATETIME,10)) AS SUMMARY
    ORDER BY STATUS,DATE

Спасибо.


person user3657257    schedule 21.05.2014    source источник
comment
Если это db2400... ваши временные метки не будут привязаны к часовому поясу. Они хранятся в UTC? Если нет, работает ли часовой пояс хранилища с переходом на летнее время? Черт возьми, вы следите за тем, чтобы все временные метки были в одной зоне (я работал с системой, в которой у нас были записи, по-видимому, из будущего!)? Каков диапазон времени начала и окончания - нужно ли вам беспокоиться об изменениях когда переход на летнее время (я не могу точно вспомнить, но я не думаю, что система запомнила несколько дат перехода на летнее время для зона...).   -  person Clockwork-Muse    schedule 22.05.2014


Ответы (1)


Ваша проблема в том, что в DB2 нет функций DATEDIFF или CONVERT. Есть похожие, которые называются TIMESTAMPDIFF и VARCHAR_FORMAT соответственно.

Я думаю, что этот запрос будет тем, что вам нужно, но я не уверен на 100%, правильно ли преобразовал форматы SQL Server в форматы DB2. :)

SELECT
     EMPID
    ,TOTALSECONDS /3600 AS Hours
    ,(MOD(TOTALSECONDS, 3600) /60) AS Minutes
    ,(MOD(TOTALSECONDS, 60) AS Seconds
    ,STATUS
    ,DATE
FROM (
    SELECT
         SUM(TIMESTAMPDIFF(2, CHAR(ENDDATETIME-STARTDATETIME))) AS TOTALSECONDS
        ,EMPID
        ,STATUS
        ,VARCHAR_FORMAT(STARTDATETIME,'mm-dd-yy') AS DATE
    FROM <TABLE>
    WHERE VARCHAR_FORMAT(STARTDATETIME,'yyyy-mm-dd') = 'xxxx-xx-xx'
    GROUP BY
         EMPID
        ,STATUS
        ,VARCHAR_FORMAT(STARTDATETIME,'mm-dd-yy')
) A
ORDER BY
     STATUS
    ,DATE
person bhamby    schedule 21.05.2014
comment
является ли % одинаковым. его ошибка в символе% недействительна. - person user3657257; 21.05.2014
comment
О, % не является оператором по модулю для DB2, вам нужен MOD. Я обновил ответ. - person bhamby; 21.05.2014
comment
хорошо.это дело решено. но теперь обнаружена непредвиденная ошибка [ДАТА]. Но дата вроде правильная - person user3657257; 21.05.2014
comment
Правильным управляющим символом для DB2 является двойная кавычка ("), но я не думаю, что она вам действительно понадобится, вы можете вызвать столбец DATE в DB2, не экранируя его. Я обновил ответ (снова :)) - person bhamby; 21.05.2014
comment
Большое спасибо. На самом деле я изменил его на DT вместо Date.. теперь он работает нормально.. изменил все HRS, MTS, SDS и DT. Большое спасибо за твою помощь. - person user3657257; 22.05.2014
comment
Пожалуйста, избегайте TIMESTAMPDIFF() — согласно документации, он возвращает только оценку, используя такие вещи, как 30-дневные месяцы. Вам также не нужно явно приводить результат вычитания метки времени. К тому времени, когда функция вычислит секунды, вы будете далеко от нее. Нам нужно получить от OP, какую версию/платформу DB2 он использует, а также тип временных меток, чтобы узнать, безопасно ли предполагать 24-часовые дни (исторически, некоторые устаревшие системы настроены на часовые пояса с летним временем, а некоторые типы не могу перечислить смещение...) - person Clockwork-Muse; 22.05.2014