2016-07-12 2 views
1

Я просто хочу, чтобы вычислить количество дней, оставшихся от указанной датыНайти нет оставшихся дней в текущем месяце с указанной даты

Ex:

если дата '02/01/2016' , то оставшиеся дни на данном месяце '28'

если 03/05/2016 затем '25' дней ...

Я попытался ниже

SELECT DATEPART(DD,'03/05/2016') it given me only 5 days 
+0

вы используете как Oracle и SQL Server? – Squirrel

+1

Только голова, 'DATEPART()' возвращает часть даты, указанной в ARG1. Таким образом, 'DATEPART (DD, '3/5/2016')' вернет часть дня этой даты, которая равна 5. Это не 5 дней, это 5-й день марша. 'DATEDIFF()' - это то, что вы хотите использовать, и есть несколько отличных ответов ниже о том, как это сделать. Ура! – scsimon

+0

Я удалил тег Oracle, потому что синтаксис явно является SQL Server. –

ответ

3

SQLServer специфичным, поскольку вы упомянули версию, а также:

select DATEDIFF(day,getdate(),DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+1,0))) 

вам просто нужно найти последнюю дату данного месяца и расчета DATEDIFF легко, Под выражением делает то же

DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+1,0)) 

On 2012, это намного проще:

select datediff(day,getdate(),EOMONTH(GETDATE())) 
+0

есть синтаксическая ошибка в запросе, который вы отправили – Squirrel

+1

@Squirrel: спасибо, у меня нет SQL-сервера при отправке на тестирование, я протестировал его сейчас – TheGameiswar

0

Поскольку вы также помечены Oracle:

SELECT LAST_DAY(DATE '2016-02-01') - DATE '2016-02-01' 
     AS days_remaining 
FROM DUAL; 

Выход:

DAYS_REMAINING 
-------------- 
      28 
0

проверка ниже,

DECLARE @date DATETIME = '02/05/2016' 
SELECT CASE WHEN month(@date) IN (1,3,5,7,8,10,12) THEN 31 - DATEPART(DD,@date) 
      WHEN month(@date) IN (4,6,9,11) THEN 30 - DATEPART(DD,@date) 
      ELSE 28 - DATEPART(DD,@date) 
      END 

Примечание: в приведенном выше коде високосного года не учитывается

отредактировал: leap year proof version

DECLARE @date DATETIME = '02/05/2016' 
DECLARE @leap_year bit = 0 

IF ((YEAR(@date) % 4 = 0 AND YEAR(@date) % 100 <> 0) OR YEAR(@date) % 400 = 0) 
    SET @leap_year = 1 

SELECT CASE WHEN MONTH(@date) IN (1,3,5,7,8,10,12) THEN 31 - DATEPART(DD,@date) 
     WHEN MONTH(@date) IN (4,6,9,11) THEN 30 - DATEPART(DD,@date) 
     WHEN MONTH(@date) = 2 AND @leap_year = 1 then 29 - DATEPART(DD,@date) 
     ELSE 28 - DATEPART(DD,@date) 
     END 
+1

'високосный год 'доказательство? Почему бы не заставить его справиться с високосным годом? – Squirrel

+0

@Squirrel, вы правы, сделаете, когда у вас будет свободная минута. – PawelCz

-1
select DATEDIFF(DD, GETDATE(),GETDATE()) 
select DATEDIFF(DD,'2015/10/05','2015/10/07') 
+0

Как это работает? – Squirrel

+0

вы можете попробовать в sql sever –

+0

Но как это дает 'no дней, оставшихся в текущем месяце с данной даты'? – Squirrel

1

для SQL Server

select DATEDIFF(DAY, 
       GETDATE(), 
       DATEADD(MONTH, 
         DATEDIFF(MONTH, 0, GETDATE()) + 1, 
         0) 
       ) - 1 
0

Это следует сделать трюк. Надеюсь, поможет. Мои предположения в том, что вы используете SQL Server 2008. Хитрость здесь, чтобы получить первый день следующего месяца, который всегда будет 01-NextMonth-Year

DATEADD (мм, 1, @date)

и вычитать 1 день от него чтобы получить последний день текущего месяца

DATEADD (дд, - 1, CONVERT (VARCHAR (8), DATEADD (мм, 1, @date), 121) + '01')

Теперь DateDiff между ввода даты и последний день месяца ввода даст вам оставшиеся дни в месяце

DATEDIFF (дд, @date, @LastDateofMonth)

DECLARE @Date DATE = GETDATE() 
DECLARE @LastDateofMonth DATE 

SELECT @LastDateofMonth = DATEADD(dd, - 1, CONVERT(VARCHAR(8), DATEADD(mm, 1, @Date), 121) + '01') 

SELECT DATEDIFF(dd, @Date, @LastDateofMonth) 
0
DECLARE @MyDATE as datetime; 


SELECT @MYDATE = '19960423'; 

--wind back to first of month 
--add on one month 
--now calculate days from original date, this is always '1 to high' so subtract 1 

SELECT 
    DATEDIFF(day, @mydate, DATEADD(month, 1,D ATEADD(day, 1 - DAY(@MYDATE), @MYDATE))) - 1; 
0

вы можете использовать этот метод, чтобы рассчитать разницу с сегодняшнего дня

SELECT DATEDIFF(day,getdate() ,EOMONTH(GETDATE())) 

или это вычислить дату от PARAM

SELECT DATEDIFF(day,@date ,EOMONTH(GETDATE())) 
0

С SQL 2012 в новой функции EOMONTH() вы можете попробовать:

DECLARE @Date date = '2017-08-08' 
select datediff (dd, @Date, EOMONTH(@Date)) as DaysRemaining 
Смежные вопросы