我正在制作一份报告,而且我对这个报道不合逻辑。我加入了四个表,但为了简单起见,我假设我有两个表,表1和表2。
Table1
包含以下列:WorkDateTime, ColTest1, ColTest2, UserName
Table2
包含以下列:UserName, INdateTIme, OUTdateTime
我需要实现的目标:按Username
加入这两个表格,WorkDateTime
必须介于(或等于)INdateTIme
和OUTdateTime
以及{{ 1}}基于用户的输入。
像这样的例子:
WorkDateTime
我的桌子有一千条记录。但请看下面的示例数据。我上面的查询返回SELECT *
FROM Table1
INNER JOIN Table2 ON Table1.UserName = Table2.UserName
AND Table1.WorkDateTime BETWEEN Table2.INdateTIme AND Table2.OUTdateTime
WHERE Table1.WorkDateTime BETWEEN CONVERT(date, '2018-02-01 00:00:00.000') AND CONVERT(date, '2018-02-07 00:00:00.000')
数据。
我的查询应仅返回0
中的前五个数据,因为Table1
用户名Table2
仅在上午5:40 与 2之间有效: 00:00 2月1日。来自EmpNo1
的最后两个数据超出下午2:00。
答案 0 :(得分:1)
所以我将我的查询修改为这个(根据@uzi建议)并且它有效:
SELECT *
FROM Table1
INNER JOIN Table2 ON Table1.UserName = Table2.UserName
AND CONVERT(datetime, Table1.WorkDateTime) BETWEEN CONVERT(datetime, Table2.INdateTIme) AND CONVERT(datetime, Table2.OUTdateTime)
WHERE CONVERT(date,Table1.WorkDateTime) BETWEEN CONVERT(date, '2018-02-01 00:00:00.000') AND CONVERT(date, '2018-02-07 00:00:00.000')
我只需添加CONVERT()
功能。我很困惑,我的桌子有相同的格式,但它不会运行。我想,为了安全起见,我应该每次都包含CONVERT()
函数。
答案 1 :(得分:0)
交叉申请将允许您过滤
where table1.date > table2.indate and table1.date < table2.outdate.
这对大型数据集的效果不佳。