我有一张股票价格表,需要在每周的第一天获得价格。 WHERE子句中的这个SQL运行良好,
DATEADD(ww, DATEDIFF(ww,0,PriceDt), 0)
除非市场周一休市。劳动节就是一个很好的例子。我认为使用COALESCE会在星期二给我价格,如果星期一没有,但这没有用。
coalesce(DATEADD(ww, DATEDIFF(ww,0,PriceDt), 0), DATEADD(ww, DATEDIFF(ww,0,PriceDt), 1)).
有人可以帮忙吗?
declare @t table (PriceDt datetime, Symbol nvarchar(10), OpenPric float, ClosePrice float)
insert @t values ('2010-08-02 00:00:0.000', 'SYM', 15.00, 15.10)
insert @t values ('2010-08-09 00:00:00.000', 'SYM', 15.00, 15.10)
insert @t values ('2010-08-16 00:00:00.000', 'SYM', 15.00, 15.10)
insert @t values ('2010-08-23 00:00:00.000', 'SYM', 15.00, 15.10)
insert @t values ('2010-08-30 00:00:00.000', 'SYM', 15.00, 15.10)
insert @t values ('2010-09-07 00:00:00.000', 'SYM', 15.00, 15.10)
insert @t values ('2010-09-13 00:00:00.000', 'SYM', 15.00, 15.10)
insert @t values ('2010-09-20 00:00:00.000', 'SYM', 15.00, 15.10)
insert @t values ('2010-09-27 00:00:00.000', 'SYM', 15.00, 15.10)
select * from @t
where PriceDt = coalesce(DATEADD(ww, DATEDIFF(ww,0,PriceDt), 0), DATEADD(ww, DATEDIFF(ww,0,PriceDt), 1))
(缺少2010-09-07 00:00:00.000的结果)
2010-08-02 00:00:00.000 SYM 15 15.1 2010-08-09 00:00:00.000 SYM 15 15.1 2010-08-16 00:00:00.000 SYM 15 15.1 2010-08-23 00:00:00.000 SYM 15 15.1 2010-08-30 00:00:00.000 SYM 15 15.1 2010-09-13 00:00:00.000 SYM 15 15.1 2010-09-20 00:00:00.000 SYM 15 15.1 2010-09-27 00:00:00.000 SYM 15 15.1
答案 0 :(得分:1)
这将为您提供表格中每周最早的日期(假设您的一周从星期一开始):
select min(Pricedt) Pricedt
from @t
group by DATEADD(ww, DATEDIFF(ww,0,PriceDt), 0)
现在您可以将该结果加入到您的表中,以获取输入数据的一周中第一天的价格:
select t.Pricedt, t.Symbol, t.OpenPric, t.ClosePrice
from
(
select min(Pricedt) Pricedt
from @t
group by DATEADD(ww, DATEDIFF(ww,0,PriceDt), 0)
) d
join @t t on d.Pricedt = t.PriceDt