2014-01-08 3 views

ответ

1

Полно испытано

В C# если вы хотите настоящие месяцы и дни, вы должны сделать какой-то процесс:

DateTime dt1 = DateTime.Parse("2011-01-01"); 
DateTime dt2 = DateTime.Parse("2014-01-01"); 
// because of calculate from date1 at time 00:00 to date2 at time 00:00 we must add 1 day to date2 
dt2 = dt2.AddDays(1); 
int nMonths = 0; 
while (dt1.AddMonths(1) <= dt2) 
{ 
    dt1 = dt1.AddMonths(1); 
    nMonths++; 
} 
int nDays = dt2.Subtract(dt1).Days; 
return String.Format("{0}m{1}d", nMonths, nDays); 

В VB.net если вы хотите реальные месяцев и дней, вы должны сделать какой-либо процесс:

' http://www.developerfusion.com/tools/convert/csharp-to-vb/ 
' http://codeconverter.sharpdevelop.net/SnippetConverter.aspx 

Dim dt1 As DateTime = DateTime.Parse("2011-01-01") 
Dim dt2 As DateTime = DateTime.Parse("2014-01-01") 
' because of calculate from date1 at time 00:00 to date2 at time 00:00 we must add 1 day to date2 
dt2 = dt2.AddDays(1) 
Dim nMonths As Integer = 0 
While dt1.AddMonths(1) <= dt2 
    dt1 = dt1.AddMonths(1) 
    nMonths += 1 
End While 
Dim nDays As Integer = dt2.Subtract(dt1).Days 
Return String.Format("{0}m{1}d", nMonths, nDays) 

В MsSQL если вы хотите настоящие месяцы и дни, вы должны сделать какой-то процесс:

DECLARE @dt1 DATETIME 
DECLARE @dt2 DATETIME 
DECLARE @nDays INT 
DECLARE @nMonths INT 

SET @dt1 = '2011/01/01' 
SET @dt2 = '2014/01/01' 
-- because of calculate from date1 at time 00:00 to date2 at time 00:00 we must add 1 day to date2 
SET dt2 = DATEADD(mm, 1, @dt1) 
WHILE (DATEADD(mm, 1, @dt1) <= @dt2) 
BEGIN 
    SET @dt1 = DATEADD(mm, 1, @dt1) 
    SET @nMonths = ISNULL(@nMonths, 0) + 1 
END 
SET @nDays = DATEDIFF(dd, @dt1, @dt2) 

PRINT CAST(@nMonths AS VARCHAR) + 'm' + CAST(@nDays AS VARCHAR) + 'd' 
-- you can create a sql function to get two date and return datediff as same as '5m8d'. 

Я надеюсь быть полезным.

+0

Можете ли вы помочь мне в преобразовании кода в vb.net .. Спасибо – ZahidKakar

+0

Это очень просто: http://www.developerfusion.com/tools/convert/csharp-to-vb/ – Zolfaghari

+0

Я использовал ваш самый код выше из C# в Vb, как показано ниже: в то время как (StDate.AddMonths (1) <= EndDate) StDate = StDate.AddMonths (1) ArrearMonths + 1 = Конец Хотя ArrearDays = EndDate.Subtract (StDate) .Days lblAmountWords .Text = String.Format ("{0} Months, {1} Days", ArrearMonths, ArrearDays). Это дает мне эксклюзив последнего дня, который не является моим требованием, я хочу рассчитать как 17/05/2011 до 30/06/2011, он должен быть возвращен 01 Месяца 15 дней, а на 01/07/2005 по 30/06/2006 он должен вернуть 12 месяцев и 0 дней. Еще раз спасибо. – ZahidKakar

0

Это зависит от того, как вы хотите рассчитать дни в начале и начале. Вы хотите, чтобы дни в начале и в конце были частью числа дней или должны быть завернуты в число месяцев? Например, если я нахожусь в неделю в месяц в начале месяца, и через неделю я заканчиваю в конце месяца, у меня может быть 20 дней с начала месяца и 20 дней с конца месяца, так что бы вы хотели подсчитать из 14 месяцев и 40 дней, или вы предпочитаете 15 месяцев и 10 дней?

Если вы предпочли бы, чтобы второе решение просто подсчитывало количество дней между датой начала и окончания, разделите их на среднее число дней в месяце и объявите остаток в качестве дневного счета.

Код ниже - воздушный код (не проверен). Это немного грязно, но это делает работу.

int Days = DateDiff(day, StartDate, EndDate) 
int Months = Math.Floor(Days/(365.25/12)) 
Days = Days - (Months * (365.25/12)) 

Если вы предпочитаете первый метод, вы просто извлечь количество дней из подсчета, то подсчитать количество месяцев, оставшихся и добавить количество дней вы первоначально извлеченные на счет после этого.

Как я уже сказал, это зависит от того, что вы хотите.

+0

Craig, DateDiff вычисляет День, исключая День начала и окончания.Я использовал его для StartDate = 01/07/2005 и EndDate = 30/06/2006, но результат - 11 месяцев 364 дня, что не является моим требованием. Мои требования в приведенном выше случае: «12 месяцев 0 дней». Я работаю над системой учета, поэтому имеет значение только один день. Пожалуйста, помогите мне, если позволите. – ZahidKakar

+1

Это правильно. Если вы только вводите даты, система установит время в полночь (00:00), поэтому вы будете закрывать только с 01/07/2005 00:00 до 30/06/2006 00:00. Если вы хотите вводить только даты, но хотите, чтобы система подсчитала, кто из последних дней вам нужно добавить один день (чтобы вы смотрели 01/07/2006) или добавили один день и удалили одну секунду. Вот как вы это сделаете: 'int Days = DateDiff (день, StartDate, DateAdd (минута, DateAdd (день, EndDate, 1), -1))' [Aircode]. –

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