2016-07-26 2 views
1

Я хочу сравнить дату/время с SQL Server (тип datetime-16) с db2/400 (тип Z).Сравнить даты db2/400 vs SQL Server

Обычно я хотел бы знать, что есть 60 секунд между 18:44 и 18:45

Каждый из них имеет несколько различных характеристик дисплея.

SQL Server 2016-07-26 18:45:00.000 
Db2/400  2016-07-26-18.45.00.000000 

Если я делаю это на моей базе данных db2:

SELECT 
    MYDATETIME, 
    '2016-07-26 18:44:00.000', 
    MYDATETIME - '2016-07-26 18:44:00.000' 
FROM @dates      

Я получаю это

MYDATETIME     Constant value     Numeric Expression  
2016-07-26-18.45.00.000000 2016-07-26 18:44:00.000     100.000000  

Db2 SQL кажется довольно щедрым, чтобы принять несколько различных форматов.

Но запрос говорит мне, что разница в 1 минуту = 100. Похоже, что здесь есть сравнение базы 10.

Использование db2 функции метки времени, я получаю тот же результат

SELECT 
    MYDATETIME, 
    '2016-07-26 18:44:00.000', 
    MYDATETIME - timestamp('2016-07-26-18.44.00.000000') 
FROM @dates    

Как я могу сделать сравнение, которые дали бы мне разницу в течение нескольких минут (или часов или дней)?

+1

Это на самом деле [дает вам форматированный значение] (https://www.ibm. com/support/knowledgecenter/SSEPEK_10.0.0/sqlref/src/tpc/db2z_bif_timestampdiff.html): '100.000000' на самом деле' 1 минута', '00 секунд',' 000000 дробных секунд'. Обратите внимание, что значение относительное (т. Е. «1 месяц»), поэтому, возможно, не полезно. Почему вы хотите разницу? –

+0

Clockwork - Я хочу задать такие вопросы, как «Как долго после последнего запуска», «показать мне транзакции за последние 24 часа», «Экстракция была запущена вчера на 2 вечера. Покажите мне, что нового». Спасибо –

+0

Вы почти никогда не хотите использовать diff в запросе, потому что это заставит db игнорировать указатели. Как правило, вы хотите создать лимиты и выполнить запрос диапазона. Языки на уровне приложений имеют более эффективные способы разграничения продолжительности, чем почти все РСУБД, поэтому математика отображается только во время отображения. Как вы пытаетесь общаться между двумя dbs? Почему бы просто не передать требуемые начальные/конечные значения? –

ответ

0

Я знаю, что это DB2/400, но в моем опыте операторы время работают точно так же, так что с this article:

SELECT 
    MYDATETIME, 
    '2016-07-26 18:44:00.000', 
    MYDATETIME - timestamp('2016-07-26-18.44.00.000000') SECONDS 
FROM @dates  

Поскольку у меня нет экземпляра DB2, чтобы проверить это дальше, следующая вещь, которую я хотел бы попробовать бы это:

SELECT 
    MYDATETIME, 
    '2016-07-26 18:44:00.000', 
    SECOND(MYDATETIME - timestamp('2016-07-26-18.44.00.000000')) 
FROM @dates  
+0

Значение, возвращаемое из разницы, по существу, является форматированным значением - «100», которое видит OP, - это не количество секунд, а «1 минута, 0 секунд». Вот если бы это утверждение даже запустилось; Я скорее подозреваю синтаксические ошибки, так как вам требуется фактическое значение времени/времени, чтобы привязать оператора. –

4

результаты вычитания двух временных меток на DB2 для IBM я известен как duration

Вы можете найти TIMESTAMPDIFF() полезно

select               
    timestampdiff(2            
       , char(timestamp('2016-07-27 08:35:00.000000') 
         - timestamp('2016-07-27 08:34:00.000000') 
        )           
       )             
from sysibm.sysdummy1            

обратите внимание, что первый параметр является небольшой INT со следующими значениями

1 Microseconds 
2 Seconds 
4 Minutes 
8 Hours 
16 Days 
32 Weeks 
64 Months 
128 Quarters 
256 Years 

Второй параметр должен быть характер представление продолжительности.

EDIT Как указано Clockwork-Muse, TIMESTAMPDIFF() лучше всего использовать для коротких периодов времени менее чем за месяц.

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

(DAYS(t1) - DAYS(t2)) * 86400 + 
(MIDNIGHT_SECONDS(t1) - MIDNIGHT_SECONDS(t2)) 

Sample

select               
    (DAYS(timestamp('2016-07-27 08:35:00.000000'))    
     - DAYS(timestamp('2015-07-27 08:35:00.000000'))    
    ) * 86400 +             
    (MIDNIGHT_SECONDS(timestamp('2016-07-27 08:35:00.000000')) 
    - MIDNIGHT_SECONDS(timestamp('2015-07-27 08:35:00.000000'))) 
from sysibm.sysdummy1            
+0

'TIMESTAMPDIFF' находится рядом с бесполезным с чем-либо, разделенным более чем на месяц, учитывая его использование оценок (и продолжительности). –

+0

@ Clockwork-Muse, но OP смотрит на продолжительность всего 60 секунд. Я добавляю альтернативу ... – Charles

Смежные вопросы