我需要编写一个函数或SP,它将返回第15次出现的第一次出现。例如,如果我将日期传递给5月8日,那么它应该返回5月15日。如果我在5月30日过去,那么它应该在6月15日返回。
答案 0 :(得分:5)
单程
DECLARE @d DATETIME
SELECT @d = '20110508'
--SELECT @d = '20110530'
SELECT CASE WHEN DAY(@d) > 15
THEN dateadd(mm, datediff(mm, 0, @d)+1, 0) + 14
ELSE dateadd(mm, datediff(mm, 0, @d)+0, 0)+ 14 end
答案 1 :(得分:3)
怎么样;
create function udf_getNextDate(@base datetime, @day int) returns datetime as begin
set @base = case when day(@base) > @day
then dateadd(month, 1, @base)
else @base
end
return dateadd(day, -day(@base) + @day, @base)
end
select
dbo.udf_getNextDate('08 may 2011', 15),
dbo.udf_getNextDate('30 may 2011', 15),
dbo.udf_getNextDate('16 dec 2011', 15),
dbo.udf_getNextDate('01 may 2011', 15)
2011-05-15 00:00:00.000
2011-06-15 00:00:00.000
2012-01-15 00:00:00.000
2011-05-15 00:00:00.000
答案 2 :(得分:1)
另一种方法:
Declare @d datetime
Set @d = getdate()
Select Case
When DateDiff(Day, Day(@d), 15) < 0 then
DateAdd(month, 1, DateAdd(Day, DateDiff(Day, Day(@d), 15), @d))
Else DateAdd(Day, DateDiff(Day, Day(@d), 15), @d)
End as [Next15th]
答案 3 :(得分:1)
此功能可以帮助您
create function Get15th(@date datetime)
returns datetime
as
begin
declare @resultdate datetime
declare @y int
declare @m int
declare @d int
set @y = datepart(year,@date)
set @m = datepart(month,@date)
set @d = datepart(day,@date)
if( @d<=15)
set @resultdate =cast((str(@y)+'-'+str(@m)+'-15') as datetime)
else
set @resultdate =cast((str(@y)+'-'+str(@m+1)+'-15') as datetime)
return @resultdate
end
答案 4 :(得分:0)
如果您在几个月而不是几天内接受约会,并将您的基数设为一个月的第15个月,那么再增加一个月......
DATEADD(MONTH, DATEDIFF(MONTH, 14, Created) + 1, 14)
修改强>
修改为使用DATEDIFF MONTH它是如何工作的,而不是我认为应该如何工作;)
DATEADD(MONTH, DATEDIFF(MONTH, 0, Created - 15) + 1, 14)
答案 5 :(得分:0)
我通常做这样的事情:
declare
@date datetime ,
@target_day int
set @date = 'June 16, 2009'
set @target_day = 15
select date = @date ,
next_date = case when day(@date) <= @target_day
then dateadd(day,15-day(@date),@date)
else dateadd(day,15,dateadd(month,1,dateadd(day,-day(@date),@date)))
end
处理这个月的最后一天是一个比较棘手的问题,因为月份的天数可变,而SQL Server的日期数学有时候只是一点点巴洛克式。
答案 6 :(得分:-1)
尝试
DATEADD(Day, DATEDIFF(Day, 15, Created), 0) AS CreatedDay
在此解释http://improve.dk/archive/2006/12/13/sql-server-datetime-rounding-made-easy.aspx
使用该链接可以获得您想要的内容
更新:弄错了......请参阅Dems回答