2013-09-30 3 views
1

Я пытаюсь получить конкретный день года.Получить конкретную дату года на сервере Sql

Вот что я пытался до сих пор: -

-- Declare few variables 
DECLARE @Currentdate AS DATETIME 
DECLARE @DueDate AS DATETIME 
DECLARE @NewDate AS DATETIME 

-- Set the variables properly, just for testing 
SET @Currentdate = GETDATE()     
SET @DueDate = DATEADD(MONTH, 2, DATEADD(YEAR, 1, @Currentdate)) 

-- Check the output 
SELECT @Currentdate  -- 2013-09-30 00:00:00.000 
SELECT @DueDate   -- 2014-11-30 00:00:00.000 

Итак, я хочу, чтобы получить @NewDate на основе @Currentdate года. Для этого я попробовал: -

SELECT @NewDate = DATEADD(DAY, DAY(DATEDIFF(day, 1, @DueDate)), DATEADD(MONTH, DATEDIFF(MONTH, 0, @Currentdate), 0)) 
SELECT @NewDate -- 2013-09-30 00:00:00.000 

Но это не сработало. :(

Мой ожидаемый результат, как:

-- 2013-11-30 00:00:00.000 
-- Having the due date month and date same, but the year as current date one. 

Любая помощь приветствуется

UPDATE

Извините за всю путаницу я создал свой вопрос в простых словах. : -

Я хочу получить новую переменную даты, имеющую дату и месяц, такую ​​же, как @DueDate, но год, указанный в переменной @Currentdate.

Я надеюсь, что это немного прояснит ситуацию.

+1

Я запутался. Что такое * конкретный * день? – Kermit

+0

К конкретному дню я имею в виду день и месяц переменной @ @ DueDate. –

+0

Вы посмотрели функцию datepart? –

ответ

3

Если вопрос «дано У меня есть особое значения даты и времени в одной переменной, можно установить еще одну переменную, чтобы быть в тот же день и месяц, но в текущем году» то ответ будет:

declare @DueDate datetime 
declare @NewDate datetime 

set @DueDate = '20141130' 
--Need to set @NewDate to the same month and day in the current year 

set @NewDate = DATEADD(year, 
     --Here's how you work out the offset 
     DATEPART(year,CURRENT_TIMESTAMP) - DATEPART(year,@DueDate), 
    @DueDate) 

select @DueDate,@NewDate 

Я хочу, чтобы получить новую переменную дату, имеющую дату и месяц же как переменная @DueDate, но у уха, как указано в переменной @Currentdate.

Ну, это просто выше запрос с одним подстройке:

set @NewDate = DATEADD(year, 
     --Here's how you work out the offset 
     DATEPART(year,@Currentdate) - DATEPART(year,@DueDate), 
    @DueDate) 
0

Попробуйте это вместо этого?

DECLARE @Currentdate AS DATETIME 
DECLARE @DueDate AS DATETIME 

-- Set the variables properly, just for testing 
SET @Currentdate = GETDATE()     
SET @DueDate = DATEADD(MONTH, 2, DATEADD(YEAR, 1, 
      DateAdd(day, datediff(day, 0, @currentDate), 0))) 

-- Check the output 
SELECT @Currentdate  -- 2013-09-30 18:32:35.310 
SELECT @DueDate 

Использование DateAdd(day, datediff(day, 0, @DateTime), 0) полосы от временной части. Вы также должны проверить это SO Question/answer.

+0

Спасибо за ваше время и ответ, но проблема здесь не в той части времени, которую мне нужна, например, «2013-11-30», а не «2013-09-30»! Я обновил вопрос, чтобы устранить некоторую путаницу. –

+0

Вы явно добавляете два месяца к значению месяца текущей даты, делая 'DateAdd (месяц, 2 ...'Если вы не хотите этого делать, просто вытащите его, и код в моем ответе будет создан 30 ноября, а не 30 сентября. –

+0

т. Е. Единственная разница между тем, что вы публикуете как «ожидаемый ответ» и «фактический ответ», является временной частью. –

0

Попробуйте это:

CAST(CAST( -- cast INT to VARCHAR and then to DATE 
    YEAR(GETDATE()) * 10000 + MONTH(@DueDate) * 100 + DAY(@DueDate) -- convert current year + @DueDate's month and year parts to YYYYMMDD integer representation 
    + CASE -- change 29th of February to 28th if current year is a non-leap year 
     WHEN MONTH(@DueDate) = 2 AND DAY(@DueDate) = 29 AND ((YEAR(GETDATE()) % 4 = 0 AND YEAR(GETDATE()) % 100 <> 0) OR YEAR(GETDATE()) % 400 = 0) THEN 0 
     ELSE -1 
    END 
AS VARCHAR(8)) AS DATE) 
Смежные вопросы