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

时间:2015-01-06 19:39:56

标签: sql sql-server date between

以下是我想要做的伪代码:

DateBetween 04-0103-31时,则输出为Q1

我知道今年如何做到这一点,但不排除年份。

3 个答案:

答案 0 :(得分:3)

我不知道输出“Q1”是什么意思。但是,如果你想要你的年份从4月1日开始(这似乎是对你所做的事情的合理解释),最简单的方法是减去几天。你会处理大多数年份,你可以这样做:

select year(dateadd(day, - (31 + 28 + 31), date) as theyear

当然,由于闰年,这只能用于四年中的三年。解决这个问题的一种方法是使用明确的逻辑 - 但这会变得混乱。另一种方法是添加剩余月份并减去一年:

select year(dateadd(day, (30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31), date) - 1 as theyear

答案 1 :(得分:3)

目前还不清楚你到底要做什么。 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

答案 2 :(得分:1)

我认为您想要的是以下内容:

SELECT year(dateadd(q, -1, mydate)) AS yearEndingQ1
  FROM mytable

对于201404/01/2014之间的所有日期,这将为03/31/2015年。当然,您可能需要2015的结果,而不是您想要的结果:

SELECT year(dateadd(q, 3, mydate)) AS yearEndingQ1
  FROM mytable

希望这有帮助。

根据OP的评论更新&#34;我正在追踪截至第四季度的一年的数据。我们的财政年度在这里有点奇怪。所以基本上它将是截至第一季度的财政年度,结束于第二季度的财政年度等等。也许我可以在我的问题中提供更多的清晰度。&#34;

对于截至第一季度的财政年度,截至第二季度的财政年度以及截至第三季度的财政年度,这将产生三个单独列的结果。 (我假设你在截至第四季度的财政年度不需要任何东西!!)

SELECT year(dateadd(q, -1, mydate)) AS yearEndingQ1
     , year(dateadd(q, -2, mydate)) AS yearEndingQ2
     , year(dateadd(q, -3, mydate)) AS yearEndingQ3
  FROM mytable