![]() |
| ||
|
|
Новости |
Поиск |
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
Логика подсказывает, что должен быть более прямой путь :-))
Gadenysh (2007-12-03 19:56:00) [1]select cast(floor(cast(getdate() as float)) as DateTime) CurrentDate
Anatoly Podgoretsky (2007-12-02 16:35:00) [2]> VadimSpb (02.12.2007 16:26:43) [43]
Ну так попробуй
VadimSpb (2007-12-02 16:26:00) [3]
> А накопительная сумма это совсем другой вопрос.
Как его лучше решить?
Курсорами [39] еще не пробовал.
Anatoly Podgoretsky (2007-12-02 16:23:00) [4]Может ясно, может нет, в запросе этого нет.
А накопительная сумма это совсем другой вопрос.
VadimSpb (2007-12-02 16:20:00) [5]
> это типа в первый день только за первый за второй сумма
> первого и второго и т.д?
Да, так.
> Anatoly Podgoretsky © (02.12.07 16:07) [40]
Я наверное что-то недопонимаю :-))
Последний мой запрос в [36] в принципе верен, сейчас у меня в базе данные с нулевым временем и он работает. Заполняем данные с временем и изменяем запрос - отбрасываем в нем время или обнуляем его. Вроде уже ясно как это сделать и это работает.
Теперь необходимо посчитать "первый день только за первый за второй сумма первого и второго и т.д"
Anatoly Podgoretsky (2007-12-02 16:07:00) [6]> VadimSpb (02.12.2007 15:49:38) [38]
Convert
sniknik (2007-12-02 15:52:00) [7]> А как сделать общую сумму всех платежей на дату?
что это значит?
это типа в первый день только за первый за второй сумма первого и второго и т.д?
если так то вычислять эту накопительную суммы оптимальнее всего с помощью курсоров добавляя сумму дня к накопительной сумме (см. пример в разделе DECLARE CURSOR), как основу курсора вполне можно использовать приведенный запрос. а результат формировать во временной таблице например.
(чисто на запросах это будет коряво, имхо)
VadimSpb (2007-12-02 15:49:00) [8]
> Конвертировать PaymentDate в формат без времени или в формат
> с нулевым временем.
Понятно, но это для суммы платежей на дату, чтобы время не мешало.
А как сделать запрос на общую сумму всех предыдущих платежей на дату?
Anatoly Podgoretsky (2007-12-02 15:36:00) [9]> VadimSpb (02.12.2007 15:28:36) [36]
Конвертировать PaymentDate в формат без времени или в формат с нулевым временем.
VadimSpb (2007-12-02 15:28:00) [10]
SELECT PaymentDate, SUM(PaymentSum)
FROM Payments
GROUP BY PaymentDate
Сумма платежей на дату.
А как сделать общую сумму всех платежей на дату?
VadimSpb (2007-12-02 15:21:00) [11]Ну почему?
Сваяю - покажу. :-))
Anatoly Podgoretsky (2007-12-02 15:18:00) [12]Чем дальше, тем не понятнее, а тестовые данные и результат видимо никогда не увидим.
VadimSpb (2007-12-02 15:14:00) [13]
> sniknik © (02.12.07 14:59) [32]
Пытаюсь переписать запрос с группировкой, пока не очень:-))
Есть две таблицы: Платежи, Начисления. Даты в них м.б. разные. Необходима сводная таблица: Дата, Сумма платежей на дату, Сумма платежей всего на дату, Сумма начислений на дату, Сумма начислений всего на дату.
Наводящим примером не поможете?
sniknik (2007-12-02 14:59:00) [14]> Как минимум индексы по побоку
они в любом случае побоку, т.к. группировать в любом случае придется по вычислению.
> Посмотри еще convert мощная вещь, но надо понимать.
группировка по числу предпочтительней чем по строке, а как использовать convert чтобы выделить день и без строк?
ихто, то что предложил есть лучшее решение. естественно для того для чего предлагалось, группировки, а не использования в условии например (вот тут индексы жалко...).
> Собственно с кривизны и ресурсоемкости этого способа и начинали :-))
ага, закрыв глаза на действительно ресурсоемкую вещь - кривую логику запроса.
не с того начинаешь, в нормальном запросе преобразования сведутся к минимуму (в идеале к 1-у разу на группу), и будет практически неважно каким способом делаются... (ну дадут для года 365 вызовов выгоду в миллисекунду... ну кому это важно?), а логика тебе минуты добавляет даже для не очень больших таблиц (возьмем к примеру в 1 миллион записей).
Anatoly Podgoretsky (2007-12-02 14:45:00) [15]> 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 и читать примечания в БОЛ
Anatoly Podgoretsky (2007-12-02 14:41:00) [16]> VadimSpb (02.12.2007 14:28:29) [29]
Повторю, читай БОЛ, все возможно и все легко читается.
А что понимается под "время все равно не удается убрать из даты" определение очень туманное, расшифруйся. На всякий случай тип DateTime не может существовать без времени, также как и TDateTime в Дельфи.
Timestamp не имеет отношение ко времени, это уникальное число.
VadimSpb (2007-12-02 14:28:00) [17]
> Anatoly Podgoretsky © (02.12.07 14:19) [28]
Речь идет о конвертации из временного формата во временной?
DateTime в Timestamp? Можно, но время все равно не удается убрать из даты..
Anatoly Podgoretsky (2007-12-02 14:19:00) [18]> VadimSpb (02.12.2007 14:13:27) [27]
Читай БОЛ, ты очень плохо понимаешь работу Convert
VadimSpb (2007-12-02 14:13:00) [19]
> а вернуть в виде дд.мм.гггг можно с помощью 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:02:00) [20]> VadimSpb (02.12.2007 13:53:22) [22]
Это звучит как абсурд. Для суммирования по группам наличие группировки обязательно.