Havera

Автор Тема: вопрос по sql  (Прочитано 3306 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Оля

  • Girlfriend
  • Коренной житель
  • ****
  • Сообщений: 722
  • Пол: Женский
вопрос по sql
« : Июня 16, 2012, 15:20:06 »
я не знала где открыть такую тему, так вот я учила sql но на самом базисном уровне, сейчас бегаю по раайоно авода, иногда моей базы мне хватает, иногда нет, вот в последнем вопросе я не знала как сделать и в нете не нахожу ответа
вопрос был такой, даны 2 таблицы, в одной из таблиц есть колонка startdate и enddate в этих колонках есть и время и дата типа 17 00 00  01/02/2007 мне нужно найти сколько сах аколь фирма работала в феврале месяце, я просто не понимаю как можно сделать разность между колонками,а не между строками, и как так сделать чтобы шеильта относилась только к времени и не трогала дату, надеюсь понятно написала, если чё могу выслать цилум листика
спасибо

Оффлайн Стамча

  • Underground
  • YaBB God
  • *****
  • Сообщений: 15873
  • Пол: Женский
  • Завтра будет лучше.
Re: вопрос по sql
« Ответ #1 : Июня 17, 2012, 10:34:34 »
Разность как раз и делается всегда между колонками, что бы сделать разность между строками нужно саб шеильту писать. А так  - запросто. Какой SQL у тебя? 2005, 2008 или где?

Разность между любыми двумя датами достается функцией datediff, первым параметром которой как раз и идет единица времени в которой ты хочешь получить эту разность. Например ss,mi, dd,mm,yyyy - секунды, минуты, дни, месяцы или годы соответственно. Подробнее в хелпе по поиску datediff.
declare @StartDate datetime
declare @EndDate datetime

set @StartDate = getdate()
set @EndDate = dateadd(mi, -3294, getdate())

select datediff(mi, @StartDate,@EndDate)
select datediff(dd, @StartDate,@EndDate)
select datediff(m, @StartDate,@EndDate)

Если тебе нужен подсчет в месяц, то тебе нужен и GROUP BY по месяцу и году. Значит понадобиться скорее всего еще и функции datepart. Соответственно надо уточнить по месяцу и году какой из дат - начала или конца?

Не очень понятно какое именно у тебя затруднение и какая связка между двумя таблицами (inner, left...) , я строение базы твоей не вижу и запроса не знаю. Но скорее всего будет что-то в этом роде:


create table T1 (
Id int NOT NULL,
DateStart datetime,
DateEnd datetime,
)

create table T2 (
Id int NOT NULL,
Note1 varchar(20) NULL,
Note2 varchar(20) NULL
)

insert into T1 select 1, dateadd(mi, -10, getdate()), getdate()
insert into T1 select 2, dateadd(mi, -20, getdate()), getdate()
insert into T1 select 3, dateadd(mi, -30, getdate()), getdate()
insert into T1 select 4, dateadd(mi, -40, getdate()), getdate()

insert into T2 select 1, 'ku','ku'
insert into T2 select 2, 'ku-ku','ku-ku'
insert into T2 select 3, 'ku-ku-ku','ku-ku-ku'
insert into T2 select 4, 'ku-ku-ku-ku','ku-ku-ku-ku'

select *, datediff(mi,DateStart, DateEnd) as datediff_in_mi from T1
select * from T2

select datepart(mm, DateStart), datepart(yyyy, DateStart), SUM(datediff(mi,DateStart, DateEnd)) as SumInMinutes
from T1 inner join T2
on T1.Id = T2.Id
group by datepart(mm, DateStart), datepart(yyyy, DateStart)


drop table T1
drop table T2

Опять таки, стоит не забывать, что функция datediff округляет до единиц вычисления, так что стоит подсчитать разницу в секундах и разделить ее после на 60.0 (обязательно с точкой, иначе будет опять только целая часть вычисления и не забыть потом засунуть результат во что-то, типа float real или numeric)
Необидчивый человек - это тот, которого пошлешь нахер, а вернется он отдохнувший и с магнитиками в подарок...