我有这个简单的查询返回前一天的数据。
SELECT * FROM mytable
WHERE DATEDIFF(day,CONVERT(datetime,mytable.mydate, 121),GETDATE()) = 1
使用此查询会在星期一成为问题,因为前一天是星期日,但星期日没有数据。
所以我希望查询能够在星期一检索星期五的数据(最后一次活动)
任何想法如何做到这一点?
关于日期数据类型的一点注释。日期字段为VARCHAR
数据类型。
我继承了数据库,现在已经使用了10多年。
提前感谢您的协助。
答案 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