或者逻辑过滤掉日期

时间:2018-03-26 11:58:56

标签: sql-server tsql

我有一个看起来像这样的表:

STARTDATE               ENDDATE                 COMPANYID   TIMESERIESREFRECID
------------------------------------------------------------------------------
2018-01-01 00:00:00.000 2018-12-31 00:00:00.000 OK          105637207641
2019-01-01 00:00:00.000 1900-01-01 00:00:00.000 OK          105637207641
  

NB:不介意连接名称和别名,还有许多其他表格,但不是您的信息所必需的

     

NB2: 1900-01-01意味着它在这个时间和前期都有效(所以实际上它应该是9999-12-31,如果它应该100%正确。但希望你得到想法。

我有一个看起来像这样的SQL:

SELECT E.STARTDATE,e.ENDDATE, c.COMPANYID, a.TIMESERIESREFRECID 
FROM [stg].[EMS_TimeSeriesValues] a WITH (NOLOCK)
inner join [stg].ContractPart e WITH (NOLOCK)  

on d.DATAAREAID = e.DATAAREAID and d.CONTRACTNUM = e.CONTRACTNUM 
and (e.ENDDATE > GETDATE() or  e.ENDDATE = '1900-01-01')

我想要的是,我只想要当前有效的Row。这意味着我想要仍未达到enddate的行。

我试过这个:

and (e.ENDDATE > GETDATE() and e.StartDate < getdate() or  e.ENDDATE = '1900-01-01')

但这似乎不起作用。我也试过不同的括号,但我似乎无法做到正确。

现在想要的结果应该是:

 STARTDATE               ENDDATE                    COMPANYID   TIMESERIESREFRECID
 ------------------------------------------------------------------------------
 2018-01-01 00:00:00.000 2018-12-31 00:00:00.000    OK          105637207641

当我们在2019年,我当然只想要这一行:

 STARTDATE               ENDDATE                COMPANYID   TIMESERIESREFRECID
 ------------------------------------------------------------------------------
 2019-01-01 00:00:00.000 1900-01-01 00:00:00.000    OK          105637207641

1 个答案:

答案 0 :(得分:2)

假设enddatestartdatedatetime,这可以为您提供所需的结果:

SELECT e.STARTDATE, e.ENDDATE, c.COMPANYID, a.TIMESERIESREFRECID 
FROM [stg].[EMS_TimeSeriesValues] AS a 
inner join [stg].ContractPart AS e 
ON d.DATAAREAID = e.DATAAREAID 
AND d.CONTRACTNUM = e.CONTRACTNUM 
WHERE e.STARTDATE < GETDATE()
AND (e.ENDDATE > GETDATE() OR e.ENDDATE = '1900-01-01T00:00:00')

阅读Aaron Bertrand的Bad habits : Putting NOLOCK everywhere,了解我删除NOLOCK提示的原因。

P.S
EndDate应为未来日期或null。我喜欢使用9999-12-312525-01-01(即使我的申请会持续那么长时间,它也将成为SEP