【问题标题】:How to do I exclude a specific date range within a specific period?如何排除特定时期内的特定日期范围?
【发布时间】:2018-03-26 06:57:46
【问题描述】:

我正在使用SQL Server 2012,我需要我的T-SQL 查询来排除特定时期内的特定时间范围。

我的过滤逻辑如下:

提取所有介于2016-07-012017-03-25 之间的数据以及介于2017-07-012018-03-25 之间的所有数据,同时排除上述过滤周期内周六和周日的所有日期。

我的T-SQL查询如下:

SELECT * from Table1
 WHERE [CreatedOn] between ...
 AND DATENAME(dw,[CreatedOn]) NOT IN ('Saturday', 'Sunday')

我被困在如何正确编写Line 2的逻辑!

【问题讨论】:

  • 类似于BETWEEN,可以使用NOT BETWEEN过滤日期范围。

标签: sql sql-server tsql sql-date-functions


【解决方案1】:

这对你有用

SELECT * from Table1
WHERE 
(
    [CreatedOn] BETWEEN '2016-07-01' AND '2017-03-25' OR
    [CreatedOn] BETWEEN '2017-07-01' AND '2018-03-25'
)
AND ((DATEPART(dw, [CreatedOn]) + @@DATEFIRST) % 7) NOT IN (0, 1)

为了知识

master 数据库的 syslanguages 表有一个 DateFirst 列,该列 为特定语言定义一周的第一天。 SQL 服务器使用美国英语作为默认语言,SQL Server 设置 DATEFIRST 默认为 7(星期日)。我们可以将任何一天重置为第一天 一周使用

SET DATEFIRST 5

这会将星期五设置为一周的第一天。

@@DATEFIRST 返回 SET DATEFIRST 会话的当前值。

SELECT @@DATEFIRST

Reference

【讨论】:

  • 谢谢,但是这个解决方案如何过滤我想要排除的日期?
  • 请查看更新后的答案。我更改了日期过滤器的 where 子句。
  • 我认为应该在 AND 之后删除 WHERE 子句。
【解决方案2】:

BETWEENANDOR 组合在一起。

SELECT 
    * 
from 
    Table1
WHERE 
    (
        [CreatedOn] BETWEEN '2016-07-01' AND '2017-03-25' OR
        [CreatedOn] BETWEEN '2017-07-01' AND '2018-03-25'
    )
    AND DATENAME(dw,[CreatedOn]) NOT IN ('Saturday', 'Sunday')
    AND CreatedOn NOT BETWEEN '2017-01-01' AND '2017-01-02' 

【讨论】:

    【解决方案3】:

    试试这个:

    SELECT * from Table1
    WHERE 
    ([CreatedOn] BETWEEN '2016-07-01' AND '2017-03-25'
     OR
    [CreatedOn] BETWEEN '2017-07-01' AND '2018-03-25') 
    AND DATENAME(dw,[CreatedOn]) NOT IN ('Saturday', 'Sunday')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多