2013-09-16 5 views
-2

Мне нужно рассчитать количество дней между датами, как описано ниже, с использованием MSSQLКак рассчитать разницу в днях между датами

Каждый месяц следует рассматривать, как если бы в течение 30 дней (даже если он не делает)

разница между 2-го января 2013 года по 2 марта 2013 будет

(30-2) + 30 + 2 days 
where (30-2) will be for January 
     30 will be for February 
     2 will be for March 
+1

Что вы пробовали до сих пор, почему это не работает? У вас есть алгоритм для вычисления дней данных? –

+0

используйте 'datepart', чтобы получить' 2', а затем сделайте что-то вроде [this SO post] (http://stackoverflow.com/questions/691022/how-to-determine-the-number-of-days-in- a-month-in-sql-server), чтобы получить дни в месяце –

ответ

1
create or replace function datediff(p_what in varchar2, 
             p_d1 in date, 
             p_d2 in date) return number 
    as 
     l_result number; 
    begin 
     select (p_d2-p_d1) * 
       decode(upper(p_what), 
         'DAY', 1, 'SS', 24*60*60, 'MI', 24*60, 'HH', 24, NULL) 
     into l_result from dual; 

     return l_result; 
    end; 
/

Это то, что я делаю в Oracle (Предоставлено: ASKTOM). Я получаю разницу между днями, часами, минутами или секундами.

В MS SQL, либо

PRINT DATEDIFF(DAY, '1/1/2011', '3/1/2011') 

Это дает число раз граница полночь скрещенных между двумя датами. Вы можете решить добавить один к этому, если вы включаете обе даты в счетчик - или вычитаете один, если вы не хотите включать ни одну дату.

ИЛИ

DECLARE @startdate datetime2 = '2007-05-05 12:10:09.3312722'; 
DECLARE @enddate datetime2 = '2009-05-04 12:10:09.3312722'; 
SELECT DATEDIFF(day, @startdate, @enddate); 

С помощью этого вы можете манипулировать.

1

Похоже, вы хотите получить результат, похожий на MONTHS_BETWEEN Oracle на SQL Server.

Это функция SQL я написал в Teradata, вы, вероятно, просто нужно изменить ЭКСТРАКТ в год/месяц/день (дата)

REPLACE FUNCTION MONTHS_BETWEEN(date1 DATE, date2 DATE) 
RETURNS FLOAT 
SPECIFIC months_between_DT 
RETURNS NULL ON NULL INPUT 
CONTAINS SQL 
DETERMINISTIC 
COLLATION INVOKER 
INLINE TYPE 1 
RETURN 
    (EXTRACT(YEAR FROM date1) * 12 + EXTRACT(MONTH FROM date1)) 
- (EXTRACT(YEAR FROM date2) * 12 + EXTRACT(MONTH FROM date2)) 
+ CASE 
    WHEN EXTRACT(MONTH FROM date2) <> EXTRACT(MONTH FROM date2+1) AND 
      EXTRACT(MONTH FROM date1) <> EXTRACT(MONTH FROM date1+1) 
    THEN 0 
    ELSE (CAST(1 AS FLOAT))/31 * (EXTRACT(DAY FROM date1) - EXTRACT(DAY FROM date2)) 
    END 
; 

Тогда вы просто умножить результат * 30 и бросил его в INT.

Смежные вопросы