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

Откуда:
Сообщений: 12
KAK POKAZAT KOLICESTVO DNEY V FORMATE YEAR.MONT.DAY?

NAPRIMER U MENYA EST KOLICESTVO DNEY 410
YA XOCU CTO BI S POMOSI FUNSII
POKAZALO MNE

CTO 410 DNEY=1 QOD 1 MESYAS 14 DNEY

S POMOSI KAKOY SQL FUNKSII YA SMOQ BI ETO SDELAT?

Сообщение было отредактировано: 14 фев 15, 14:56
14 фев 15, 10:59    [17264395]     Ответить | Цитировать Сообщить модератору
 Re: KAK POKAZAT KOLICESTVO DNEY V FORMATE YEAR.MONT.DAY?  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3264
AZIZ_AZIZOV,

Определить для начала количество дней в году 365 или 366 , сколько дней в месяце , а потом третий класс вторая четверть - деление
14 фев 15, 11:20    [17264442]     Ответить | Цитировать Сообщить модератору
 Re: KAK POKAZAT KOLICESTVO DNEY V FORMATE YEAR.MONT.DAY?  [new]
AZIZ_AZIZOV
Member

Откуда:
Сообщений: 12
Ken@t,
EST TAKAYA FUNKSIYA ILI JE NET?
14 фев 15, 11:49    [17264491]     Ответить | Цитировать Сообщить модератору
 Re: KAK POKAZAT KOLICESTVO DNEY V FORMATE YEAR.MONT.DAY?  [new]
правильный проходящий.
Guest
AZIZ_AZIZOV
Ken@t,
EST TAKAYA FUNKSIYA ILI JE NET?
Нет такой функции. И быть не может. Ибо невозможно определить в каких месяцах считать. Месяцы же имеют разное количество дней. Так же как и годы.
14 фев 15, 13:21    [17264716]     Ответить | Цитировать Сообщить модератору
 Re: KAK POKAZAT KOLICESTVO DNEY V FORMATE YEAR.MONT.DAY?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37050
AZIZ_AZIZOV,

Модератор: Отожмите капс во избежание закрытия вшей темы
14 фев 15, 14:56    [17264964]     Ответить | Цитировать Сообщить модератору
 Re: вопрос  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31429
AZIZ_AZIZOV
S POMOSI KAKOY SQL FUNKSII YA SMOQ BI ETO SDELAT?
Если знать, с какого года считать, то гегко, используя функцию DATEADD(), и потом YEAR(), MOUNTH(), DAY()

Если не знать, то невозможно, потому что года разные (високосные или нет)
Если взять невисокосный год для стандартизации, то можно просто использовать как точку отсчёта любой невисокосный год по вашему выбору.
14 фев 15, 18:06    [17265328]     Ответить | Цитировать Сообщить модератору
 Re: вопрос  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20583
Считаем Datediff('y',...). Прибавляем полученное к меньшей дате. От новой даты считаем Datediff('m',...). Опять прибавляем. И считаем Datediff('d',...).
14 фев 15, 23:34    [17265978]     Ответить | Цитировать Сообщить модератору
 Re: вопрос  [new]
vikkiv
Member

Откуда: London
Сообщений: 2711
declare @ds date='2011-05-02',@de date='2013-11-16';
select datediff(yy,@ds,@de)years,
datediff(mm,@ds,@de)-(12*datediff(yy,@ds,@de))months,
datediff(dd,dateadd(mm,datediff(mm,@ds,@de),@ds),@de)days
15 фев 15, 20:09    [17267996]     Ответить | Цитировать Сообщить модератору
 Re: вопрос  [new]
ГуЗы
Guest
vikkiv,
Не все так просто:

declare @ds date='2011-05-02',@de date='2015-04-16';
years 	months	 days
4	 -1	14
16 фев 15, 12:28    [17270614]     Ответить | Цитировать Сообщить модератору
 Re: вопрос  [new]
ГуЗы
Guest
alexeyvg
Если не знать, то невозможно, потому что года разные (високосные или нет)

Все равно возможно:

