Вопрос № 60846: Здравствуйте уважаемые эксперты.
С MS SQL мало знаком поэтому немогу сделать одну вещь:
Моя программа Delphi с помощью SQL -запроса выбирает данные из таблицы на MS SQL-сервере.
Запрос в программе составил так:
SELECT ID_Обор, Да...
Вопрос № 60.846
Здравствуйте уважаемые эксперты.
С MS SQL мало знаком поэтому немогу сделать одну вещь:
Моя программа Delphi с помощью SQL -запроса выбирает данные из таблицы на MS SQL-сервере.
Запрос в программе составил так:
SELECT ID_Обор, ДатаВремя_начала, ДатаВремя_оконч, ДатаВремя_оконч-ДатаВремя_начала
FROM Table
Т.е. часы, минуты, секунды вычисляются правильно,
А как избавиться от 01.01.1900, т.е. нужно чтобы было так:
ДатаВремя_оконч-ДатаВремя_начала = 0:07:51
Отвечает: 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