我有一个看起来像这样的表:
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
答案 0 :(得分:2)
假设enddate
和startdate
为datetime
,这可以为您提供所需的结果:
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-31
或2525-01-01
(即使我的申请会持续那么长时间,它也将成为SEP)