TSQL - 查找一周的第1天或第2天

时间:2014-06-29 01:15:11

标签: sql-server tsql stockquotes

我有一张股票价格表,需要在每周的第一天获得价格。 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

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