Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1196095695
@!!ex
2007-11-26 19:48
2007.12.30
Speech Engine


3-1188291869
parivet
2007-08-28 13:04
2007.12.30
TClientDataSet


2-1196853292
mrFreeman2007
2007-12-05 14:14
2007.12.30
Как программно свернуть форму?


2-1196692668
WFS
2007-12-03 17:37
2007.12.30
Несколько вопросов про картинки


2-1196832246
uno
2007-12-05 08:24
2007.12.30
Уведомление о полученном сообщении





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский