![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Получение даты с MS SQL 2005 [D7, MSSQL]
VadimSpb © (2007-12-02 01:25:00)Добрый день!
Существует ли возможность вернуть в результате запроса дату в формате дд.мм.гггг (напр., 02.12.2007)? Поле в таблице - DateTime (напр., 02.12.2007 10:00:00).
С ходу решил вопрос двойной конвертацией
SELECT CONVERT(datetime,CONVERT(char(20), Column,104),104) FROM Table
Логика подсказывает, что должен быть более прямой путь :-))
Anatoly Podgoretsky (2007-12-02 14:00:00) [21]> VadimSpb (02.12.2007 13:42:21) [21]
datepart+datepart+datepart+dateadd
а вернуть в виде дд.мм.гггг можно с помощью convert
Anatoly Podgoretsky (2007-12-02 13:59:00) [22]> sniknik (02.12.2007 13:27:19) [19]
Как минимум индексы по побоку
Anatoly Podgoretsky (2007-12-02 13:59:00) [23]> sniknik (02.12.2007 13:28:20) [20]
Посмотри еще convert мощная вещь, но надо понимать.
VadimSpb (2007-12-02 13:53:00) [24]Нашел - dy? Нашел, предыдущий вопрос снимается, с датой без времени ясно.
Теперь по группировке. Это действительно более производительный способ для дальнейшего суммирования?
VadimSpb (2007-12-02 13:42:00) [25]
> sniknik © (02.12.07 13:28) [20]
Аргумент datepart в DateDiff позволяет вернуть только одну чать даты: год, день и т.д. А как вернуть дд.мм.гггг?
sniknik (2007-12-02 13:28:00) [26]> В БОЛе пока и нашел только по конвертации :-((
DateDiff(d,0,GetDate())
sniknik (2007-12-02 13:27:00) [27]> А будет ли быстрее чем при конвертации работать?
тебя не это должно волновать, а то что для получения одного(!) значения у тебя выполняется гигантский подзапрос(даже цепочка) с объединением двух таблиц...
что там время конвертации... оно затеряется в общем, изза неправильной логики, как капля в бочке воды...
> Любые конвертации приводят к резкому снижению производительности.
ну, это только в нормальных случаях...
хотя если конвертации будут еще и множественными, т.е. вставлены внутрь подзапросов, то конечно, из капель ведро наберется.
VadimSpb (2007-12-02 13:27:00) [28]В БОЛе пока и нашел только по конвертации :-((
Еще склеить можно, но тоже мне кажется кривой способ.
Anatoly Podgoretsky (2007-12-02 13:18:00) [29]> VadimSpb (02.12.2007 13:12:16) [16]
Любые конвертации приводят к резкому снижению производительности.
А все что тебе нужно описано в БОЛ
VadimSpb (2007-12-02 13:12:00) [30]
> Anatoly Podgoretsky © (02.12.07 13:05) [15]
Упс..., точно, там сортировка. Надо переделать. Спасибо.
Но вопрос с датой не снимается. Сделать функцией? Вытаскивать отдельно год + мес. + дату? и склеивать? А будет ли быстрее чем при конвертации работать? Нельзя ли сразу возвратить дд.мм.ггг. без времени в временном формате?
Anatoly Podgoretsky (2007-12-02 13:05:00) [31]> VadimSpb (02.12.2007 12:33:14) [14]
Если ты про последний пример, то никакой группировки не наблюдается
VadimSpb (2007-12-02 12:33:00) [32]
> Сам подход неверный, смотри ответ sniknik
Стараюсь :-))
1. По дате и группируется. Вопрос - как получить дату без времени?
2. Чем плох приведенный запрос? Считает платежи и начисления всего и по дате. Есть более оптимальный алгоритм?
Anatoly Podgoretsky (2007-12-02 12:22:00) [33]> VadimSpb (02.12.2007 11:47:11) [11]
Сам подход неверный, смотри ответ sniknik
VadimSpb (2007-12-02 12:05:00) [34]
> sniknik © (02.12.07 11:47) [10]
Вот полный рабочий пример.
SELECT S.Data,
(SELECT ISNULL(SUM(TS.PaymentSum),0)
FROM Payments AS TS
WHERE TS.PaymentDate<= S.Data) AS All_SUMMA,
(SELECT ISNULL(SUM(TS.PaymentSum),0)
FROM Payments AS TS
WHERE TS.PaymentDate = S.Data) AS DATA_SUMMA,
(SELECT ISNULL(SUM(DS.Summa),0)
FROM Debtors AS DS
WHERE DS.Data <= S.Data) AS All_DEBT,
(SELECT ISNULL(SUM(DD.Summa),0)
FROM Debtors AS DD
WHERE DD.Data = S.Data) AS Data_DEBT
FROM
(SELECT PaymentDate AS Data FROM Payments
UNION
SELECT Data FROM Debtors) AS S
WHERE
S.Data IS NOT NULL
ORDER BY S.Data
Ранее в БД дата шла без времени, только дата (по умолчанию сервер ставил 0:00:00) и запрос работал нормально. Теперь необходимы данные с временем.
> нужно по дням, ну так и выдели дни из даты и группируй по
> ним
Собственно и вопрос в этом! Дата нужна с годом и месяцем дд.мм.гггг. без часов и минут.
Если получить целую часть при помощи CAST, то он округляет в большую сторону после 12:00, т.е. получается следующий день.
VadimSpb (2007-12-02 11:47:00) [35]
> ты попробуй хотя бы посчитать количество символов в результате
О том и речь - как сделать иначе?
Я что тут свои решения прославляю?
sniknik (2007-12-02 11:47:00) [36]> Упоминание о бреде неконструктивно и неинтересно.
"лечение" и разбор следствий, а не причины еще более неконструктивно и неинтересно.
почему вопрос о получении даты, причем как видно из примера в запросе, когда проблема в группировке?
>> Он, видать, потом группировку по этому сделать хочет
> Да, конечно.
т.е. ты просто не знаеш как группировку в запросе по дате сделать
совет. не трогай дату, оставь ее как есть в запросе, а группируй по функции, нужно по дням, ну так и выдели дни из даты и группируй по ним (собственно дата и есть количество дней с начала точки отсчета)
и совет №2. перепиши "Рабочий пример:". т.к. раз говоришь структура нормальная то значит запрос бредовый...
Anatoly Podgoretsky (2007-12-02 11:35:00) [37]
> Логика подсказывает, что должен быть более прямой путь :
> -))
Поскольку это CONVERT(char(20) бред, ты попробуй хотя бы посчитать количество символов в результате.
VadimSpb (2007-12-02 10:29:00) [38]
> Спроектируйте нормально БД, потом можно говорить...
Можете предложить что-то лучше реляционного варианта трех таблиц (Абонент, Платеж, Начисление)?
Упоминание о бреде неконструктивно и неинтересно.
Johnmen (2007-12-02 02:08:00) [39]Скажу честно - совершенно неинтересно ковыряться в этом бреде.
Спроектируйте нормально БД, потом можно говорить...
VadimSpb (2007-12-02 02:04:00) [40]
> Он, видать, потом группировку по этому сделать хочет
Да, конечно.