Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.139.233.43] |
|
Данный раздел предназначается исключительно для обсуждения вопросов использования языка запросов SQL. Обсуждение общих вопросов, связанных с тематикой баз данных - обсуждаем в разделе "Базы данных: общие вопросы". Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ. |
Страницы: (3) [1] 2 3 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
На своём компе поставил MS SQL Server и в запросах из делфей использую следующий формат дат: yyyy-mm-dd, все работает, переношу прогу на другой компьютер, где в свою очередь, тоже стоит MS SQL Server с этой же базой, при попытке сделать запрос вылетает исключение - мол не могу конвертнуть дату, если же исправить формат даты на dd.mm.yyyy, то все пашет, но дома у меня так не работает. Короче, если кто-нить что-нить понял, объясните мне пожалуйста, как сделать "универсальный" формат даты?
|
Сообщ.
#2
,
|
|
|
Универсальный формат - "YYYYMMDD HH:MM:SS".
Ещё можно использовать команду "SET DATEFORMAT". В качестве аргумента передаётся "mdy", "ymd". А потом задавать дату в программе в соответствующем формате. Но эта команда действительна только внутри текущего коннекта. |
Сообщ.
#3
,
|
|
|
Цитата Lector @ 30.12.04, 11:35 Универсальный формат - "YYYYMMDD HH:MM:SS". Короче у меня на компе работает, а на другом нет! Там прокатывают даты только в формате dd.mm.yyyy, почему? Может это от языка зависит? |
Сообщ.
#4
,
|
|
|
самы безапасныи вариант, ползоватся параметрами.
можно восползоватся функциеи FormatDateTime('YYYYMMDD', Date) или в запросе восползоватся функциеи select CONVERT(varchar, GETDATE(), 112) |
Сообщ.
#5
,
|
|
|
Цитата Kobra @ 30.12.04, 12:55 самы безапасныи вариант, ползоватся параметрами. можно восползоватся функциеи FormatDateTime('YYYYMMDD', Date) Таки я ей и пользуюсь. У меня работает, а на другом компе - нет! |
Сообщ.
#6
,
|
|
|
ползуишся параметрами или ишеш в запрос отформатированую дату?
покажи код |
Сообщ.
#7
,
|
|
|
Цитата Kobra @ 30.12.04, 15:32 ползуишся параметрами или ишеш в запрос отформатированую дату? Шлюв запрос отформатированную дату. StrFmt(pszSQLQuery, 'select val, DateM from INTCELL where (DateM >= ''%s'' and DateM <= ''%s'') ' + 'and (%s) and (CounterId = %d) ORDER BY DateM ASC', [FormatDateTime('yyyy.mm.dd', dtpBegin.DateTime), FormatDateTime('yyyy.mm.dd', dtpEnd.DateTime), pszCells, lbCounters.ItemIndex + 1]); |
Сообщ.
#8
,
|
|
|
А DateSeparator у вас не разный ?
|
Сообщ.
#9
,
|
|
|
Цитата Bas @ 30.12.04, 16:04 А DateSeparator у вас не разный ? А кто его знает? Где это посмотреть? |
Сообщ.
#10
,
|
|
|
FormatDateTime('yyyymmdd', dtpBegin.DateTime) но честно сказать с параметрами работать на много безапаснее, тем более когда дело касается дат. так что я бы сделал так: pszSQLQuery.Close; pszSQLQuery.SQL.Clear; pszSQLQuery.SQL.Add('select val, DateM'); pszSQLQuery.SQL.Add('from INTCELL'); pszSQLQuery.SQL.Add('where DateM >= :D1 and DateM <= :D2'); pszSQLQuery.SQL.Add('and ' + pszCells + ' and CounterId = :P2' ); pszSQLQuery.SQL.Add('ORDER BY DateM ASC'); pszSQLQuery.ParamByName('D1').Value := dtpBegin.DateTime; pszSQLQuery.ParamByName('D2').Value := dtpEnd.DateTime; ... pszSQLQuery.ParamByName('P2').Value := lbCounters.ItemIndex + 1; pszSQLQuery.Open; pszCells - не понял что ето такое, так что написал как написал Добавлено кстати ету часть Цитата лудше писать такDateM >= :d1 and DateM <= :d2 Цитата DateM BETWEEN :d1 and :d2 |
Сообщ.
#11
,
|
|
|
pszSQLQuery и pszCells это у меня PChar'ы Ладно смысл понял, сейчас попробую...
Добавлено 1. У меня делфи говорит, что у ADOQuery нет метода ParamByName, по-идеи нужно привести его к TQuery, но хрен его знает как это делать на делфи, я на С++ пишу в основном. 2. Есть ли разница в использовании методов Open()/Close() и свойства Active? 3. Цитата Kobra @ 30.12.04, 16:40 кстати ету часть Цитата DateM >= :d1 and DateM <= :d2 лудше писать такЦитата DateM BETWEEN :d1 and :d2 Почему? Я так раньше писал, но мне больше нравиться когда видно включены ли границы интервала или нет. |
Сообщ.
#12
,
|
|
|
1.
ADOQuery.Parameters.ParamByName() 2. разницы нет. просто когда даю команду пишу Open/Close а когда проверяю открит или нет Active 3. BETWEEN быстрее. а так дело хазяиское |
Сообщ.
#13
,
|
|
|
Цитата Kobra @ 30.12.04, 18:00 3. BETWEEN быстрее. а так дело хазяиское А пачему и на скока? |
Сообщ.
#14
,
|
|
|
Цитата .alex @ 30.12.04, 18:34 А пачему и на скока? наверное потому что ета одна команда, подточенная под свою задачу, а не два. честно говоря не тестировал |
Сообщ.
#15
,
|
|
|
Цитата .alex @ 30.12.04, 08:53 1. У меня делфи говорит, что у ADOQuery нет метода ParamByName, по-идеи нужно привести его к TQuery, но хрен его знает как это делать на делфи, я на С++ пишу в основном. Примерно так: (это лучше чем использование строк) pszSQLQuery.Close; pszSQLQuery.SQL.Clear; pszSQLQuery.SQL.Add('select val, DateM'); pszSQLQuery.SQL.Add('from INTCELL'); pszSQLQuery.SQL.Add('where DateM >= :D1 and DateM <= :D2'); pszSQLQuery.SQL.Add('and ' + pszCells + ' and CounterId = :P2' ); pszSQLQuery.SQL.Add('ORDER BY DateM ASC'); pszSQLQuery.Parameters.ParseSQL(pszSQLQuery.SQL.text, true); pszSQLQuery.Parameters.ParamByName('D1').Value := dtpBegin.DateTime; pszSQLQuery.Parameters.ParamByName('D2').Value := dtpEnd.DateTime; ... pszSQLQuery.Parameters.ParamByName('P2').Value := lbCounters.ItemIndex + 1; pszSQLQuery.Open; |