Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.12.30;
Скачать: CL | DM;

Вниз

Получение даты с 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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.023 c
2-1196851391
Максим
2007-12-05 13:43
2007.12.30
DLL


1-1192066406
Dmitry S
2007-10-11 05:33
2007.12.30
OleVariant без автоматического подключения Variants


2-1196715460
Lip
2007-12-03 23:57
2007.12.30
Префиксное дерево


2-1196763788
Alexandr Malygin
2007-12-04 13:23
2007.12.30
динамическое создание/удаление компонент


15-1195413174
Mul
2007-11-18 22:12
2007.12.30
Полезные журналы по программированию