SQL Date Logic子句

时间:2015-02-13 17:33:31

标签: sql sql-server tsql

在理解如何使Where子句与此日期结构一起使用时遇到问题。

这是主要逻辑。我想要的数据仅从之前的3月1日开始到昨天的日期结束。

示例#1: 所以今天是2015年2月13日这意味着我需要数据( 2014-03-01 2015-02-12

示例#2: 今天说是2015年3月20日这意味着我需要( 2015-03-01 2015-03-19 )之间的数据

逻辑可能起作用的地方,但它并不想转换' 3/1 /' +年。但我不确定如何表达它。第一个条款很好,其案例部分已被破坏。

查询

    SELECT [Request Date], [myItem]
    FROM myTable
    WHERE [Request Date] < CONVERT(VARCHAR(10), GETDATE(), 102)
        AND [Request Date] = CASE WHEN 
            CONVERT(VARCHAR(10), GETDATE(), 102) <
            CONVERT(VARCHAR(12), '3/1/' + DATEPART ( year , GETDATE()) , 114)
        THEN [Request Date] > CONVERT(VARCHAR(12), '3/1/' + DATEPART ( year , GETDATE()-365) , 114)
        ELSE [Request Date] > CONVERT(VARCHAR(12), '3/1/' + DATEPART ( year , GETDATE() , 114)
        END

我也试过

AND [Request Date] = CASE WHEN 
            CONVERT(VARCHAR(10), GETDATE(), 102) <
            '3/1/' + CONVERT(VARCHAR(12), DATEPART ( YYYY , GETDATE()))
        THEN [Request Date] > '3/1/' + CONVERT(VARCHAR(12), DATEPART ( YYYY , GETDATE()-364))
        ELSE [Request Date] > '3/1/' + CONVERT(VARCHAR(12), DATEPART ( YYYY , GETDATE()))
        END

7 个答案:

答案 0 :(得分:1)

我更喜欢为@from - @to范围创建日期时间变量,但如果这是针对视图的,我猜你必须在where子句中进行。

SELECT [Request Date], [myItem]
    FROM myTable
    WHERE [Request Date] < cast(GETDATE() as date)
        AND [Request Date] >= CASE WHEN 
            GETDATE() < CONVERT(datetime, '3/1/' + cast(Year(GETDATE()) as varchar(4)))
        THEN CONVERT(datetime, '3/1/' + cast(Year(GETDATE()) - 1 as varchar(4)))
        ELSE CONVERT(datetime, '3/1/' + cast(Year(GETDATE()) as varchar(4)))
        END

答案 1 :(得分:1)

试试这个where条款。

WHERE [Request Date] 
         BETWEEN Cast(CONVERT(VARCHAR(4), Year(Getdate())-1)+ '-03-01' AS DATE)
                    AND Getdate() - 1 

此处Cast(CONVERT(VARCHAR(4), Year(Getdate())-1)+ '-03-01' AS DATE)将在3月的第一天获取。用这个加1年就可以得到起点。

Getdate() - 1将定义结束点

答案 2 :(得分:1)

这样的东西?总是从3月1日开始,如果它现在是3月1日或更早,以及今年的其他情况。

SELECT [Request Date], [myItem]
FROM myTable
WHERE [Request Date] >= dateadd(month, 2, DATEADD(year, DATEDIFF(year, 0, dateadd(month, -2, dateadd(day, -1, getdate()))), 0))
and [Request Date] < DATEADD(day, DATEDIFF(day, 0, getdate()), 0)

首先它扣除一天,因此3月1日不是同一年,然后它扣除2个月获得上一年的那些日期,然后它将它舍入到年份,然后它增加2个月到了3月1日。

答案 3 :(得分:0)

在Oracle中,我会像这样计算下限:

add_months( trunc( add_months( sysdate, -2 ), 'YEAR'), 2 )

换句话说 - 减去两个月,向下舍入到年初,然后再增加两个月。

希望您可以将其转换为使用适当的TSQL函数。

答案 4 :(得分:0)

让我们使用一些测试数据:

DECLARE @MyDate DATETIME = '3/13/2015'

要声明我们将设置的变量:

DECLARE @StartDate DATETIME
DECLARE @EndDate DATETIME

在此代码中,我检查我们是否在3月1日之前或之后,如果是,我们将使用前一年或今年作为起点(会计年度?)

SELECT @StartDate = CASE WHEN DATEPART(MONTH, @MyDate) < 3 THEN
    DATEADD(MONTH, 2, DATEADD(YEAR, DATEDIFF(YEAR, 0, @MyDate) - 1, 0))
    ELSE
    DATEADD(MONTH, 2, DATEADD(YEAR, DATEDIFF(YEAR, 0, @MyDate), 0))
    END,
    @EndDate = DATEADD(DAY, DATEDIFF(DAY, 0, @MyDate), 0)

这是输出:
    SELECT @StartDate AS Start,@ EndDate AS EndDate

Start                   EndDate
2015-03-01 00:00:00.000 2015-03-13 00:00:00.000

答案 5 :(得分:0)

我首先会创建一个相当通用的用户定义函数来完成我需要的功能,因此:

create function dbo.start_of_fiscal_year
(
  @today date ,
  @fiscal_year_start_month int
)
returns date
as
begin
  set @today = case coalesce(@today,'')
                 when '' then current_timestamp
                 else         @today
               end
  declare @month_start             date = dateadd(day,1-datepart(day,@today),@today)
  declare @fiscal_month_number     int  = case sign( datepart(month,@month_start) - @fiscal_year_start_month )
                                            when -1 then 13
                                            else          1
                                          end
                                        + ( datepart(month,@month_start) - @fiscal_year_start_month )
  declare @fiscal_year_start       date = dateadd(month,1-@fiscal_month_number,@month_start)

  return @fiscal_year_start
end
go

一旦你有了,你可以说

之类的东西
declare @today    date = current_timetamp
declare @fy_start date = start_of_fiscal_year(@today,3)

select *
from dbo.foo t
where t.report_date >= @fy_start
  and t.report_date <  @today

甚至

select fiscal_year = datepart(year,start_of_fiscal_year(t.report_date,3)) , count(*)
from dbo.foo t
group by datepart(year,start_of_fiscal_year(t.report_date,3))

答案 6 :(得分:0)

你的下限应该是这个。您只需要在月份小于3(3月)时抵消年份。

dateadd(
    yy,
    year(current_timestamp) - 1900 + case when month(current_timestamp) < 3 then -1 else 0 end,
    '19000301'
)

没有理由搞乱字符串,这非常简洁地整合了逻辑。我也猜测当前日期是3月1日你要查询前一年的全部内容。因此,您需要稍微调整一下测试。

case when (month(dateadd(dd, -1, current_timestamp)) < 3 ...

只是为了好玩:

dateadd(mm, (12-month(current_timestamp-1))/10*-12+2, cast(year(current_timestamp) as char(4)));