我无法整合一个where子句,该子句将基于now()基于名为DatePick的列选择记录。
基本上,我需要的是一个where子句,它将产生以下结果:
NOW()=今天(8/16/11),然后基于1/3分解年份,所以这个例子是3)
1/1 / 11-4 / 15/11:1
16分之4/ 11-8 / 15/11:2
8/16/11 - 12/31/11:3
另一个例子,如果now()= 1/1/12那么结果将是1
1/1 / 12-4 / 15/12:1
16分之4/ 12-8 / 15/12:2
8/16/12 - 12/31/12:3
然后根据该日期范围(1或2或3),它将选择DatePick中该日期范围的所有记录。我希望这是基于年度的动态
答案 0 :(得分:0)
在这里采取一个非常随机的猜测只是为了尝试得到一个例子,所以我们OP可以说我是否朝着正确的方向前进。
ANSI标准定义了窗口/分区/分析函数,其中一个是NTILE我向MS众神祈祷,但甲骨文和其他主要供应商也提供它。 NTILE会将数据集分成相等大小的块。在以下示例中,我在DEMO_DATE递归表中生成一年中的所有日期。然后,我在DATA_PARTITION中使用这些日期将这些日期值分成3个大小相等的桶。提供最终查询以演示它生成的边界
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)
输出
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值以获得不同的细分(季度,半年等)。虽然不是最终解决方案,但这是否与您试图解决的问题一致?
答案 1 :(得分:0)
这会奏效。如果您使用标量函数返回日期所在的日期分组(1-3),无论是当前日期还是创建日期,可能会更好。
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)
使用获取日期组的功能,它可能如下所示:
SELECT *
FROM YourTable
WHERE DATEPART(YY, TheDate) = DATEPART(YY, GETDATE())
AND dbo.GetDateGrouping(TheDate) = dbo.GetDateGrouping(GETDATE())