Конфликт операнда с таблицей дат и строками даты varchar в перекрестном соединении

Это следует из моего предыдущего вопроса, но, поскольку я пытался упростить, я, похоже, что-то упустил Таблица ежедневных снимков с использованием цикла cte

Я пытаюсь настроить приведенное ниже перекрестное соединение между датами и таблицей сотрудников. Мне нужен ежедневный подсчет по подразделениям и отделам, но даты не будут легко связаны, поскольку даты хранятся в виде varchar (не мой выбор, я не могу его изменить).

Теперь у меня есть таблица дат, включающая ключ style112 (ггггммдд), который я могу связать с таблицей, но, похоже, где-то в соединениях произошел сбой.

Я так близко, но на самом деле потерян! Мне никогда не приходилось работать со строковыми датами и никому этого не пожелаешь.

    DECLARE @DATESTART AS Date = '20180928';

    DECLARE @DATEEND AS Date = '20181031';

    WITH Dates AS (
        SELECT  @DATESTART AS Dte
        UNION ALL
        SELECT  DTE + 1
        FROM Dates
        WHERE Dte <= @DATEEND  )

    SELECT
        Dt.Dte
        ,CAST(DTC.Style112 AS VARCHAR)
        ,Emp.Division_Description
        ,Emp.Department_Description
        ,(SELECT
                COUNT(*)
            FROM ASS_D_EmpMaster_Live E

            WHERE
                E.[Start_Date] <= CAST(DTC.Style112 AS VARCHAR)
                AND (E.Leaving_Date > CAST(DTC.Style112 AS VARCHAR)
                            OR E.Leaving_Date = '00000000')
                                 ) Counts
    FROM Dates Dt

    LEFT JOIN ASS_C_DateConversions DTC
        ON DTC.[Date] = Dt.DtE


        CROSS JOIN
            (
                SELECT DISTINCT
                    Division_Description
                    ,Department_Description
                FROM
                    ASS_D_EmpMaster_Live e              
                ) Emp

    OPTION (MAXRECURSION 1000)

Желаемый результат:
Дата Dept1 Dept2 Dept3
20180901 25 231 154
20180902 23 232 154


person Community    schedule 15.11.2018    source источник
comment
Добавьте некоторые примеры данных таблицы и ожидаемый результат — все в виде форматированного текста, а не изображений.   -  person jarlh    schedule 15.11.2018
comment
Какие СУБД вы используете?   -  person jarlh    schedule 15.11.2018
comment
@jarlh Извините, я вернулся, чтобы пометить это как SSMS. И я работаю над примером результатов, спасибо.   -  person    schedule 15.11.2018
comment
Может попробовать упростить задачу? Если мне нужно прокрутить, я просто ухожу.   -  person jarlh    schedule 15.11.2018
comment
К сожалению, упрощение - это то, как я сюда попал. Я удалил ненужные WHERE, но больше не беспокоюсь.   -  person    schedule 15.11.2018
comment
Если вы говорите, что DTC.Style112 содержит строковые значения в формате ггггммдд, то почему cast(… as varchar)?   -  person Richardissimo    schedule 15.11.2018
comment
@Richardissimo Это было добавлено после того, как я впервые столкнулся с операндом; он уже в таком формате.   -  person    schedule 15.11.2018
comment
Я бы подумал, что вы хотите использовать его как date. Какие бывают типы E.[Start_Date] и E.Leaving_Date?   -  person Richardissimo    schedule 15.11.2018
comment
Ричардиссимо прав. Вам нужно привести даты начала и окончания к значениям char, а не к значениям Style112. Используйте char(8) вместо varchar.   -  person shawnt00    schedule 15.11.2018
comment
Даты начала и окончания - это varchar, что является сутью моей проблемы. Я пытаюсь обойти это с помощью преобразований Style112, но я не могу заставить перекрестное соединение работать без таблицы дат в формате даты и моих дат начала/выхода в varchar. Это проклятие моей жизни, но база данных, к сожалению, не изменится.   -  person    schedule 15.11.2018
comment
Они не в том формате? Вам нужно выполнить приведение к date, а затем обратно к char в нужном вам формате. Я также предполагаю, что ваш подзапрос должен фильтровать отдел и подразделение, чтобы возвращать разные значения. Может быть, это то, что было удалено во время упрощения.   -  person shawnt00    schedule 15.11.2018
comment
@ shawnt00 Shawnt00 Нет, это строки varchar yyyymmdd. Что я должен отлить и переделать; дата начала/отъезда или фактическая дата из таблицы дат? ‹br› Я попытался преобразовать дату-таблицу-дату в соответствие с датой начала, и я предполагаю, что конфликт, вероятно, происходит, но мои попытки исправления не работают.   -  person    schedule 15.11.2018


Ответы (1)


Я не думаю, что вам вообще нужна таблица преобразования, и я бы удалил ее. И я считаю, что подзапрос должен выглядеть так:

SELECT COUNT(*)
FROM ASS_D_EmpMaster_Live E
WHERE
         CAST(E.Start_Date   AS DATE) <= Dt.Dte
    AND (CAST(E.Leaving_Date AS DATE) >  Dt.Dte OR E.Leaving_Date = '00000000')
person shawnt00    schedule 15.11.2018
comment
К сожалению, я получаю сообщение о сбое преобразования при преобразовании даты и/или времени из строки символов, когда я запускаю вышеприведенное и конфликт типа операнда: дата несовместима с int, если я удаляю кавычки вокруг дат. - person ; 16.11.2018
comment
Может быть, использовать try_parse() при преобразовании даты отъезда? - person shawnt00; 16.11.2018
comment
К сожалению, результат NULL! - person ; 16.11.2018
comment
@eelyface Как выглядят эти даты? - person shawnt00; 16.11.2018
comment
Это varchar '20180401'. Я могу привести к int, но это все, кажется. - person ; 19.11.2018
comment
Это можно использовать на сегодняшний день. Вам нужно опубликовать конкретные сообщения об ошибках или что-то в этом роде. - person shawnt00; 19.11.2018
comment
Спасибо, что напомнили мне о вышеизложенном, это помогло мне разобраться в основной части проблемы: одна дата может быть приведена, а другая нет. Я не знаю, почему это так, но весь запрос работает до тех пор, пока я не использую дату выхода, которую я буду рассматривать совсем как другую проблему. Спасибо, что продолжаете отвечать, я ценю это. - person ; 20.11.2018
comment
Это связано с тем, что некоторые значения даты отъезда равны нулям, что не является допустимой датой. Вы можете попробовать cast(nullif(leavingDate, '00000000') as date) - person shawnt00; 20.11.2018
comment
Спасибо за это. Это в сочетании с исключением чего-либо до 01.01.2017 (какие-то ошибочные данные) решили проблему. Спасибо за помощь; Иначе я бы туда не попал. - person ; 21.11.2018