Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Вычисление даты!  [new]
Ramis
Member

Откуда:
Сообщений: 94
Здравствуйте!
Не кто не знает как в SQL 2005 сделать такую вещь:
Есть две даты d1=22.11.2007 и d2=24.12.2008 (даты могут быть любые), вычитая из d2 дату d1 надо получить примерно такой вид:
прошел 1 год 1 месяц 3 дня!???
Но при этом надо чтоб учитывался високосный год!
1 сен 09, 16:34    [7604410]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление даты!  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
datediff
1 сен 09, 16:38    [7604438]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление даты!  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21520
Навскидку

Конвертировать во float, вычесть одно из другого, результат конвертировать обратно в дату
1 сен 09, 16:38    [7604442]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление даты!  [new]
проходящий.
Guest
Ramis,
Вы очередной... который не сможет ответить - в каких месяцах считать? В февралях? Апрелях? Что за единица измерения - месяц? Она имеет какую-то жесткую размерность?
1 сен 09, 16:39    [7604450]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление даты!  [new]
Slider_spb
Member

Откуда:
Сообщений: 800
См. функцию DATEPART
1 сен 09, 16:39    [7604452]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление даты!  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21520
Стоп.
Ерунда в вашем начальном условии.

Ramis
прошел 1 год 1 месяц 3 дня!???


Допустим, прошло 40 дней.
Это 1 месяц и сколько дней?
1 сен 09, 16:41    [7604463]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление даты!  [new]
Ramis
Member

Откуда:
Сообщений: 94
Shocker.Pro
Стоп.
Ерунда в вашем начальном условии.

Ramis
прошел 1 год 1 месяц 3 дня!???


Допустим, прошло 40 дней.
Это 1 месяц и сколько дней?



Вот именно в этом и проблема! Надо знать високосный год был или нет и еще надо учитывать сколько дней в месяце!!!!
1 сен 09, 16:46    [7604511]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление даты!  [new]
проходящий.
Guest
Ramis
Shocker.Pro
Стоп.
Ерунда в вашем начальном условии.

Ramis
прошел 1 год 1 месяц 3 дня!???


Допустим, прошло 40 дней.
Это 1 месяц и сколько дней?



Вот именно в этом и проблема! Надо знать високосный год был или нет и еще надо учитывать сколько дней в месяце!!!!
Так вот исход из этой проблемы уже не один раз писАлось/говорилось, что НЕТ одного "правильного" расчета разницы в датах в виде гг.мм.дд, НЕТ. Есть узаконенные/принятые в каких-то оргнизациях/законах/подзаконных актах способы/алгоритмы, которые подходят и применяются только для этих оргнизаций/законов/подзаконных актов. Надо тебе трудовой стаж посчитать - лезь в трудовое законодательство и смотри как там обязывают этот стаж считать. Для подсчета возраста такой способ может совершенно не подходить.
1 сен 09, 16:51    [7604545]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление даты!  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Ramis
Shocker.Pro
Стоп.
Ерунда в вашем начальном условии.

Ramis
прошел 1 год 1 месяц 3 дня!???


Допустим, прошло 40 дней.
Это 1 месяц и сколько дней?



Вот именно в этом и проблема! Надо знать високосный год был или нет и еще надо учитывать сколько дней в месяце!!!!
Не вижу проблемы. Считаете разницу в месяцах.
Это даёт, кроме всего прочего, и разницу в годах - ведь год всегда состоит из 12 месяцев?
Отдельно разбираетесь с днями.
Сервер сам учтёт високосные годы.
1 сен 09, 16:54    [7604571]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление даты!  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21520
Ramis
Вот именно в этом и проблема! Надо знать високосный год был или нет и еще надо учитывать сколько дней в месяце!!!!


Если я правильно понял, нужно считать именно те месяцы и года, которые и были вложены между этими датами.
Тогда все просто
YEAR(b)-YEAR(a)
MONTH(b)-MONTH(a) (если получилось отрицательное значение - уменьшить год на 1 а месяцев: 12+разница со своим знаком)
DAY(b)-DAY(a) (если получилось отрицательное значение - см. выше)
1 сен 09, 16:57    [7604590]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление даты!  [new]
проходящий.
Guest
iap
Ramis
Shocker.Pro
Стоп.
Ерунда в вашем начальном условии.

Ramis
прошел 1 год 1 месяц 3 дня!???


Допустим, прошло 40 дней.
Это 1 месяц и сколько дней?



Вот именно в этом и проблема! Надо знать високосный год был или нет и еще надо учитывать сколько дней в месяце!!!!
Не вижу проблемы. Считаете разницу в месяцах.
Отлично. Разница между 28 февраля и 28 марта - один месяц или нет?
1 сен 09, 17:00    [7604613]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление даты!  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21520
проходящий.
Отлично. Разница между 28 февраля и 28 марта - один месяц или нет?


Отличный вопрос!

Пусть лучше автор ответит, Разница между 28 февраля и 29 марта - один месяц+один день? или нет?
1 сен 09, 17:03    [7604631]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление даты!  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
проходящий.
iap
Ramis
Shocker.Pro
Стоп.
Ерунда в вашем начальном условии.

Ramis
прошел 1 год 1 месяц 3 дня!???


Допустим, прошло 40 дней.
Это 1 месяц и сколько дней?



