Запрос с диапазоном дат и конкретным диапазоном времени?

У меня есть этот запрос для базы данных DB2, где мне нужно извлекать данные между датами и определенным временем. Я придумал запрос ниже, и он работает, но не получает данные за день между 20110510 и 20110512, в данном случае 20110511, эти данные должны быть за весь день.

Даты и время являются параметрами пользователя, поэтому они будут меняться в зависимости от их потребностей. Я также хочу иметь возможность извлекать данные за тот же день с тем же запросом, если это возможно, например:

Date last modify >= 20110512 AND
Date last modify <= 20110512 AND
Time last modify >= 090000   AND
Time last modify <= 230000   AND

Любая помощь будет очень признательна заранее. Спасибо.

SELECT A1.CHCASN, A1.CHTRKN,
SUM(A2.CDPAKU) AS UNITS, A1.CHACWT, SUM(A2.CDPRC * A2.CDPAKU) AS COST, SUM(A3.STRPRC * A2.CDPAKU) AS RETAIL, A1.CHDLM, A1.CHTLM
FROM CHCART00 A1, CDCART00 A2, STSTYL00 A3
WHERE A1.CHCASN = A2.CDCASN
AND A2.CDSTYL = A3.STSTYL
AND A2.CDCOLR = A3.STCOLR
AND A2.CDSDIM = A3.STSDIM
AND A1.CHSTAT = '25'
AND (A1.CHDLM = 20110510 AND A1.CHTLM >= '200000' OR A1.CHDLM = 20110512 AND A1.CHTLM <= '092000') AND A1.CHROUT = 'UPSPA'
GROUP BY A1.CHCASN, A1.CHTRKN, A1.CHACWT, A1.CHDLM, A1.CHTLM
ORDER BY A1.CHDLM, A1.CHTLM

person jorame    schedule 12.05.2011    source источник
comment
Неоднозначно — во-первых, тест начальной даты, вероятно, должен проверяться на 20110511 для первой даты. (Опечатка?) Но с другой стороны, поскольку даты и время проверяются отдельно, фактические требования кажутся между 9:00 и 23:00 каждой даты в диапазоне. Если это так, то TIMESTAMP для указания начала и конца диапазона не будут работать. Каково фактическое требование? Похоже, что SQL подразумевает, что TIMESTAMP могут работать.   -  person user2338816    schedule 28.01.2016


Ответы (4)


Примеры:-

(Между двумя датами)

`SELECT A1.CHCASN, A1.CHTRKN, SUM(A2.CDPAKU) AS UNITS, A1.CHACWT,
    SUM(A2.CDPRC * A2.CDPAKU) AS COST, SUM(A3.STRPRC * A2.CDPAKU) AS RETAIL,     
    A1.CHDLM, A1.CHTLM FROM CHCART00 A1, CDCART00 A2, STSTYL00 A3  
WHERE A1.CHCASN = A2.CDCASN AND A2.CDSTYL = A3.STSTYL AND      
    A2.CDCOLR = A3.STCOLR     AND A2.CDSDIM = A3.STSDIM AND A1.CHSTAT = '25' AND
    (A1.CHDLM BETWEEN 20110510 AND 20110512)      
    AND A1.CHROUT = 'UPSPA' GROUP BY A1.CHCASN, A1.CHTRKN, A1.CHACWT,
    A1.CHDLM, A1.CHTLM  
ORDER BY A1.CHDLM, A1.CHTLM` 

(Та же дата)

`SELECT A1.CHCASN, A1.CHTRKN, SUM(A2.CDPAKU) AS UNITS, A1.CHACWT,
    SUM(A2.CDPRC * A2.CDPAKU) AS COST, SUM(A3.STRPRC * A2.CDPAKU) AS RETAIL,     
    A1.CHDLM, A1.CHTLM FROM CHCART00 A1, CDCART00 A2, STSTYL00 A3  
WHERE A1.CHCASN = A2.CDCASN AND A2.CDSTYL = A3.STSTYL AND      
    A2.CDCOLR = A3.STCOLR     AND A2.CDSDIM = A3.STSDIM AND A1.CHSTAT = '25' AND
    (A1.CHDLM = 20110511)     
    AND A1.CHROUT = 'UPSPA' GROUP BY A1.CHCASN, A1.CHTRKN, A1.CHACWT,
    A1.CHDLM, A1.CHTLM  
ORDER BY A1.CHDLM, A1.CHTLM `
person Duncan Howe    schedule 12.05.2011
comment
А временной диапазон? как бы вы разместили это в запросе? Я пробовал много разных способов, но безуспешно A1.CHTLM ›= '200000' AND A1.CHTLM ‹= '092000'. - person jorame; 13.05.2011
comment
Если вам действительно нужно время, то лучшим решением было бы структурировать предложение WHERE в соответствии со строками ...AND ((A1.CHDLM=20110510 AND A1.CHTLM>=092000) --This is the start of the range OR (A1.CHDLM BETWEEN 20110511 AND 20110511) --This is the middle of the range (not always required) OR (A1.CHDLM=20110512 AND A1.CHTLM<=110000)) --This is the end of the range - person Duncan Howe; 13.05.2011

Похоже, вам не хватает некоторых скобок в предложении WHERE.

