![](/img/trans.png)
[英]Select where date between given month and day of any year in BigQuery
[英]Select Date Between Just Day and Month Excluding Year
以下是我想做的伪代码:
如果Date
在下一年的04-01
和03-31
Between
,则输出为Q1
。
我知道今年如何做到这一点,但不排除年份。
我不知道输出“ Q1”是什么意思。 但是,如果您希望自己的岁月从4月1日开始(这似乎对您的肤色有合理的解释),最简单的方法是减去几天。 你会处理大多数年份,你可以这样做:
select year(dateadd(day, - (31 + 28 + 31), date) as theyear
当然,由于leap年,这只能工作四年中的三年。 解决此问题的一种方法是使用显式逻辑-但这很混乱。 另一种方法是加上剩余的月份并减去一年:
select year(dateadd(day, (30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31), date) - 1 as theyear
目前尚不清楚您要做什么。 Q1
通常表示四分之一,三个月。 从下一年的4月1日到3月31日的四分之一不是四分之一:)
但是,假设您要尝试从特定日期开始的特定时间范围内选择内容,则可以尝试使用一些日期/时间算法。 首先,几点说明:
datetime
值的标称精度为1毫秒(实际精度约为3毫秒)。 这意味着,像'31 March 2014 23:59:59.999'
四舍五入至'1 April 2014 00:00:00.000'
给定日期的最大时间值是“23:59:59.997”。 如果您不了解,这可能会对您的查询产生不利影响。 不要问我怎么知道这个。
没有时间组件的datetime
时间文字,例如'1 April 2013'
,被解释为开始日( '1 April 2014 00:00:00.000'
)。
所以,像这样:
declare
@dtFrom datetime ,
@dtThru datetime
set @dtFrom = '1 April 2013'
set @dtThru = dateAdd(year,1,dtFrom)
select *
from foo t
where t.someDateTimeValue >= @dtFrom
and t.someDateTimevalue < @dtThru
应该可以做你。
您可能需要调整@dtThru
的设置以满足您的要求:如果您实际上正在寻找一个季度的结束,那么您需要将其更改为类似
set @dtThru = dateAdd(month,3,dtFrom)
如果您有一个会计年度从4月1日到3月31日,并且想要弄清楚,例如,您的数据所代表的会计年度和季度,您可能会执行以下操作:
select FiscalYear = datepart(year,t.someDateTimeValue)
- case datepart(month,t.someDateTimeValue) / 4
when 0 then 1 -- jan/feb/mar is quarter 4 of the prev FY
else 0 -- everything else is this FY
end ,
FiscalQuarter = case datepart(month,t.someDateTimevalue) / 4
when 0 then 4 -- jan/feb/mar is Q4 of the prev FY
when 1 then 1 -- apr/may/jun is Q1 of the curr FY
when 2 then 2 -- jul/aug/sep is Q2 of the curr FY
when 3 then 3 -- oct/nov/dec is Q3 of the curr FY
end ,
*
from foo t
我认为您想要的是以下内容:
SELECT year(dateadd(q, -1, mydate)) AS yearEndingQ1
FROM mytable
这将使年为2014
对之间的所有日期04/01/2014
和03/31/2015
。 当然,您可能希望获得2015
的结果,但在这种情况下,您需要:
SELECT year(dateadd(q, 3, mydate)) AS yearEndingQ1
FROM mytable
希望这可以帮助。
根据OP的评论更新: “我正在跟踪截至季度x的一年的数据。在这里,我们的会计年度有点怪异。所以基本上,它应该是第一季度结束的财政年度,第二季度结束的财政年度,等等。也许我可以提供更多信息在我的问题清晰。“
对于截至第一季度的财政年度,截至第二季度的财政年度以及截至第三季度的财政年度,这将产生三个单独列的结果。 (我假设在截至第四季度的财政年度你不需要任何东西!!)
SELECT year(dateadd(q, -1, mydate)) AS yearEndingQ1
, year(dateadd(q, -2, mydate)) AS yearEndingQ2
, year(dateadd(q, -3, mydate)) AS yearEndingQ3
FROM mytable
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.