SQL Server - where + TVF/SVF、交叉应用、T-SQL
Posted
技术标签:
【中文标题】SQL Server - where + TVF/SVF、交叉应用、T-SQL【英文标题】:SQL Server - where + TVF/SVF, cross-apply, T-SQL 【发布时间】:2015-07-01 19:51:02 【问题描述】:我试图创建一个 SQL 来根据日期提取数据,现在无法使用 where 子句来获取我真正需要的内容 我有下表和 TVF:
/* dbo.weeks -> column(weeknum), column(date) **date is all Fridays** */
weeknum date
1 2001-09-21
2 2001-09-28
3 2001-10-05
... ....
/* fnBenchMark(@weeknum) -> display benchmark data based on weeknum */
这是我的代码:
SELECT p.weeknum, p.date, q.companyid, q.index
FROM dbo.Weeks AS p
cross apply
dbo.fnBenchmark(p.weeknum) as q
where date = '2001-09-21'
/* Here is what I wish to add to above code but don't know how to do it */
if
date in dbo.Weeks column (date) --if date on where clause is a Friday and it is on dbo.weeks table
then run above code
else
change date to LastFridayDate --if date on where clause is Sat~Thur, then use previous Friday's date
then run above
例如,假设 2001-09-21 是星期五,如果我在 where 子句中输入 2001-09-24,我希望 SQL 运行 "where date = " 2001-09-21“自从我进入的 2001-09-24 不是星期五”
也许我应该创建另一个函数(SVF?)来根据我输入的参数@date 返回上一个星期五的日期?然后使用:
where date = fnFridayCheck(@date I entered)
【问题讨论】:
什么是**date**
???
添加类型和/或创建表语句可能会有所帮助。
如果你写了一个函数来获取下一个(或上一个 - 如果你选择星期三,你想要最后一个还是下一个星期五?)星期五。所以你的WHERE
子句类似于WHERE [date] = fnFriday('2001-09-24')
。然后,您必须将其编写为一个函数,该函数接受 1 个日期输入并使用您的 dbo.weeks 表输出最接近的日期,该日期也是星期五。
另外,你为什么在你的一些领域使用**?这看起来不像我见过的任何 T-SQL。你想用 la reddit 格式加粗它们吗?
@Tingo 我猜你是对的,也许我可以创建一个新的 FridayCheck SVF 然后使用 where date = fnFridayCheck(@date I enter)
【参考方案1】:
也许你可以使用
datepart(dw,getdate())
而不仅仅是存储过程或例如查询
IF datepart(dw,getdate()) = 6
BEGIN
something if it's a friday (because 6 in dateprart points to firday)
END
ELSE
BEGIN
something else to do
END
【讨论】:
以上是关于SQL Server - where + TVF/SVF、交叉应用、T-SQL的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server中的常见TVF可以从不同的模式中获取结果