Отправляет email-рассылки с помощью сервиса Sendsay

RFpro.ru: Базы данных MySQL

  Все выпуски  

RusFAQ.ru: Базы данных SQL


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Базы данных SQL

Выпуск № 165
от 06.11.2006, 07:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 385, Экспертов: 48
В номере:Вопросов: 1, Ответов: 3


Вопрос № 60846: Здравствуйте уважаемые эксперты. С MS SQL мало знаком поэтому немогу сделать одну вещь: Моя программа Delphi с помощью SQL -запроса выбирает данные из таблицы на MS SQL-сервере. Запрос в программе составил так: SELECT ID_Обор, Да...

Вопрос № 60.846
Здравствуйте уважаемые эксперты.
С MS SQL мало знаком поэтому немогу сделать одну вещь:
Моя программа Delphi с помощью SQL -запроса выбирает данные из таблицы на MS SQL-сервере.

Запрос в программе составил так:
SELECT ID_Обор, ДатаВремя_начала, ДатаВремя_оконч, ДатаВремя_оконч-ДатаВремя_начала
FROM Table

При значениях:
ДатаВремя_начала = 20.09.2006 10:30:55
ДатаВремя_оконч = 20.09.2006 10:38:46
ДатаВремя_оконч-ДатаВремя_начала = 01.01.1900 0:07:51

Т.е. часы, минуты, секунды вычисляются правильно,
А как избавиться от 01.01.1900, т.е. нужно чтобы было так:
ДатаВремя_оконч-ДатаВремя_начала = 0:07:51
Отправлен: 01.11.2006, 06:37
Вопрос задал: Пепеляев Александр Павлович (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Santana
Здравствуйте, Пепеляев Александр Павлович!
Вообще то 01.01.1900 в транзакте это ноль в формате даты. для извлечения времени можно использовать стандартные функции ... datepart и datename. Хотя в Вашем случае разницу дат я бы посоветовал вычислять фунцией datediff
Ответ отправил: Santana (статус: 7-ой класс)
Ответ отправлен: 01.11.2006, 10:48

Отвечает: Delph
Здравствуйте, Пепеляев Александр Павлович!

Существуют специальные функции, которые могут помочь Вам.
1) DateDiff (временная_единица, начальная_дата, конечная_дата),
где временная_единица = day, month или year - в зависимости от того, что Вам нужно (дни, месяцы или годы). Начальной и конечной датами проще всего указать столбцы таблицы, но можно использовать и функции дат (например, DateDiff (day, дата_заполнения, GetDate() ) вернёт, сколько дней назад что-то было заполнено).
2) Convert(нужный_тип, параметр) - явное приведение параметра к нужному Вам типу. Чаще всего испольуется в каком-нибудь выражении. Например, Вы хотите получить вычисляемый столбец, в котором будет что-то вроде "11 дней" - разница между датой заполнения анкеты и текущей датой. Можно написать так:
... Convert(VarChar(16), DateDiff(Day, Дата_заполнения, GetDate() ) ) + " дней" AS ...
GetDate() - стандартная функция, которая возвращает текущую дату. Тип DateDiff - целое число (Int), а реальное значение зависит от первого параметра (хотите получить разницу в месяцах - получите одно значение, хотите разницу в днях - будет другое, несколько большее...). После слова AS имеет смысл как-то осмысленно назвать результат вычисления, чтобы получить вычисляемый столбец, который затем можно использовать в программе (либо вообще опустить слово AS, но это уже плохой стиль программирования плюс масса неудобств). Если Вам это интересно, то я использовал эту технологию для создания вычисляемого столбца в представлении (VIEW), но с тем же успехом можно её применить и в обычном запросе.

То, что я сейчас написал, относится к SQL Server'у (точнее - к запросам к серверу при помощи SQL). Есть методы решения Вашей задачи и на уровне Delphi, если они Вам интересны - пишите в личку, подскажу. Только имейте ввиду: это не какие-нибудь стандартные функции, сразу дающие конечный результат (хотя стандартные функции тоже используются), а ручное программирование в соответствии с потребностями Вашей задачи.
Ответ отправил: Delph (статус: 2-ой класс)
Ответ отправлен: 01.11.2006, 16:47

Отвечает: Grigory
Здравствуйте, Пепеляев Александр Павлович!
Для вычисления разницы между двумя датами надо использовать функцию DATEDIFF:
SELECT ID_Обор,
ДатаВремя_начала,
ДатаВремя_оконч,
DATEDIFF(day,ДатаВремя_начала,ДатаВремя_оконч)
FROM Table
такой запрос вам даст разницу между двумя датами в днях. Можно получить и в годах и в месяцах, и в часах, и в минутах, и в секундах, и в миллисекундах, если подставить вместо day соответствующее значение параметра.
Вот приемлемые значения:
Year yy, yyyy
quarter qq, q
Month mm, m
dayofyear dy, y
Day dd, d
Week wk, ww
Hour hh
minute mi, n
second ss, s
millisecond ms
Ответ отправил: Grigory (статус: 4-ый класс)
Ответ отправлен: 01.11.2006, 21:19


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.37 от 04.10.2006
Яндекс Rambler's Top100

В избранное