T-SQL QUERY设置之间的日期

时间:2018-02-13 09:07:55

标签: sql-server sql-server-2008

我正在制作一份报告,而且我对这个报道不合逻辑。我加入了四个表,但为了简单起见,我假设我有两个表,表1和表2。

  • Table1包含以下列:WorkDateTime, ColTest1, ColTest2, UserName
  • Table2包含以下列:UserName, INdateTIme, OUTdateTime

我需要实现的目标:按Username加入这两个表格,WorkDateTime必须介于(或等于)INdateTImeOUTdateTime以及{{ 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') 数据。

enter image description here

我的查询应仅返回0中的前五个数据,因为Table1用户名Table2仅在上午5:40 2之间有效: 00:00 2月1日。来自EmpNo1的最后两个数据超出下午2:00。

2 个答案:

答案 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.

这对大型数据集的效果不佳。