sql-server - 用于跳过周末的条件 SQL 日期参数
问题描述
SQL 新手,对此我完全迷失了。尝试编写查询以提取前一天开设的新帐户,这在周二至周五可以轻松完成。但是在星期一它是星期天,我尝试的一切都出错了。
这是我最接近的,但在最后一行仍然是错误的。我想我正在尝试应用 excel vba 类型逻辑,它只是不喜欢我。有人可以看看吗?
谢谢!
SELECT
PortfolioCode as "Account",
f.reportheading1 as "Name",
d.portfoliostatus as "Status",
e.investmentstrategy as "Strategy",
e.brokersource as "Broker",
e.referringfirm as "RefBy",
e.custodian as "Bank",
e.manager as "Manager",
e.administrator as "APM",
d.initialvalue as "Open Value",
b.StartDate as "Start Date",
e.percentcash as "Cash%",
e.targetmvequity as "Eqt Trgt",
e.targetmvfixed as "FI Trgt",
e.munistrategy as "Muni Strat",
e.nationalmuni as "Nat. Muni",
e.statemunistrategy as "State Strat.",
e.residency as "Residency"
FROM
AdvPortfolioBaseExt as A
INNER JOIN
AdvPortfoliobase AS B ON A.PortfolioBaseID = b.PortfolioBaseID
INNER JOIN
advportfolio AS C ON A.PortfolioBaseID = c.PortfolioID
INNER JOIN
advapp.vportfolio AS D ON A.PortfolioBaseID = D.PortfolioID
INNER JOIN
advportfoliobaseext AS E ON A.portfoliobaseid = e.portfoliobaseID
INNER JOIN
advapp.vportfoliobase AS F ON a.PortfolioBaseID = f.PortfolioBaseID
WHERE
c.portfoliostatus <> 'Closed'
AND IIF(DATEPART(dw, GETDATE()) = 2, b.startdate > GETDATE() - 3, b.startdate > GETDATE()-1)
解决方案
这可能是矫枉过正,但您可能希望参数化查询然后传递日期值。否则我只会做一个简单的 CTE 并设置一个日期时间变量,该变量将用于 where 条件。下面的 SQL 是针对 2005 的(较新的版本有不同的功能)。我不确定您使用的是哪个版本,所以我选择了最低公分母。无论如何,这应该可以工作,如果有索引字段,它们不会受到您正在尝试的 WHERE 子句中的计算条件的影响。
DECLARE @Date DATETIME;
;WITH WeekDayOffset AS (
SELECT 1 as WkDay, -2 as OffSet
UNION ALL
SELECT 2 as WkDay, 0 as OffSet
UNION ALL
SELECT 3 as WkDay, 0 as OffSet
UNION ALL
SELECT 4 as WkDay, 0 as OffSet
UNION ALL
SELECT 5 as WkDay, 0 as OffSet
UNION ALL
SELECT 6 as WkDay, 0 as OffSet
UNION ALL
SELECT 7 as WkDay, -1 as Offset
)
SELECT @Date = CAST(CONVERT(VARCHAR(10), DATEADD(DAY, Offset, GETDATE()),101) AS datetime)
FROM WeekDayOffset
WHERE WkDay = DATEPART(dw, GETDATE())
SELECT
PortfolioCode as "Account",
f.reportheading1 as "Name",
d.portfoliostatus as "Status",
e.investmentstrategy as "Strategy",
e.brokersource as "Broker",
e.referringfirm as "RefBy",
e.custodian as "Bank",
e.manager as "Manager",
e.administrator as "APM",
d.initialvalue as "Open Value",
b.StartDate as "Start Date",
e.percentcash as "Cash%",
e.targetmvequity as "Eqt Trgt",
e.targetmvfixed as "FI Trgt",
e.munistrategy as "Muni Strat",
e.nationalmuni as "Nat. Muni",
e.statemunistrategy as "State Strat.",
e.residency as "Residency"
FROM
AdvPortfolioBaseExt as A
INNER JOIN
AdvPortfoliobase AS B ON A.PortfolioBaseID = b.PortfolioBaseID
INNER JOIN
advportfolio AS C ON A.PortfolioBaseID = c.PortfolioID
INNER JOIN
advapp.vportfolio AS D ON A.PortfolioBaseID = D.PortfolioID
INNER JOIN
advportfoliobaseext AS E ON A.portfoliobaseid = e.portfoliobaseID
INNER JOIN
advapp.vportfoliobase AS F ON a.PortfolioBaseID = f.PortfolioBaseID
WHERE
c.portfoliostatus <> 'Closed'
AND b.startdate > @Date
推荐阅读
- android - 在 Android 上,我的应用的 FCM 机密可以用来模拟我的应用吗?
- java - 使用 thymeleaf 将模板转换为 pdf 后丢失数据
- sql-server - 具有相同列的多个索引建议
- reporting-services - SSRS 如何在饼图上使用聚合?
- powershell - 如何从 powershell 更新 configmap 数据部分?
- android - Firebase Analytics 和 Google Play Console 上的“每日活跃用户”之间的区别
- javascript - 如何在带有传单 1.6.0 的 geojson 上正确使用 setStyle?
- ab-initio - VASP 中的形成能间隙 He-W
- react-native - 如何使用旧的密钥库文件更新我的反应本机应用程序
- javascript - 如何正确使用 findOne mongoDB 查询?