首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据NOW()选择特定日期范围的SQL where子句

根据NOW()选择特定日期范围的SQL where子句
EN

Stack Overflow用户
提问于 2011-08-16 21:55:23
回答 2查看 489关注 0票数 0

我在组合一个where子句时遇到了麻烦,该子句将根据一个名为DatePick的列基于now()来选择记录。

基本上,我需要的是一个where子句,它将导致以下结果:

NOW() = today (8/16/11),然后根据1/3分解年份,因此此示例为3)

1/1/11-4/15/11:1

4/16/11-8/15/11:2

8/16/11 - 12/31/11:3

再举一个例子,如果now() = 1/1/12,那么结果将是1

1/1/12-4/15/12:1

4/16/12-8/15/12:2

8/16/12 - 12/31/12:3

然后,基于该日期范围(1、2或3),它将为该日期范围选择DatePick中的所有记录。我希望这是基于年份的动态变化

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-16 22:17:35

这将会起作用。如果您创建一个标量函数来返回日期所在的日期分组(1-3),无论是当前日期还是创建日期,可能会更好。

代码语言:javascript
运行
复制
SELECT  *
FROM YourTable
WHERE DATEPART(YY, TheDate) = DATEPART(YY, GETDATE())
    AND (CASE   
            WHEN (DATEPART(MM, TheDate) < 4) 
                OR DATEPART(MM, TheDate) = 4 AND DATEPART(DAY, TheDate) < 16
                THEN 1
            WHEN (DATEPART(MM, TheDate) < 8) 
                OR DATEPART(MM, TheDate) = 8 AND DATEPART(DAY, TheDate) < 16
                THEN 2
            ELSE
                3
        END) =
        (CASE   
            WHEN (DATEPART(MM, GETDATE()) < 4) 
                OR DATEPART(MM, GETDATE()) = 4 AND DATEPART(DAY, GETDATE()) < 16
                THEN 1
            WHEN (DATEPART(MM, GETDATE()) < 8) 
                OR DATEPART(MM, GETDATE()) = 8 AND DATEPART(DAY, GETDATE()) < 16
                THEN 2
            ELSE
                3
        END)

使用获取日期组的函数,它可能如下所示:

代码语言:javascript
运行
复制
SELECT  *
FROM YourTable
WHERE DATEPART(YY, TheDate) = DATEPART(YY, GETDATE())
    AND dbo.GetDateGrouping(TheDate) = dbo.GetDateGrouping(GETDATE())
票数 0
EN

Stack Overflow用户

发布于 2011-08-16 22:14:18

在这里进行一个非常随机的猜测,试着拿出一个例子,这样我们就可以说,我是否在正确的方向上。

ANSI标准定义了窗口/分区/分析函数,其中之一是NTILE,我向MS上帝祈祷,但甲骨文和其他主要供应商也提供它。NTILE将数据集划分为大小相等的块。在下面的示例中,我在DEMO_DATE递归表中生成了一年中的所有日期。然后,我在DATA_PARTITION中使用这些日期将这些日期值划分为3个大小相等的存储桶。提供最终查询是为了演示其生成的边界

代码语言:javascript
运行
复制
DECLARE 
    @numberOfGroups int
,   @terminal_date datetime

SELECT
    @numberOfGroups = 3
,   @terminal_date = '2012-01-01'
;WITH DEMO_DATES AS
(
    SELECT CAST('2011-01-01' AS datetime) AS zee_date
    UNION ALL
    SELECT DATEADD(d, +1, DD.zee_date)
    FROM
        demo_dates DD
    WHERE 
        DD.zee_date < @terminal_date

)
, DATE_PARTITION as
(
SELECT
    DD.zee_date
    -- http://msdn.microsoft.com/en-us/library/ms175126.aspx
,   NTILE(@numberOfGroups) OVER (ORDER BY DD.zee_date) AS group_number
FROM DEMO_DATES DD
)
SELECT
    MIN(DP.zee_date) AS smallest_date
,   MAX(DP.zee_date) AS largest_date
,   DP.group_number
FROM
    DATE_PARTITION DP
GROUP BY
    DP.group_number    
OPTION(MAXRECURSION 366)

输出

代码语言:javascript
运行
复制
smallest_date               largest_date               group_number
2011-01-01 00:00:00.000     2011-05-02 00:00:00.000    1
2011-05-03 00:00:00.000     2011-09-01 00:00:00.000    2
2011-09-02 00:00:00.000     2012-01-01 00:00:00.000    3

您可以调整@numberOfGroups值以获得不同的细分市场(季度、半年等)。虽然不是最终的解决方案,但这是否符合您试图解决的问题?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7079273

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档