我的SQL-如何在不同的工作日运行不同的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

我很不理解这一点,再次感谢所有的帮助。 我最终为我的案子找到了一个解决方案,它甚至不涉及任何类似的问题 如果是星期一,则选择 我甚至不需要案件陈述

我所要做的就是在WHERE语句中加上一个或中间加上

我已说明我的最终代码如下:

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解决方案也会更加普遍,这实际上让它变得很糟糕。