Oracle TRUNC 按季度日期但具有自定义年份开始日期
Oracle TRUNC date by quarter but with custom year start date
我需要按季度获取汇总值,这可以使用带有选项 'Q' 的 trunc 函数来完成,就像这样
select count(*), trunc(DATE_COL, 'Q') from TABLE_NAME
group by trunc(DATE_COL, 'Q')
但这里的问题是我需要这一年从前一年的 12 月 1 日开始而不是 1 月 1 日(例如:2015 年第一季度从 2014 年 12 月 1 日开始到 2015 年二月 28 日结束,而不是 2015 年 1 月 1 日至 2015 年 3 月 31 日)。
补充:所以第一季度包括十二月、一月、二月; Q2包括三月、四月、五月; Q3包括6月、7月、8月;第 4 季度包括 9 月、10 月、11 月
PS:我正在使用 Oracle 11g,我将通过 PHP 5.3 运行 这些查询。
"I need the year to start on the 1st Dec of the previous year instead of 1st Jan (Ex: the Q1 2015 starts on 1-Dec-2014 and ends on 28-Feb-2015"
好的,所以你想将所有 Quarters 倒退一个月。很简单:使用带负数的 ADD_MONTHS() 减去一个月....
select count(*), add_months(trunc(DATE_COL, 'Q'), -1) Q
from TABLE_NAME
group by add_months(trunc(DATE_COL, 'Q'), -1)
ADD_MONTHS() 是一个标准的 Oracle 函数。 Find out more.
I need the year to start on the 1st Dec of the previous year instead of 1st Jan (Ex: the Q1 2015 starts on 1-Dec-2014
要获取当前季度的 2014 年 12 月 1 日而不是 2015 年 1 月 1 日,您可以从该季度后移一天,然后获取该月的第一天。
Update 使用 ADD_MONTHS 比我使用 TRUNC 更好更整洁 两次。我建议使用他的解决方案。我的可能是另一种选择,很高兴知道。
例如,
SQL> SELECT trunc(trunc(SYSDATE, 'Q') - 1, 'month') Q1 FROM dual;
Q1
---------
01-DEC-14
SQL>
试试,
SELECT COUNT(*),
TRUNC(TRUNC(DATE_COL, 'Q') - 1, 'month') Q1
FROM TABLE_NAME
GROUP BY TRUNC(TRUNC(DATE_COL, 'Q') - 1, 'month');
我觉得你这里有几个问题。
1) 要将 12 月的日期推送到原生 Q1 包中,请使用 add_months(:date,1)。这会将所有内容按您的偏移量移动到 Oracle 的 Q1、2、3、4 中以便于聚合。
2) 标签。如果您需要查询来进行动态标记,那么 APC 和 Lalit 可以帮助您找到正确的开始日期。从那里,last_day(add_months(Quarter_start_date,3)) 会给你另一个端点!
3) 好的,那么您是在寻找每季度一行的 return 吗?还是每年一行,四个季度为列?如果每季度一行,您是否需要确保 return 一个季度没有数据的一行?
但是要使用一个月的偏移量按季度进行简单汇总:
SELECT count(*)
, add_months(trunc(add_months(your_date_field,1),'Q'),-1) q_start_date
FROM YOUR_TABLE
GROUP BY add_months(trunc(add_months(your_date_field,1),'Q'),-1);
我需要按季度获取汇总值,这可以使用带有选项 'Q' 的 trunc 函数来完成,就像这样
select count(*), trunc(DATE_COL, 'Q') from TABLE_NAME
group by trunc(DATE_COL, 'Q')
但这里的问题是我需要这一年从前一年的 12 月 1 日开始而不是 1 月 1 日(例如:2015 年第一季度从 2014 年 12 月 1 日开始到 2015 年二月 28 日结束,而不是 2015 年 1 月 1 日至 2015 年 3 月 31 日)。 补充:所以第一季度包括十二月、一月、二月; Q2包括三月、四月、五月; Q3包括6月、7月、8月;第 4 季度包括 9 月、10 月、11 月
PS:我正在使用 Oracle 11g,我将通过 PHP 5.3 运行 这些查询。
"I need the year to start on the 1st Dec of the previous year instead of 1st Jan (Ex: the Q1 2015 starts on 1-Dec-2014 and ends on 28-Feb-2015"
好的,所以你想将所有 Quarters 倒退一个月。很简单:使用带负数的 ADD_MONTHS() 减去一个月....
select count(*), add_months(trunc(DATE_COL, 'Q'), -1) Q
from TABLE_NAME
group by add_months(trunc(DATE_COL, 'Q'), -1)
ADD_MONTHS() 是一个标准的 Oracle 函数。 Find out more.
I need the year to start on the 1st Dec of the previous year instead of 1st Jan (Ex: the Q1 2015 starts on 1-Dec-2014
要获取当前季度的 2014 年 12 月 1 日而不是 2015 年 1 月 1 日,您可以从该季度后移一天,然后获取该月的第一天。
Update
例如,
SQL> SELECT trunc(trunc(SYSDATE, 'Q') - 1, 'month') Q1 FROM dual;
Q1
---------
01-DEC-14
SQL>
试试,
SELECT COUNT(*),
TRUNC(TRUNC(DATE_COL, 'Q') - 1, 'month') Q1
FROM TABLE_NAME
GROUP BY TRUNC(TRUNC(DATE_COL, 'Q') - 1, 'month');
我觉得你这里有几个问题。
1) 要将 12 月的日期推送到原生 Q1 包中,请使用 add_months(:date,1)。这会将所有内容按您的偏移量移动到 Oracle 的 Q1、2、3、4 中以便于聚合。
2) 标签。如果您需要查询来进行动态标记,那么 APC 和 Lalit 可以帮助您找到正确的开始日期。从那里,last_day(add_months(Quarter_start_date,3)) 会给你另一个端点!
3) 好的,那么您是在寻找每季度一行的 return 吗?还是每年一行,四个季度为列?如果每季度一行,您是否需要确保 return 一个季度没有数据的一行?
但是要使用一个月的偏移量按季度进行简单汇总:
SELECT count(*)
, add_months(trunc(add_months(your_date_field,1),'Q'),-1) q_start_date
FROM YOUR_TABLE
GROUP BY add_months(trunc(add_months(your_date_field,1),'Q'),-1);