declare @ds date='2011-05-02',@de date='2015-04-16',@YE INT, @MON INT, @DD INT
SELECT @YE = CAST(datediff(dd,@ds,@de)/365.25 AS INT)
SELECT @MON =  CAST(((datediff(dd,@ds,@de)/365.25 -@YE))*365.25/(365.25/12) AS INT)
select @DD = datediff(dd,@ds,@de) -(@YE*365.25+@MON*(365.25/12))
SELECT @YE ЛЕТ, @MON МЕСЯЦЕВ, @DD ДНЕЙ
16 фев 15, 12:55    [17270804]     Ответить | Цитировать Сообщить модератору
 Re: вопрос  [new]
o-o
Guest
ГуЗы
alexeyvg
Если не знать, то невозможно, потому что года разные (високосные или нет)

Все равно возможно:

declare @ds date='2011-05-02',@de date='2015-04-16',@YE INT, @MON INT, @DD INT
SELECT @YE = CAST(datediff(dd,@ds,@de)/365.25 AS INT)
SELECT @MON =  CAST(((datediff(dd,@ds,@de)/365.25 -@YE))*365.25/(365.25/12) AS INT)
select @DD = datediff(dd,@ds,@de) -(@YE*365.25+@MON*(365.25/12))
SELECT @YE ЛЕТ, @MON МЕСЯЦЕВ, @DD ДНЕЙ

ГуЗы, alexeyvg про другое говорит,
ваш пример имеет на входе 2 конкретные даты, поэтому вы можете сказать,
сколько между ними лет.
а ТС говорит, что на входе лишь число дней.
ну так 365 дней это уже год или еще нет?
если считать относительно 20150101, то да, год.
а если относительно 20160101, то +365 это еще не год прошел:
select DATEadd(dd,365, '20160101') -> 2016-12-31 00:00:00.000
16 фев 15, 13:20    [17270954]     Ответить | Цитировать Сообщить модератору
 Re: вопрос  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31429
o-o
ГуЗы, alexeyvg про другое говорит,
ваш пример имеет на входе 2 конкретные даты, поэтому вы можете сказать,
сколько между ними лет.
а ТС говорит, что на входе лишь число дней.
ну так 365 дней это уже год или еще нет?
если считать относительно 20150101, то да, год.
а если относительно 20160101, то +365 это еще не год прошел:
select DATEadd(dd,365, '20160101') -> 2016-12-31 00:00:00.000
Тут конечно нужно уточнить задачу.

Возможно, в такой задаче нужно считать года невисокосными.

Тогда нужно определить целое количество лет, а уже для оставшихся дней считать по любому невисокосному году.

declare @D int = 410 - 1

select Y as ЛЕТ, MONTH(D) as МЕСЯЦЕВ, DAY(D)
from (
select @D/365 as Y, DATEADD(dd, @D - (@D/365)*365, '20150101') as D
) t


Но я даже сомневаюсь, что в бизнес-задача вообще так звучит. Я думаю, там ставился вопрос - сколько прошло времени с такой-то даты (конкретной), в годах, месяцах и днях.
Иначе смысл задачи какуой то абстрактно-абсурдный.
16 фев 15, 15:27    [17271998]     Ответить | Цитировать Сообщить модератору
 Re: вопрос  [new]
ГуЗы
Guest
alexeyvg,
Вы уж нас извиняйте, мы, ж, ить ...
А то, что изобразил будет работать, если на вход дать кол-во дней. Но, пока их меньше 1461 - года будут не високосные, а если больше, то соотв. будет отсчитано кол-во високосных, причем столько, сколько нужно, и, соотв. кол-во лет, месяцев и дней будет правильным.
16 фев 15, 15:43    [17272173]     Ответить | Цитировать Сообщить модератору
 Re: вопрос  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31429
ГуЗы
А то, что изобразил будет работать, если на вход дать кол-во дней. Но, пока их меньше 1461 - года будут не високосные, а если больше, то соотв. будет отсчитано кол-во високосных, причем столько, сколько нужно, и, соотв. кол-во лет, месяцев и дней будет правильным.
Да, я понимаю, вот в этом и вопрос, что нужно ТС :-)
16 фев 15, 15:59    [17272330]     Ответить | Цитировать Сообщить модератору
 Re: вопрос  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1528
ГуЗы
кол-во лет, месяцев и дней будет правильным.
Вот насчет месяцев очень спорное утверждение.
Сколько месяцев и дней между 28-01-2015 и 28-03-2015? Ровно два месяца или 1 месяц и 28 дней?
16 фев 15, 17:03    [17272851]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить