交叉联接中日期表和varchar日期字符串的操作数冲突

时间:2018-11-15 17:03:00

标签: sql sql-server sqldatatypes cross-join ssms-2017

这是我先前提出的问题的后续内容,但是由于我试图简化,所以我似乎错过了一些Daily snapshot table using cte loop

我正在尝试在日期和员工表之间建立以下交叉联接。我需要根据部门和部门进行每日盘点,但是日期无法轻松链接,因为日期存储为varchar(不是我的选择,我无法更改)。

我现在有一个日期表,该日期表包含可以链接到该表的style112(yyyymmdd)键,但是在联接的某处似乎失败了。

我是如此接近,但真的迷路了!我从不需要处理字符串日期,也不希望有人使用它。

    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)

所需的输出:
日期 部门1 部门2 部门3
20180901 25 231 154
20180902 23 232 154

1 个答案:

答案 0 :(得分:0)

我认为您根本不需要转换表,因此我将其删除。而且我相信子查询应如下所示:

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')