Вот именно в этом и проблема! Надо знать високосный год был или нет и еще надо учитывать сколько дней в месяце!!!!
Не вижу проблемы. Считаете разницу в месяцах.
Отлично. Разница между 28 февраля и 28 марта - один месяц или нет?
Одного года? Да!
28 февраля и 27 марта - нет!
28 февраля и 29 марта - 1 месяц и один день!
Ну, а как ещё?!
1 сен 09, 17:04    [7604651]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление даты!  [new]
проходящий.
Guest
iap
проходящий.
iap
Ramis
Shocker.Pro
Стоп.
Ерунда в вашем начальном условии.

Ramis
прошел 1 год 1 месяц 3 дня!???


Допустим, прошло 40 дней.
Это 1 месяц и сколько дней?



Вот именно в этом и проблема! Надо знать високосный год был или нет и еще надо учитывать сколько дней в месяце!!!!
Не вижу проблемы. Считаете разницу в месяцах.
Отлично. Разница между 28 февраля и 28 марта - один месяц или нет?
Одного года? Да!
28 февраля и 27 марта - нет!
28 февраля и 29 марта - 1 месяц и один день!
Ну, а как ещё?!
Ну вот ели Вы не видите других вариантов, то это не означает, что их нет. В частности, есть методики расчета, в которых в невисокосных годах это отнюдь не месяц, а всего лишь 28 дней. А разница в месяц наступит только 31 марта ибо это есть последние дни месяцев. Именно поэтому кажущаяся простота разницы "в месяцах" далеко не так проста. И именно по этому спрашивается - в каих месяцах меряем? По 28, 29, 30 или 31 дню?
1 сен 09, 17:13    [7604708]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление даты!  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
iap
проходящий.
iap
Ramis
Shocker.Pro
Стоп.
Ерунда в вашем начальном условии.

Ramis
прошел 1 год 1 месяц 3 дня!???


Допустим, прошло 40 дней.
Это 1 месяц и сколько дней?



Вот именно в этом и проблема! Надо знать високосный год был или нет и еще надо учитывать сколько дней в месяце!!!!
Не вижу проблемы. Считаете разницу в месяцах.
Отлично. Разница между 28 февраля и 28 марта - один месяц или нет?
Одного года? Да!
28 февраля и 27 марта - нет!
28 февраля и 29 марта - 1 месяц и один день!
Ну, а как ещё?!

а 30 января и 27 февраля?
1 сен 09, 17:13    [7604712]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление даты!  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Алексей2003
а 30 января и 27 февраля?
28 дней < 1 месяца.
Не, так не пойдёт?
1 сен 09, 17:18    [7604741]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление даты!  [new]
проходящий.
Guest
iap
Алексей2003
а 30 января и 27 февраля?
28 дней < 1 месяца.
Не, так не пойдёт?
Тут надо было брать 28 февраля, интереснее получается. Чисто дням 29 дней, а вот в месяцах может быть или 0, или 1 или 1 месяц и один день. Все зависит от применной в данном конкретном случае методики расчета.
1 сен 09, 17:22    [7604780]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление даты!  [new]
Slider_spb
Member

Откуда:
Сообщений: 800
А так не подойдёт:
DECLARE @d1 datetime
DECLARE @d2 datetime

SET @d1='20071122'
SET @d2='20081224' 

-- прошло лет, месяцев, дней
SELECT datepart(year,@d2)-datepart(year,@d2), datepart(month,@d2)-datepart(month,@d1), datepart(day,@d2)-datepart(day,@d1)
1 сен 09, 17:43    [7604949]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление даты!  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21520
Slider_spb,

думаю, что вариант "прошло 5 лет и минус 3 месяца" его не устроит :D
1 сен 09, 17:47    [7604972]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление даты!  [new]
Slider_spb
Member

Откуда:
Сообщений: 800
Ну тогда так:
DECLARE @d1 datetime
DECLARE @d2 datetime
DECLARE @ret datetime

SET @d1='20070801'
SET @d2='20081202' 

-- прошло лет, месяцев, дней
SELECT datepart(year,@d2-@d1)-1900, datepart(month,@d2-@d1)-1, datepart(day,@d2-@d1)-1
1 сен 09, 18:04    [7605097]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление даты!  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21520
Slider_spb
Ну тогда так:


Посмотрите, что получится при данных:
SET @d1='20071201'
SET @d2='20081201'


Собсно - об это копья и ломаем. Реализация - дело третье
1 сен 09, 18:09    [7605116]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление даты!  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
iap
Алексей2003
а 30 января и 27 февраля?
28 дней < 1 месяца.
Не, так не пойдёт?

т.е. граничное условие ставим 28 дней, потому что последний месяц для сравнения февраль?
1 сен 09, 18:12    [7605135]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление даты!  [new]
Slider_spb
Member

Откуда:
Сообщений: 800
Понятненько, високосные года надо еще учитывать...
1 сен 09, 18:14    [7605145]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление даты!  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
iap
Алексей2003
а 30 января и 27 февраля?
28 дней < 1 месяца.
Не, так не пойдёт?

а 31 января и 28 февраля?
1 сен 09, 18:17    [7605155]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление даты!  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21520
Аффтар!

А первая дата не фиксирована началом месяца или началом года?
Это упростило бы задачу.
1 сен 09, 18:18    [7605161]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить