Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Получение даты с MS SQL 2005 [D7, MSSQL]


Страницы:   1 2 3

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]

Это звучит как абсурд. Для суммирования по группам наличие группировки обязательно.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо