Форум: "Начинающим";
Текущий архив: 2007.12.30;
Скачать: [xml.tar.bz2];
ВнизПолучение даты с MS SQL 2005 Найти похожие ветки
← →
VadimSpb (2007-12-02 01:25) [0]Добрый день!
Существует ли возможность вернуть в результате запроса дату в формате дд.мм.гггг (напр., 02.12.2007)? Поле в таблице - DateTime (напр., 02.12.2007 10:00:00).
С ходу решил вопрос двойной конвертациейSELECT CONVERT(datetime,CONVERT(char(20),Column,104),104) FROM Table
Логика подсказывает, что должен быть более прямой путь :-))
← →
Johnmen © (2007-12-02 01:27) [1]А смысл?
← →
VadimSpb (2007-12-02 01:32) [2]Это часть большого запроса по учету платежей для статистики. Если оставить время, то подсчет будет идти буквально "по часам", а нужны данные посуточно.
← →
Johnmen © (2007-12-02 01:52) [3]
> Если оставить время, то подсчет будет идти буквально "по
> часам", а нужны данные посуточно.
Это как? Я не понял....
← →
DrPass © (2007-12-02 01:58) [4]
> Johnmen © (02.12.07 01:52) [3]
Он, видать, потом группировку по этому сделать хочет
← →
VadimSpb (2007-12-02 02:03) [5]Рабочий пример:
SELECT S.Data,
(SELECT ISNULL(SUM(TS.PaymentSum),0)
FROM Payments AS TS
WHERE CONVERT(datetime,CONVERT(char(20),TS.PaymentDate,104),104) <= S.Data) AS All_SUMMA,
(SELECT ISNULL(SUM(TS.PaymentSum),0)
FROM Payments AS TS
WHERE CONVERT(datetime,CONVERT(char(20),TS.PaymentDate,104),104) = S.Data) AS DATA_SUMMA
FROM
(SELECT CONVERT(datetime,CONVERT(char(20),PaymentDate,104),104) AS Data FROM Payments
UNION
SELECT CONVERT(datetime,CONVERT(char(20),Datа,104),104) FROM Debtors) AS S
Если не убрать время, то суммирование будет идти "по часам и минутам", а надо посуточно.
← →
VadimSpb (2007-12-02 02:04) [6]
> Он, видать, потом группировку по этому сделать хочет
Да, конечно.
← →
Johnmen © (2007-12-02 02:08) [7]Скажу честно - совершенно неинтересно ковыряться в этом бреде.
Спроектируйте нормально БД, потом можно говорить...
← →
VadimSpb (2007-12-02 10:29) [8]
> Спроектируйте нормально БД, потом можно говорить...
Можете предложить что-то лучше реляционного варианта трех таблиц (Абонент, Платеж, Начисление)?
Упоминание о бреде неконструктивно и неинтересно.
← →
Anatoly Podgoretsky © (2007-12-02 11:35) [9]
> Логика подсказывает, что должен быть более прямой путь :
> -))
Поскольку это CONVERT(char(20) бред, ты попробуй хотя бы посчитать количество символов в результате.
← →
sniknik © (2007-12-02 11:47) [10]> Упоминание о бреде неконструктивно и неинтересно.
"лечение" и разбор следствий, а не причины еще более неконструктивно и неинтересно.
почему вопрос о получении даты, причем как видно из примера в запросе, когда проблема в группировке?
>> Он, видать, потом группировку по этому сделать хочет
> Да, конечно.
т.е. ты просто не знаеш как группировку в запросе по дате сделать
совет. не трогай дату, оставь ее как есть в запросе, а группируй по функции, нужно по дням, ну так и выдели дни из даты и группируй по ним (собственно дата и есть количество дней с начала точки отсчета)
и совет №2. перепиши "Рабочий пример:". т.к. раз говоришь структура нормальная то значит запрос бредовый...
← →
VadimSpb (2007-12-02 11:47) [11]
> ты попробуй хотя бы посчитать количество символов в результате
О том и речь - как сделать иначе?
Я что тут свои решения прославляю?
← →
VadimSpb (2007-12-02 12:05) [12]
> 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, т.е. получается следующий день.
← →
Anatoly Podgoretsky © (2007-12-02 12:22) [13]> VadimSpb (02.12.2007 11:47:11) [11]
Сам подход неверный, смотри ответ sniknik
← →
VadimSpb (2007-12-02 12:33) [14]
> Сам подход неверный, смотри ответ sniknik
Стараюсь :-))
1. По дате и группируется. Вопрос - как получить дату без времени?
2. Чем плох приведенный запрос? Считает платежи и начисления всего и по дате. Есть более оптимальный алгоритм?
← →
Anatoly Podgoretsky © (2007-12-02 13:05) [15]> VadimSpb (02.12.2007 12:33:14) [14]
Если ты про последний пример, то никакой группировки не наблюдается
← →
VadimSpb (2007-12-02 13:12) [16]
> Anatoly Podgoretsky © (02.12.07 13:05) [15]
Упс..., точно, там сортировка. Надо переделать. Спасибо.
Но вопрос с датой не снимается. Сделать функцией? Вытаскивать отдельно год + мес. + дату? и склеивать? А будет ли быстрее чем при конвертации работать? Нельзя ли сразу возвратить дд.мм.ггг. без времени в временном формате?
← →
Anatoly Podgoretsky © (2007-12-02 13:18) [17]> VadimSpb (02.12.2007 13:12:16) [16]
Любые конвертации приводят к резкому снижению производительности.
А все что тебе нужно описано в БОЛ
← →
VadimSpb (2007-12-02 13:27) [18]В БОЛе пока и нашел только по конвертации :-((
Еще склеить можно, но тоже мне кажется кривой способ.
← →
sniknik © (2007-12-02 13:27) [19]> А будет ли быстрее чем при конвертации работать?
тебя не это должно волновать, а то что для получения одного(!) значения у тебя выполняется гигантский подзапрос(даже цепочка) с объединением двух таблиц...
что там время конвертации... оно затеряется в общем, изза неправильной логики, как капля в бочке воды...
> Любые конвертации приводят к резкому снижению производительности.
ну, это только в нормальных случаях...
хотя если конвертации будут еще и множественными, т.е. вставлены внутрь подзапросов, то конечно, из капель ведро наберется.
← →
sniknik © (2007-12-02 13:28) [20]> В БОЛе пока и нашел только по конвертации :-((
DateDiff(d,0,GetDate())
← →
VadimSpb (2007-12-02 13:42) [21]
> sniknik © (02.12.07 13:28) [20]
Аргумент datepart в DateDiff позволяет вернуть только одну чать даты: год, день и т.д. А как вернуть дд.мм.гггг?
← →
VadimSpb (2007-12-02 13:53) [22]Нашел - dy? Нашел, предыдущий вопрос снимается, с датой без времени ясно.
Теперь по группировке. Это действительно более производительный способ для дальнейшего суммирования?
← →
Anatoly Podgoretsky © (2007-12-02 13:59) [23]> sniknik (02.12.2007 13:27:19) [19]
Как минимум индексы по побоку
← →
Anatoly Podgoretsky © (2007-12-02 13:59) [24]> sniknik (02.12.2007 13:28:20) [20]
Посмотри еще convert мощная вещь, но надо понимать.
← →
Anatoly Podgoretsky © (2007-12-02 14:00) [25]> VadimSpb (02.12.2007 13:42:21) [21]
datepart+datepart+datepart+dateadd
а вернуть в виде дд.мм.гггг можно с помощью convert
← →
Anatoly Podgoretsky © (2007-12-02 14:02) [26]> VadimSpb (02.12.2007 13:53:22) [22]
Это звучит как абсурд. Для суммирования по группам наличие группировки обязательно.
← →
VadimSpb (2007-12-02 14:13) [27]
> а вернуть в виде дд.мм.гггг можно с помощью convert
Собственно с кривизны и ресурсоемкости этого способа и начинали :-))
Правда там шло преобразование в символьный вид.
Можно сделатьSELECT CONVERT(datetime, DATEDIFF(dy, 0, PaymentDate)) AS Expr1
FROM Payments
Собственно, конвертация и не нужна, можно работать с целой частью.
Затем все идет в график. У Борланда дата начинается с 30.12.1899, а у MS SQL с 01.01.1900, т.е. при работе с целым числом даты надо 2 дня разницы учесть.
← →
Anatoly Podgoretsky © (2007-12-02 14:19) [28]> VadimSpb (02.12.2007 14:13:27) [27]
Читай БОЛ, ты очень плохо понимаешь работу Convert
← →
VadimSpb (2007-12-02 14:28) [29]
> Anatoly Podgoretsky © (02.12.07 14:19) [28]
Речь идет о конвертации из временного формата во временной?
DateTime в Timestamp? Можно, но время все равно не удается убрать из даты..
← →
Anatoly Podgoretsky © (2007-12-02 14:41) [30]> VadimSpb (02.12.2007 14:28:29) [29]
Повторю, читай БОЛ, все возможно и все легко читается.
А что понимается под "время все равно не удается убрать из даты" определение очень туманное, расшифруйся. На всякий случай тип DateTime не может существовать без времени, также как и TDateTime в Дельфи.
Timestamp не имеет отношение ко времени, это уникальное число.
← →
Anatoly Podgoretsky © (2007-12-02 14:45) [31]> VadimSpb (02.12.2007 14:28:29) [29]
Забыл еще уточнить один нюанс для Timestamp в MS SQL 2005 это
The Transact-SQL timestamp data type is different from the timestamp data type defined in the SQL-2003 standard. The SQL-2003 timestamp data type is equivalent to the Transact-SQL datetime data type.
Поэтому не рекомендуется использовать этот тип из-за проблем в будущем, использовать надо RowVersion и читать примечания в БОЛ
← →
sniknik © (2007-12-02 14:59) [32]> Как минимум индексы по побоку
они в любом случае побоку, т.к. группировать в любом случае придется по вычислению.
> Посмотри еще convert мощная вещь, но надо понимать.
группировка по числу предпочтительней чем по строке, а как использовать convert чтобы выделить день и без строк?
ихто, то что предложил есть лучшее решение. естественно для того для чего предлагалось, группировки, а не использования в условии например (вот тут индексы жалко...).
> Собственно с кривизны и ресурсоемкости этого способа и начинали :-))
ага, закрыв глаза на действительно ресурсоемкую вещь - кривую логику запроса.
не с того начинаешь, в нормальном запросе преобразования сведутся к минимуму (в идеале к 1-у разу на группу), и будет практически неважно каким способом делаются... (ну дадут для года 365 вызовов выгоду в миллисекунду... ну кому это важно?), а логика тебе минуты добавляет даже для не очень больших таблиц (возьмем к примеру в 1 миллион записей).
← →
VadimSpb (2007-12-02 15:14) [33]
> sniknik © (02.12.07 14:59) [32]
Пытаюсь переписать запрос с группировкой, пока не очень:-))
Есть две таблицы: Платежи, Начисления. Даты в них м.б. разные. Необходима сводная таблица: Дата, Сумма платежей на дату, Сумма платежей всего на дату, Сумма начислений на дату, Сумма начислений всего на дату.
Наводящим примером не поможете?
← →
Anatoly Podgoretsky © (2007-12-02 15:18) [34]Чем дальше, тем не понятнее, а тестовые данные и результат видимо никогда не увидим.
← →
VadimSpb (2007-12-02 15:21) [35]Ну почему?
Сваяю - покажу. :-))
← →
VadimSpb (2007-12-02 15:28) [36]
SELECT PaymentDate, SUM(PaymentSum)
FROM Payments
GROUP BY PaymentDate
Сумма платежей на дату.
А как сделать общую сумму всех платежей на дату?
← →
Anatoly Podgoretsky © (2007-12-02 15:36) [37]> VadimSpb (02.12.2007 15:28:36) [36]
Конвертировать PaymentDate в формат без времени или в формат с нулевым временем.
← →
VadimSpb (2007-12-02 15:49) [38]
> Конвертировать PaymentDate в формат без времени или в формат
> с нулевым временем.
Понятно, но это для суммы платежей на дату, чтобы время не мешало.
А как сделать запрос на общую сумму всех предыдущих платежей на дату?
← →
sniknik © (2007-12-02 15:52) [39]> А как сделать общую сумму всех платежей на дату?
что это значит?
это типа в первый день только за первый за второй сумма первого и второго и т.д?
если так то вычислять эту накопительную суммы оптимальнее всего с помощью курсоров добавляя сумму дня к накопительной сумме (см. пример в разделе DECLARE CURSOR), как основу курсора вполне можно использовать приведенный запрос. а результат формировать во временной таблице например.
(чисто на запросах это будет коряво, имхо)
← →
Anatoly Podgoretsky © (2007-12-02 16:07) [40]> VadimSpb (02.12.2007 15:49:38) [38]
Convert
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.12.30;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.008 c