我的SQL-如何在不同的工作日运行不同的WHERE语句,比如周一和周五
我很不理解这一点,再次感谢所有的帮助。 我最终为我的案子找到了一个解决方案,它甚至不涉及任何类似的问题 如果是星期一,则选择 我甚至不需要案件陈述 我所要做的就是在WHERE语句中加上一个或中间加上 我已说明我的最终代码如下:我的SQL-如何在不同的工作日运行不同的WHERE语句,比如周一和周五,sql,sql-server,select,case,getdate,Sql,Sql Server,Select,Case,Getdate,我很不理解这一点,再次感谢所有的帮助。 我最终为我的案子找到了一个解决方案,它甚至不涉及任何类似的问题 如果是星期一,则选择 我甚至不需要案件陈述 我所要做的就是在WHERE语句中加上一个或中间加上 我已说明我的最终代码如下: SELECT * FROM (SELECT t.pay_date , t.supp_name , t.client AS row_client , t.ip_status , t.bank_account , t.re
SELECT * FROM
(SELECT
t.pay_date
, t.supp_name
, t.client AS row_client
, t.ip_status
, t.bank_account
, t.remitt_curr AS remitt_curr
, t.remitt_id
, t.apar_id
, t.payment_id
FROM
aipheader t
WHERE
DATEPART(DW, GETDATE()) IN (2,3,4)
AND
t.pay_date BETWEEN '2019-01-01' AND DATEADD(DAY,-4,GETDATE())
OR
DATEPART(DW, GETDATE()) IN (5,6)
AND
t.pay_date BETWEEN '2019-01-01' AND DATEADD(DAY,-2,GETDATE())) x
ORDER BY 1
上面的语句将执行OR块,在我的例子中,OR块是true,即rigt weekday
*********下面的老问题***********
我想在一周的不同休息日运行不同的SELECT语句
实际上,我可以使用以下代码:
select
case
when DATEPART(DW, GETDATE()) = 4 then
(select 'HELLO' )
ELSE
(select 'GOODBYE')
end
在wendsday,上面的代码会返回HELLO,每隔一个工作日,它会返回再见。到目前为止还不错
只要select语句只返回一个值,它就可以工作,但我真的需要一个如下所示的完整表
这里唯一的区别应该是[*FROM table]部分,它打破了这一切:
select
case
when DATEPART(DW, GETDATE()) = 4 then
(select * FROM table1)
ELSE
(select * FROM table2)
end
如果我连以上这些都做不到,我就不能为不同的工作日做出不同的选择,所以这很难理解
我试图用不同的方式封装东西,并添加一些选择,但它不起作用,所以它可能是一些SQL主体
我得到一个错误,我认为如果只返回一个值,这是可以的:
SqlState 37000本机116[Microsoft][ODBC SQL Server驱动程序][SQL
服务器]在以下情况下,只能在选择列表中指定一个表达式:
子查询不随EXISTS一起引入
谢谢你的回复,我现在明白多了
我不想添加专栏,我想我可以做一个全新的SELECT语句。正如您所指出的,我现在看到我的CASE语句只添加了一列
因此,我的第一个ide可能是一个更好的过程,可以实际修改select语句中的WHERE子句
我现在已经试过了,但不起作用
SELECT * FROM aipheader t
WHERE
CASE
WHEN DATEPART(DW, GETDATE()) = 4 THEN
t.pay_date = '2019-10-15'
ELSE
t.pay_date = '2019-10-17'
END
它返回错误:
SqlState 37000本机102[Microsoft][ODBC SQL Server驱动程序][SQL
服务器]靠近“=”的语法不正确
我尝试过更简单的方法:
SELECT * FROM aipheader t
WHERE
t.pay_date BETWEEN DATEADD(DAY,-120,GETDATE()) AND DATEADD(DAY,-5,GETDATE())
上面是一个更简单的形式,但它返回正确的值。
但是使用CASE子句的obove返回关于=-sign的错误
可能WHERE语句中的案例部分不起作用。我不完全理解您试图实现的目标。
SELECT * FROM aipheader t
WHERE
CASE
WHEN DATEPART(DW, GETDATE()) = 4 THEN
t.pay_date = '2019-10-15'
ELSE
t.pay_date = '2019-10-17'
END
当然,您的语句将不起作用,因为您的select语句在返回多个列和行的情况下不起作用。这无法工作,因为您的case when语句将显示一列
因此,您可以执行以下操作:
select
case
when DATEPART(DW, GETDATE()) = 4 then
'HELLO'
ELSE
'GOODBYE'
end as [someField],
*
from
[table]
SELECT
*
FROM
aipheader t
WHERE
t.pay_date = CASE WHEN DATEPART(DW, GETDATE()) = 4 THEN '2019-10-15' ELSE '2019-10-17' END
此查询将表中的所有行和列作为输出+someField显示HELLO或再见。
如果要在星期三或星期三的不同日期显示表中的不同数据,可以通过以下方式更改查询:
select
case
when DATEPART(DW, GETDATE()) = 4 then
[table].[field1]
ELSE
[table].[field2]
end as [someField],
*
from
[table]
这是你要找的吗?子查询应返回1行并指定列名称
select
case
when DATEPART(DW, GETDATE()) = 4 then
(select top 1 col1 from table1 )
ELSE
(select top 1 col2 from table2 )
end as result
From table
CASE-WHEN只能为每个THEN返回一个值,而不能返回包含多行和/或多列的结果集。这就是WHEN的工作原理
您可以通过以下方式实现所需:
DECLARE @DAY INT = DATEPART(DW, GETDATE())
select * FROM table
WHERE (@DAY = 4 AND table.SomeCol = SomeValue)
OR (@DAY = 5 AND table.SomeCol = SomeOtherValue)
... repeat for other days
DECLARE @DAY INT = DATEPART(DW, GETDATE())
IF @DAY = 4
(select * FROM table WHERE table.SomeCol = SomeValue)
ELSE IF @DAY = 5
(select * FROM table WHERE table.SomeCol = SomeOtherValue)
... repeat for other days
DECLARE @DAY INT = DATEPART(DW, GETDATE())
select * FROM table
WHERE @DAY = 4 AND table.SomeCol = SomeValue
UNION ALL
select * FROM table
WHERE @DAY = 5 AND table.SomeCol = SomeOtherValue
UNION ALL
... repeat for other days
或者像这样:
DECLARE @DAY INT = DATEPART(DW, GETDATE())
select * FROM table
WHERE (@DAY = 4 AND table.SomeCol = SomeValue)
OR (@DAY = 5 AND table.SomeCol = SomeOtherValue)
... repeat for other days
DECLARE @DAY INT = DATEPART(DW, GETDATE())
IF @DAY = 4
(select * FROM table WHERE table.SomeCol = SomeValue)
ELSE IF @DAY = 5
(select * FROM table WHERE table.SomeCol = SomeOtherValue)
... repeat for other days
DECLARE @DAY INT = DATEPART(DW, GETDATE())
select * FROM table
WHERE @DAY = 4 AND table.SomeCol = SomeValue
UNION ALL
select * FROM table
WHERE @DAY = 5 AND table.SomeCol = SomeOtherValue
UNION ALL
... repeat for other days
或者像这样:
DECLARE @DAY INT = DATEPART(DW, GETDATE())
select * FROM table
WHERE (@DAY = 4 AND table.SomeCol = SomeValue)
OR (@DAY = 5 AND table.SomeCol = SomeOtherValue)
... repeat for other days
DECLARE @DAY INT = DATEPART(DW, GETDATE())
IF @DAY = 4
(select * FROM table WHERE table.SomeCol = SomeValue)
ELSE IF @DAY = 5
(select * FROM table WHERE table.SomeCol = SomeOtherValue)
... repeat for other days
DECLARE @DAY INT = DATEPART(DW, GETDATE())
select * FROM table
WHERE @DAY = 4 AND table.SomeCol = SomeValue
UNION ALL
select * FROM table
WHERE @DAY = 5 AND table.SomeCol = SomeOtherValue
UNION ALL
... repeat for other days
我的首选可能是第一个或第二个表单。查询必须在已知列之前返回。如果表table1和table2有不同的列,则不能编写一个查询,例如,一天返回table1的五列,另一天返回table2的九列 但是,只要结果列保持不变,您就可以选择联接。下面是一个小例子:
select
p.project_id,
p.project_name,
coalesce(c1.name, c2.name) as team_member,
coalesce(c1.salary, c2.salary * (1.0 + c2.tax / 100.0)) as team_member_salary,
coalesce(c1.job_name, c2.job_title) as team_member_job
from project p
left join crew1 c1 on c1.project_id = p.project_id and datepart(dw, getdate()) = 4
left join crew2 c2 on c2.project_id = p.project_id and datepart(dw, getdate()) <> 4
order by p.project_id;
我不确定我真的理解你在这里想要实现什么。本例假设您正在根据日期从不同的表中读取数据,并将返回两个表中的所有行:
select * from (
select 'HELLO' as col1, * from table1 where DATEPART(DW, GETDATE()) = 4
UNION ALL
select 'GOODBYE' as col1, * from table2 where DATEPART(DW, GETDATE()) <> 4
)
order by col1
编辑后,过滤日期的正确方法如下:
select
case
when DATEPART(DW, GETDATE()) = 4 then
'HELLO'
ELSE
'GOODBYE'
end as [someField],
*
from
[table]
SELECT
*
FROM
aipheader t
WHERE
t.pay_date = CASE WHEN DATEPART(DW, GETDATE()) = 4 THEN '2019-10-15' ELSE '2019-10-17' END
但是,您真的想硬编码2019-10-15和2019-10-17日期吗?似乎这些应该随着时间的推移自动计算
在DW中使用DATEPART时要小心,因为周数起点实际上可能会根据服务器和/或当前会话设置而改变。检查此示例:
DECLARE @TestDate DATE = '2020-01-01' -- Wednesday
SET DATEFIRST 1 -- 1: Monday, 7: Sunday
SELECT DATEPART(DW, @TestDate) -- Returns 3
SET DATEFIRST 7 -- 1: Sunday, 7: Saturday
SELECT DATEPART(DW, @TestDate) -- Returns 4!
因此,无论何时检查一周中的某一天,请确保将DATEFIRST会话参数强制设置为特定值,以使其与您的检查一致。谢谢,这非常好,现在我将尝试在insted of=和我认为我得到它之间进行设置。第一部分是IF-then ide,它与Decler语句完全不匹配,即使这是我可能追求的困难,它没有返回错误,但什么也没有发生,我有一种简单的SQL形式,它不是T-SQL。当答案使我走上正确的轨道时,我将它标记为解决方案。我可能得重写这个问题。我发现
最终,它甚至在任何情况下都不能用OR来完成。不过还是非常感谢!感谢这帮了我很大的忙,我知道该怎么办了,因为一周中不同的日子,我在哪里做的事情其实是不同的。我现在可以看到,这样做是多么简单,即使是艰难的it解决方案也会更加普遍,这实际上让它变得很糟糕。