powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Точная разница между датами
20 сообщений из 20, страница 1 из 1
Точная разница между датами
    #32322511
-Чайник-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите пожалуйста, никак не могу сообразить :(
Нужно знать точную разницу между сегодня и датой рождения человека, например: 20 лет 2 месяца и 4 дня
...
Рейтинг: 0 / 0
Точная разница между датами
    #32322512
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DateDiff
...
Рейтинг: 0 / 0
Точная разница между датами
    #32322518
-Чайник-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну он дает разницу в годах точную, и разницу в месяцах за весь период... а как же узнать чколько месяцев от нецелого года и дней от нецелого месяца?
...
Рейтинг: 0 / 0
Точная разница между датами
    #32322598
-Чайник-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну не ужели никто не поможет? :((((
...
Рейтинг: 0 / 0
Точная разница между датами
    #32322640
Фотография Daf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну он дает разницу в годах точную, и разницу в месяцах за весь период...
Лох Позорный помоему все правильно написал. DateDiff дает все, что тебе нужно. Надо только выбрать interval тот, который нужен тебе...
...
Рейтинг: 0 / 0
Точная разница между датами
    #32322641
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть Дата1 и Дата2. Условие: Дата1<=Дата2.

dim y as integer, m as byte, d as byte

y=datediff("y",Дата1,Дата2)
m=cbyte(datediff("m",Дата1,Дата2)-y*12)
d=cbyte(format(Дата2,"dd"))-cbyte(format(Дата1,"dd"))
if d<0 then d=d+cbyte(format(dateserial(year(Дата2),Month(Дата2)-1,1)-1,"dd"))
...
Рейтинг: 0 / 0
Точная разница между датами
    #32322643
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
только надо d as integer
...
Рейтинг: 0 / 0
Точная разница между датами
    #32322666
-Чайник-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть Дата1 и Дата2. Условие: Дата1<=Дата2.

dim y as integer, m as byte, d as byte

y=datediff("y",Дата1,Дата2)
m=cbyte(datediff("m",Дата1,Дата2)-y*12)
d=cbyte(format(Дата2,"dd"))-cbyte(format(Дата1,"dd"))
if d<0 then d=d+cbyte(format(dateserial(year(Дата2),Month(Дата2)-1,1)-1,"dd"))


только вот если месяц у Даты1> месяца у Даты2, то год все рано целым считается...

declare @date datetime, @y as int
set @date = convert(datetime,'13.12.2000',104)
set @y=datediff(yy, @date, getdate())
print @y

------
3

а на самом деле-то 2 года прошло...
...
Рейтинг: 0 / 0
Точная разница между датами
    #32322769
Фотография Shark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Function fn1()
Dim lMonth, ldate1, ldate2, lday
ldate1 = #1/2/1966#
ldate2 = #1/1/2003#
lMonth = DateDiff("m", ldate1, ldate2)
If Day(ldate1) > Day(ldate2) Then lMonth = lMonth - 1
ldate1 = DateAdd("m", lMonth, ldate1)
lday = DateDiff("d", ldate1, ldate2)

Dim lYear
lYear = lMonth \ 12
lMonth = lMonth Mod 12
Debug.Print lYear, lMonth, lday
End Function
...
Рейтинг: 0 / 0
Точная разница между датами
    #32323039
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Виноват, я забыл, что datediff работает так. Тогда вот еще вариант. (Тоже не пробовал :)

dim y as integer, m as integer, d as integer

y=year(Дата2)-year(Дата1)
m=month(Дата2)-month(Дата1)
if m<0 then m=m+12: y=y-1
d=day(Дата2,"dd")-day(Дата1)
if d<0 then d=d+day(dateserial(year(Дата2),Month(Дата2)-1,1)-1): m=m-1
...
Рейтинг: 0 / 0
Точная разница между датами
    #32323129
TRoUbLEs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Function nYear(datefirst As Date, datesecond As Date)

If Day(datesecond) - Day(datefirst) +  1  <  0  Then
    If Month(datesecond) - Month(datefirst) -  1  <  0  Then
        nYear = Year(datesecond) - Year(datefirst) -  1 
    Else
        nYear = Year(datesecond) - Year(datefirst)
    End If
Else
    If Month(datesecond) - Month(datefirst) <  0  Then
        nYear = Year(datesecond) - Year(datefirst) -  1 
    Else
        nYear = Year(datesecond) - Year(datefirst)
    End If
End If

End Function


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
If Day(datesecond) - Day(datefirst) +  1  <  0  Then
    If Month(datesecond) - Month(datefirst) -  1  <  0  Then
        nMonth = Month(datesecond) - Month(datefirst) -  1  +  12 
    Else
        nMonth = Month(datesecond) - Month(datefirst) -  1 
    End If
Else
    If Month(datesecond) - Month(datefirst) <  0  Then
        nMonth = Month(datesecond) - Month(datefirst) +  12 
    Else
        nMonth = Month(datesecond) - Month(datefirst)
    End If
End If

End Function


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
Function nDay(datefirst As Date, datesecond As Date)

If Day(datesecond) - Day(datefirst) +  1  <  0  Then
    Select Case Month(datesecond)
        Case  2 
            n =  31 
        Case  3 
            If Year(datesecond) /  4  = Int(Year(datesecond) /  4 ) Then
                n =  29 
            Else
                n =  28 
            End If
        Case  4 
         n =  31 
        Case  5 
         n =  30 
        Case  6 
         n =  31 
        Case  7 
         n =  30 
        Case  8 
         n =  31 
        Case  9 
         n =  31 
        Case  10 
         n =  30 
        Case  11 
         n =  31 
        Case  12 
         n =  30 
        Case  1 
         n =  31 
    End Select
    nDay = Day(datesecond) - Day(datefirst) +  1  + n
Else
    nDay = Day(datesecond) - Day(datefirst) +  1 
End If

End Function

P.S. Возможно, функции можно и упостить, но я так ygbcfk и не стал дальше выламываться.
P.P.S. Финкции работают только все вместе если применять, т.е. в результате будет 2 года 11 месяцев 23 дня. Если применять по отдельности, то будет только 23 дня или только 11 месяцев. Чтобы узнать полное число месяцев, надо будет кол-во лет умножить на 12 и пибавить 11 или юзать DateDiff.
...
Рейтинг: 0 / 0
Точная разница между датами
    #32323140
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Млин.
Вот это

Function aaa(Дата1 As Date, Дата2 As Date)
Dim y As Integer, m As Integer, d As Integer

y = Year(Дата2) - Year(Дата1)
m = Month(Дата2) - Month(Дата1)
If m < 0 Then m = m + 12: y = y - 1
d = Day(Дата2) - Day(Дата1)
If d < 0 Then
d = d + Day(DateSerial(Year(Дата2), Month(Дата2) - 1, 1) - 1)
m = m - 1
If m = -1 Then m = 11: y = y - 1
endif
Debug.Print d & "-" & m & "-" & y
End Function

попробовал - работает.
...
Рейтинг: 0 / 0
Точная разница между датами
    #32323143
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
TRoUbLEs писал: Case 3
If Year(datesecond) / 4 = Int(Year(datesecond) / 4) Then
n = 29
Else
n = 28
End If
Это неверно. Год является високосным, если:
(Y mod 4 = 0 and Y mod 100 > 0) or Y mod 400 = 0

TRoUbLEs писал: Case 2
n = 31
Case 4
n = 31
Case 5
n = 30
Case 6
n = 31
Case 7
n = 30
Case 8
n = 31
Case 9
n = 31
Case 10
n = 30
Case 11
n = 31
Case 12
n = 30
Case 1
n = 31
А это гораздо короче так:
Case 5, 7, 9, 10, 12
n = 30
Case Else
n = 31
...
Рейтинг: 0 / 0
Точная разница между датами
    #32323175
Фотография Shark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По моему, мой вариант еще немножко короче:-)
...
Рейтинг: 0 / 0
Точная разница между датами
    #32323215
TRoUbLEs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Млин, Саныч, я же не говорил, что занимаюсь оптимизацией. Надо было срочняком это сделать и что первое полезло в голову, так и сделал. :))
А что касается високосного года, то проверь, все так и есть, как я написал, хотя твой вариант тоже можно использовать.
...
Рейтинг: 0 / 0
Точная разница между датами
    #32323226
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
2 TRoUbLEs:

А чего проверять. 2100, 2200 и 2300 по твоему алгоритму получаются високосные, а они на самом деле нет.
...
Рейтинг: 0 / 0
Точная разница между датами
    #32323242
TRoUbLEs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Саныч, Саныч, Саныч, стоп!!! Ты где???? Как это не високосные???? Високосный у нас каждый 4-й год, так???? Если так, то 2100 делится на 4 без остатка!! Или я чего-то не знаю про високосные годы??????
...
Рейтинг: 0 / 0
Точная разница между датами
    #32323272
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Именно. Не знаешь.

Система, по которой из каждых 400 лет только 97 високосных, называется григорианский календарь. Система, по которой 100, - юлианский. Юлианский календарь неточен, по нему средняя длина года отличается от астрономической. Поэтому в начале 20 века весь мир перешел на григорианскую систему. В частности, тот факт, что 7 ноября по "старому стилю" было 25 октября, - это следствие этого перехода.
...
Рейтинг: 0 / 0
Точная разница между датами
    #32323329
TRoUbLEs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
То что есть разделение на юлианский и григорианский - это мне известно. То, что астрономически в сутках на 5 часов с чем-то там минут больше - я тоже знаю (из-за этого и есть високосный год), но вот про 97 високосных годов, сышал впервые. Спасибо за информацию!!!!
...
Рейтинг: 0 / 0
Точная разница между датами
    #32325159
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Формулы для определения високосности года и числа дней в месяце:\r
\r
/topic/57492
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Точная разница между датами
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]