周一获得周五的数据

时间:2016-08-24 09:12:15

标签: sql sql-server sql-server-2008

星期一下面的剧本是3天,其他日子则返回1天。 我认为它不能正常工作。 你能帮我解决一下吗?

MyDate>=dateadd(dd,case substring(datename(dw,getdate()),1,3)
when 'MON' then -3 else -1 end,getdate())

3 个答案:

答案 0 :(得分:0)

MyDate>=case 
when datename(dw,getdate())='Monday' 
then dateadd(day,-3,cast(getdate() as date)) 
else dateadd(day,-1,cast(getdate() as date)) end

答案 1 :(得分:0)

您可以使用以下查询。

select case when datepart(weekday ,cast((floor(cast(getdate() as float))) as datetime)) = 2
            then (select cast((floor(cast(getdate() as float))-3) as datetime))
            else (select cast((floor(cast(getdate() as float))-1) as datetime))
           end as Date

答案 2 :(得分:-1)

我认为这可能是因为您使用GETDATE()作为DATEADD的第3个参数,其中也包含时间部分。

这将花费你3天的时间(实际上落后3 * 24小时),但它不会捕捉星期五的开始或3 * 24小时前发生的任何事情。

假设您在星期一上午11:45运行查询,这将从星期五上午11:45开始获取所有数据,但在此之前没有任何内容,这是因为"时间"部分数据。

以下是代码的修改版本,它将捕获星期五(全天)发生的所有数据/行。

MyDate>= dateadd(dd, case 
                        substring(datename(dw,getdate()),1,3)
                            when 'MON'
                                then -3 
                            else -1 end
                        ,cast(cast(getdate() as date) as datetime))

要解决此问题,只需快速修改并将getdate()转换为日期和转换为日期时间,以生成包含当天开始的日期/时间组合。

以下是它的作用的简单示例:

select
    getdate()
    , cast(getdate() as date)
    , cast(cast(getdate() as date) as datetime)

2016-08-24 13:05:11.603 | 2016-08-24 | 2016-08-24 00:00:00.000