在理解如何使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
答案 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)));