创建一个视图以具有相对日期

时间:2016-04-21 08:36:50

标签: sql sql-server sql-server-2012

我有一个在两个日期之间返回数据的查询。通常,这些日期是前一周的周一&上周五。我被要求将此查询视为一个视图。我改为将其作为存储过程,用户可以在其中输入两个日期。但是我想知道是否可以纯粹出于自己的兴趣创建一个视图。

EG。今天是4月21日星期四。所以从约会日期是4月11日星期一,到目前为止是4月15日星期五。

无论如何都要设置我的查询,所以不管本周的哪一天,它都会选择星期一和星期一。星期五约会?然后显然下周它会自动选择从18日开始的日期和时间。到目前为止22日?

2 个答案:

答案 0 :(得分:2)

查找上周一的周一和周五(这对DATEFIRST不敏感):

CAST(DATEADD(WEEK,DATEDIFF(WEEK,0,GETDATE())-1,0) AS DATE) 'Monday Last Week'
CAST(DATEADD(WEEK,DATEDIFF(WEEK,0,GETDATE())-1,4) AS DATE) 'Friday Last Week'

这是有效的,因为Date = 0是星期一:

SELECT DATENAME(WEEKDAY, 0) 'What Was Day Zero'

What Was Day Zero
------------------------------
Monday

所以你的观点会像(未经测试):

CREATE VIEW SomeView AS
  SELECT 
    SomeCols 
  FROM 
    SomeTable S
  WHERE  S.SomeDate BETWEEN
    CAST(DATEADD(WEEK,DATEDIFF(WEEK,0,GETDATE())-1,0) AS DATE)
    AND 
    CAST(DATEADD(WEEK,DATEDIFF(WEEK,0,GETDATE())-1,4) AS DATE);

答案 1 :(得分:1)

我喜欢@Les H的解决方案。想到这可能是一个类型不是日期的列,但是像datetime,datetime2这样的东西我认为这样的事情可能会更好:

CREATE VIEW SomeView AS
  SELECT 
    SomeCols 
  FROM 
    SomeTable S
  WHERE  
    S.SomeDate >= DATEADD(WEEK,DATEDIFF(WEEK,0+(7*1),GETDATE()),0)
    AND 
    S.SomeDate < DATEADD(WEEK,DATEDIFF(WEEK,0+(7*1),GETDATE()),5)

在这里,我提出了一个防御性编码来反对选择日期\时间值和一个范围(之间不起作用),我只是略微改变了表达式,使它更明显我们正在做什么,可以简单地改变* 1部分意味着N周之前(我觉得不那么棘手)。