繁体   English   中英

选择仅在日和月之间的日期,不包括年份

[英]Select Date Between Just Day and Month Excluding Year

以下是我想做的伪代码:

如果Date在下一年的04-0103-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/201403/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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM