我有一个在两个日期之间返回数据的查询。通常,这些日期是前一周的周一&上周五。我被要求将此查询视为一个视图。我改为将其作为存储过程,用户可以在其中输入两个日期。但是我想知道是否可以纯粹出于自己的兴趣创建一个视图。
EG。今天是4月21日星期四。所以从约会日期是4月11日星期一,到目前为止是4月15日星期五。
无论如何都要设置我的查询,所以不管本周的哪一天,它都会选择星期一和星期一。星期五约会?然后显然下周它会自动选择从18日开始的日期和时间。到目前为止22日?
答案 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周之前(我觉得不那么棘手)。