Консультация SQL, которая возвращает не существующие даты в результате самой консультации

Я работаю с базой данных в Informix. Я соглашаюсь на нее с Веб приложения, разработанного с C#.

В таблице так называемый MC_turnosAgenda у меня есть несколько реестров, от которых я хочу получить только поле, датируй, используя DISTINCT, чтобы получать единственный раз каждую стоимость, выполняя следующее условие:

  • Государство, отличное от 0.

Чтобы это делать, я выполняю следующую консультацию:

SELECT DISTINCT(turno_fecha) fecha
FROM MC_turnosAgenda
WHERE turno_estado <> 0 AND
 (turno_fecha NOT IN (SELECT turno_fecha FROM MC_turnosAgenda WHERE 
 turno_estado = 0))

Даже там я считаю это решенным. Консультация возвращает мне список дат, ej: 20.07.2017, 24.07.2017, 01.08.2017, 03.08.2017, и т.д. я перемещаю Эти даты в контроль календаря для того, чтобы они появились как НЕ ДОСТУПНЫЕ.

То, что я нуждаюсь в том, чтобы сделать: кроме дат, которые я получаю с предыдущей консультацией, я нуждаюсь в том, чтобы включить в этот список все даты, которые не появляются в этой консультации. А именно, если консультация возвращает меня, датирует их 02.08.2017 и 04.08.2017, и не существует никакой реестр с датой, например, 03.08.2017, включать эту дату также. Я довожу до сведения, что есть нижняя дата и максимальная дата, между которыми исканием.

Не, если есть способ это делать, или если вместо того, чтобы это делать из-за SQL, годится искать какой-то способ это делать с кода C# приложения.

0
задан 10.07.2017, 21:07
1 ответ

Лучший soluci¦n уже они сказали ее тебе в комментариях, если у тебя есть какой-то интерфейс тип календарь, просто помечая все d¦-схвати их назначено по умолчанию как доступные, и только помечать не доступного с твоей консультацией, ser¦ - как mÃ: s ¦ptimo.

, Но если у тебя есть algún тип restricci¦n, и у тебя нет другого вывода, чем строить все d¦-схвати их определенного per¦-odo очевидно в твою консультацию, ты был должен добавлять ему, что другая, чтобы получать, d¦-схвати их добавочные. Поскольку ты комментировал, что у тебя нет всех дат в тогда таблице проблема impl¦, - я назначаю встречу в твоем вопросе он:

, Как произвождение последовательности данных о форме dinÃ: слюда.

Есть múltiples возможности, чтобы делать это, ту, что podr¦, - чтобы думать rÃ: pidamente один WHILE LOOP и inserci¦n во временной таблице всех реестров даты с одного FechaDesde до одного FechaHasta однако рекомендуемый предотвращать эти циклы из-за вопросов выступления, вне этого есть несколько выборов, я рекомендую тебе чтение этот art¦-зад , что, хотя он применяет много приемов к SQL server podr¦-an быть примененными к Informix .

Прием, который мы будем использовать, состоит в том, чтобы работать с подмостками dinÃ: слюда 10 типов стоимости, которые мы "умножим" используя CROSS JOIN часто, чтобы строить один увеличительную последовательность números, я нумерую этот sumÃ: ndolo в d¦-эксперте в нашу fechadesde мы darÃ: каждая из дат попросившего per¦-odo. Он тебе присоединил этот Sqlfiddle в SQL Server подобно примеру. Иметь в виду, что примеру удается "mapear" до mÃ: ximo 10.000 d¦-схвати, возможно идти aumentÃ: ndolo возможно суммируя mÃ: s ты изрекаешь CROSS JOIN.

В informix ser¦ - в mÃ: s или меньше asÃ, - tené в счете, который делает достаточно años, что я не вижу Рукописный шрифт в этом диалекте SQL, а следовательно я смог совершить algún ошибку:

DECLARE  v_FechaDesde   DATE
DECLARE  v_FechaHasta   DATE

SELECT  v_FechaDesde    = '20170101'
SELECT  v_FechaHasta    = '20170630'

SELECT  v_FechaDesde + ((A.A*1000) + (B.A*100) + (C.A*10) + D.A) UNITS DAY
    FROM (SELECT 0 AS A UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS A
        CROSS JOIN (SELECT 0 AS A UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS B
        CROSS JOIN (SELECT 0 AS A UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS C
        CROSS JOIN (SELECT 0 AS A UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS D
    WHERE v_FechaDesde + ((A.A*1000) + (B.A*100) + (C.A*10) + D.A) UNITS DAY <= v_FechaDesde
ORDER BY 1

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

  1. Просачиваться последовательности дат, те, которые уже estÃ: n на твою консультацию посредством простого NOT IN (<tu consulta>)
  2. Объединять обе консультации посредством UNION

года Надеялось, что он ты útil.

1
ответ дан 24.11.2019, 07:36
  • 1
    Большое спасибо! Я resultó очень ú til твой ответ. – Willy616 11.07.2017, 17:04