如何仅在工作日提取前一天的记录?

时间:2017-01-24 14:56:47

标签: sql sql-server

我有这个简单的查询返回前一天的数据。

SELECT * FROM mytable 
WHERE DATEDIFF(day,CONVERT(datetime,mytable.mydate, 121),GETDATE()) = 1

使用此查询会在星期一成为问题,因为前一天是星期日,但星期日没有数据。

所以我希望查询能够在星期一检索星期五的数据(最后一次活动)

任何想法如何做到这一点?

关于日期数据类型的一点注释。日期字段为VARCHAR数据类型。

我继承了数据库,现在已经使用了10多年。

提前感谢您的协助。

3 个答案:

答案 0 :(得分:3)

这个怎么样?

SELECT TOP 1 WITH TIES t.*
FROM mytable t
WHERE mydate < CAST(getdate()  as DATE) -- assume mydate is a date
ORDER BY CAST(mydate as DATE) DESC;

这将获得表格中最近一天的数据,以及有数据的任何一天。

编辑:

显然,mydate存储在varchar中。这是一个坏主意,但如果你要这样做,那么格式121是一个非常好的选择。我会修改上面的内容:

SELECT TOP 1 WITH TIES t.*
FROM mytable t
WHERE mydate < CONVERT(VARCHAR(10), getdate(), 121)
ORDER BY LEFT(mydate, 10) DESC;

注意:这会将日期比较为字符串。但这没关系,因为日期格式为YYYY-MM-DD,具有可比性。如果性能是一个问题,我会建议mydate上的计算列(转换为日期时间或日期)与列上的索引。

答案 1 :(得分:1)

你可以尝试这样的事情。它在一周的第一天就像星期日一样。

SELECT * FROM mytable 
WHERE DATEDIFF(day,CONVERT(datetime,mytable.mydate, 121),GETDATE()) = case datepart(dw, GETDATE())
when 2 then 3 --read 3 days back on a monday
when 1 then 2 --read 2 days back on a sunday
else 1 end

答案 2 :(得分:0)

声明datetime变量,并使用DATEPART()确定一周中的哪一天GETDATE()(查询正在运行的那一天)。然后,在星期一,将我们的日期改为负两天。

declare @queryDate datetime;
set @queryDate = case when DATEPART(dw, GETDATE()) = 1 then DATEADD(d, -2, GETDATE()) else GETDATE() end;
select * from mytable 
where DATEDIFF(day,CONVERT(datetime,mytable.mydate, 121),@queryDate) = 1