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可以从不同的模式中获取结果

Flink SQL 窗口表值函数 Window TVF 实战

使用参数化查询时,TVF 慢得多

Sql server 表表达式

Sql Server 2008 中缺少全文索引系统视图

SQL Server用户定义的函数(UDF)使用详解