存在于一年中但不存在于另一个中的日期的 SQL 语法

Posted

技术标签:

【中文标题】存在于一年中但不存在于另一个中的日期的 SQL 语法【英文标题】:SQL Syntax for Date that exist in on year but not in Another 【发布时间】:2015-01-12 15:35:50 【问题描述】:

我正在尝试编写一个查询,该查询将为我提供订单日期存在于 2013 年但不存在于 2014 年的所有成员的记录。当我编写查询时,它会为我提供仍然存在于 2013 年的所有记录2014 年。我正在尝试仅获取订单日期在 2013 年而不是 2014 年的记录。所以它应该显示 2013 年存在的记录并排除 2014 年不存在的记录。请帮忙,因为我真的是 SQL 新手.

非常感谢。

以下是我的查询:

选择 OMFMC.BILL_MASTER_CUSTOMER_ID, OMFMC.BILL_FIRST_NAME, OMFMC.BILL_LAST_NAME, CMI.NATIONAL_LEVEL2, 分钟(OMFMC.ORDER_DATE), OMFMC.ORDER_DATE, FT.PAYMENT_AMOUNT,

SUM(FT.PAYMENT_AMOUNT)as SUM

来自 客户 CUSTOMER_IN_TRIBUTE_TO

RIGHT OUTER JOIN ORDER_FND_DETAIL OFD
    ON (CUSTOMER_IN_TRIBUTE_TO.MASTER_CUSTOMER_ID=OFD.IN_TRIBUTE_TO_MAST_CUST 
    and CUSTOMER_IN_TRIBUTE_TO.SUB_CUSTOMER_ID=OFD.IN_TRIBUTE_TO_SUB_CUST)


RIGHT OUTER JOIN ORDER_MBR_FND_MTG_CUS_INFO_VW OMFMC
    ON (OMFMC.ORDER_NO=OFD.ORDER_NO 
    and OMFMC.ORDER_LINE_NO = OFD.ORDER_LINE_NO  )


LEFT OUTER JOIN CUS_CURRENT_MEMBERSHIP_INFO CMI
    ON (CMI.MASTER_CUSTOMER_ID=OMFMC.BILL_MASTER_CUSTOMER_ID 
    and CMI.SUB_CUSTOMER_ID=OMFMC.BILL_SUB_CUSTOMER_ID)  


LEFT OUTER JOIN FAR_TXN FT
    ON (FT.ORDER_NO=OMFMC.ORDER_NO 
    and FT.ORDER_LINE_NO=OMFMC.ORDER_LINE_NO)  

在哪里

OMFMC.ORDER_STATUS_CODE='A' 
AND OMFMC.LINE_STATUS_CODE = 'A'        
AND OMFMC.ORDER_STATUS_CODE = 'A' 
AND OMFMC.LINE_STATUS_CODE = 'A'   
AND OMFMC.ORDER_DATE  BETWEEN  '1/1/2013' and '12/31/2013'
AND OMFMC.ORDER_DATE  Not BETWEEN  '1/1/2014' and '12/31/2014'
AND OMFMC.BILL_CUSTOMER_CLASS_CODE  NOT IN  ( 'TEST_MBR','STAFF' ) 
AND FUND in ('FOSFN' , 'MFUND')

分组依据 OMFMC.BILL_MASTER_CUSTOMER_ID, OMFMC.BILL_FIRST_NAME, OMFMC.BILL_LAST_NAME, OMFMC.BILL_LABEL_NAME, OMFMC.BILL_PRIMARY_EMAIL_ADDRESS, OMFMC.BILL_ADDRESS_1, OMFMC.BILL_ADDRESS_2, OMFMC.BILL_CITY, OMFMC.BILL_STATE, OMFMC.BILL_POSTAL_CODE, CMI.NATIONAL_LEVEL2, OMFMC.ORDER_DATE, FT.PAYMENT_AMOUNT

HAVING SUM(FT.PAYMENT_AMOUNT)  <  0

Order By BILL_MASTER_CUSTOMER_ID

在订单日期字段中,有日期为 2013 年和 2014 年的日期。我希望我的查询查看 2013 年和 2014 年的订单日期,并且只提取 2013 年的订单日期。而不是具有 2013 年和 2014 年日期的记录。如果他们在 2013 年和 2014 年有订单,那么我想排除这些记录。比如:

enter code here

Bill_Member_ID.............Order_Date 123.......................2013 年 1 月 5 日 123....... 2013 年 1 月 27 日 123....... 2014 年 2 月 15 日 123....... 2014 年 2 月 18 日 456....................... 2013 年 1 月 7 日 789....... 2013 年 1 月 5 日 789....... 2014 年 2 月 17 日 992........ 2013 年 3 月 15 日

那么我应该得到一个回报

Bill_Member_ID.............Order_Date

456....................... 2013 年 1 月 7 日 992........ 2013 年 3 月 15 日

非常感谢

【问题讨论】:

【参考方案1】:

您需要的是一个简单的子选择,并将其结果输入到最外层的选择中以显示结果。

您要查找的是Bill_Member_ID 的列表,他们的订单日期在 2013-01-01 和 2013-12-31(含)之间,但没有在 2014-01-01 和 2014 之间的订单日期-12-13。所以,让我们构建我们的伪代码选择。我们由内而外地执行此操作(从最内层开始,一直到选择的最外层)。

首先,生成 2014 年有订单的会员列表。那就是

Select Bill_Member_ID
From Order_Table
WHERE Year( OrderDate ) = '2014';

我们将其作为条件提供给下一个选择。下一层的工作是选择 OrderDate 为 2013 年而非 2014 年的所有成员。

    Select Bill_Member_ID
    From Order_Table
    WHERE Year( OrderDate ) = '2013' AND Bill_Member_ID Not In 
    (
        Select Bill_Member_ID
        From Order_Table
        WHERE Year( OrderDate ) = '2014'
    )

这会生成您的 Bill_Member_ID 列表,他们在 2013 年有订单,但在 2014 年没有订单。添加您最终选择所需的其他列。此外,根据需要添加您的其他过滤条件(即非测试和非员工)以缩小结果范围。

这就是您真正需要做的所有事情来生成您的目标客户列表。如果您使用的数据库不支持仅指定年份,则需要使用日期之间来过滤条件范围内的 where 日期字段。

【讨论】:

非常感谢 StarPilot!这做到了。 :) 不客气。很高兴这对你有用。在 SO,我们希望将解决问题的答案作为实际答案接受。

以上是关于存在于一年中但不存在于另一个中的日期的 SQL 语法的主要内容,如果未能解决你的问题,请参考以下文章

根据存在于另一个模型数组中的日期对模型数组进行排序。斯威夫特 3

如果 id 不存在于另一个表中,则根据条件使用 sql 计算 id 的编号

检查Table1中的字段组合是不是存在于另一个Table2中(SQL)

检查日期是不是已存在于另一个时间段中

数组中的至少一个元素存在于另一个数组中

T-SQL 将存在于另一个字段中的连字符分隔值的平均值放入一个字段中