SQL Получить первое вхождение 15 числа на свидание - PullRequest
6 голосов
/ 13 мая 2011

Мне нужно написать функцию или SP, которые будут возвращать первое вхождение 15-го числа. Например, если я передам дату 8 мая, она должна вернуться 15 мая. Если я сдам 30 мая, то должен вернуться 15 июня.

Ответы [ 7 ]

5 голосов
/ 13 мая 2011

В одну сторону

   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
3 голосов
/ 13 мая 2011

Как насчет;

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
1 голос
/ 31 мая 2011

эта функция может вам помочь

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
1 голос
/ 13 мая 2011

Просто еще один способ сделать это:

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]
0 голосов
/ 13 мая 2011

Я обычно делаю что-то вроде этого:

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 иногда является крошечнойнемного барокко.

0 голосов
/ 13 мая 2011

Ответ Роба близок ...

если вы берете дату в месяцах, а не в днях и делаете свою базу 15-го числа месяца, то добавьте еще один месяц ...

DATEADD(MONTH, DATEDIFF(MONTH, 14, Created) + 1, 14)

РЕДАКТИРОВАТЬ

Изменено, чтобы использовать DATEDIFF MONTH как это работает, а не так, как я думал, что это должно работать;)

DATEADD(MONTH, DATEDIFF(MONTH, 0, Created - 15) + 1, 14)

0 голосов
/ 13 мая 2011

попробуй

DATEADD(Day, DATEDIFF(Day, 15, Created), 0) AS CreatedDay 

объяснено здесь http://improve.dk/archive/2006/12/13/sql-server-datetime-rounding-made-easy.aspx

используя эту ссылку, вы можете достичь желаемого

ОБНОВЛЕНИЕ: ошибся ... см. Ответ Демса

...