Попробуй это:-

SELECT A1.CHCASN, A1.CHTRKN, SUM(A2.CDPAKU) AS UNITS, A1.CHACWT, 
    SUM(A2.CDPRC * A2.CDPAKU) AS COST, SUM(A3.STRPRC * A2.CDPAKU) AS RETAIL,
    A1.CHDLM, A1.CHTLM FROM CHCART00 A1, CDCART00 A2, STSTYL00 A3 
WHERE A1.CHCASN = A2.CDCASN AND A2.CDSTYL = A3.STSTYL AND 
    A2.CDCOLR = A3.STCOLR AND A2.CDSDIM = A3.STSDIM AND A1.CHSTAT = '25' AND
    ((A1.CHDLM = 20110510 AND A1.CHTLM >= '200000') 
    OR
    (A1.CHDLM = 20110511)
    OR
    (A1.CHDLM = 20110512 AND A1.CHTLM <= '092000')) 
    AND A1.CHROUT = 'UPSPA' GROUP BY A1.CHCASN, A1.CHTRKN, A1.CHACWT, 
    A1.CHDLM, A1.CHTLM 
ORDER BY A1.CHDLM, A1.CHTLM 
person Duncan Howe    schedule 12.05.2011
comment
Нет, это не сработало. Мне все еще не хватает всех данных за 20110511 год - person jorame; 13.05.2011
comment
Плохо - если вы читаете предложение WHERE, в нем говорится, что ему нужны записи, в которых CHDLM - 20110510, а время - любое после 8 вечера ИЛИ CHDLM - 20110512, а время - до 9:20. Я отредактировал ответ, чтобы включить DLM для 20110511, независимо от времени. Пожалуйста, не могли бы вы попробовать исправленную версию. - person Duncan Howe; 13.05.2011
comment
Хорошо, это сработало просто отлично, но что, если между ними есть еще даты. Скажем, например, я хотел увидеть все между 20110505 и 20110512, используя тот же диапазон времени. я должен указать каждую дату между ними? Я не хочу заставлять пользователя вводить все эти разные даты. Заранее спасибо - person jorame; 13.05.2011
comment
Будет ли этот запрос работать, если я буду использовать одни и те же даты в диапазоне дат? Например, CHDLM = 20110512 и CHDLM = 20110512, спасибо. - person jorame; 13.05.2011
comment
Вы можете использовать оператор BETWEEN A1.CHDML BETWEEN 20110505 AND 20110512 - person Duncan Howe; 13.05.2011
comment
Если вы используете ту же дату, то предложение WHERE просто становится A1.CHDLM = 20110512 без окружающих его И и ИЛИ. - person Duncan Howe; 13.05.2011
comment
Хорошо, я пробовал это, но время не учитывается при выполнении запроса, потому что дает мне все для диапазона дат, игнорируя время. Как я могу сделать это с определенным временем. Спасибо. - person jorame; 13.05.2011
comment
@jorame: Разве я уже не ответил на этот вопрос?: stackoverflow.com/questions/5917103/ - person ypercubeᵀᴹ; 15.05.2011

Одним из решений является объединение столбцов даты и времени в отметку времени или аналогичную структуру, которую гораздо проще использовать для поиска по диапазонам в течение нескольких дней. На самом деле не имеет значения, какой тип данных используется; просто убедитесь, что он следует какому-то формату ГГГГММДДЧЧММСС, и преобразуйте входные параметры таким же образом, чтобы их можно было сравнить с данными столбца.

Предположения:

  • Столбец CHDLM в таблице CHCART00 имеет значение INTEGER и хранит даты в формате ГГГГММДД.
  • Столбец CHTLM в таблице CHCART00 имеет формат CHAR(6) и хранит время в 24-часовом формате ЧЧММСС.
  • Окно, заданное входными параметрами, является непрерывным, без промежутков, таких как «только рабочие часы».

    AND ( BIGINT( A1.CHDLM ) * 1000000 + INTEGER( A1.CHTLM ))

    >= ( BIGINT( 20110510 ) * 1000000 + INTEGER('230000'))

    AND ( BIGINT( A1.CHDLM ) * 1000000 + INTEGER( A1.CHTLM ))

    <= ( BIGINT( 20110512 ) * 1000000 + INTEGER('090000'))

person Fred Sobotka    schedule 20.05.2011

Простой способ получить запрос таков:

SELECT
  num_executions,
  num_exec_with_metrics,
  SUBSTR(stmt_text,1,2000000) AS stmt_text
FROM TABLE (MON_GET_PKG_CACHE_STMT('d', null, null, -1)) AS tf
WHERE
  (VARCHAR_FORMAT(INSERT_TIMESTAMP,'YYYY-MM-DD HH24:MI:SS') > '2016-01-27 07:00:00'
  AND VARCHAR_FORMAT(INSERT_TIMESTAMP,'YYYY-MM-DD HH24:MI:SS') <= '2016-01-27 08:59:59')
ORDER BY INSERT_TIMESTAMP DESC;
person Jayant Reddy    schedule 27.01.2016
comment
Вместо того, чтобы публиковать какой-либо код без пояснений, подумайте о том, чтобы переписать оператор SQL, задающий вопрос. - person SaschaM78; 27.01.2016