powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / SQL-запрос сравнения дат
18 сообщений из 18, страница 1 из 1
SQL-запрос сравнения дат
    #32405676
Ozerov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть аксесовская база test, поле даты Time (содержит к примеру 01.12.2001)

Dim d1 As Date
Option Explicit

Private Sub Command1_Click()
d1 = InputBox("vedite")
Data2.RecordSource = "Select sum(Obem) as f1 from test where (Time = " + " #" + d1 + "#" + ") "
Data2.Refresh
End Sub

Что-то селект не работает, пишет несоответствие типов.
Переменную d1 вводим, к примеру, в виде 01.11.2003
...
Рейтинг: 0 / 0
SQL-запрос сравнения дат
    #32405713
boevik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приведи дату к виду mm/dd/yyyy
...
Рейтинг: 0 / 0
SQL-запрос сравнения дат
    #32405803
Yuriy Goodz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня тот же вопрос (проблема).
Я сразу же поробовал привести дату к виду mm/dd/yyyy через функцию format(dDate,"mm/dd/yyyy"), но фиг там. дата все равно на выходе получается в том формате, который указан в системе (dd.mm.yyyy). да и вообще, формату доверять - себя не уважать. DateValue тоже дату дает в системном, русском формате (dd.mm.yyyy), так что SQL тоже на него ругается.
Решил это приведением дат в текстый вид.
... WHERE str(datevalue(Date))=str('" & datevalue(dDate) & "';".

В варианте текущего вопроса это может быть так:
"Select sum(Obem) as f1 from test where (str(datevalue(Time)) = str(" + DateValue(d1) + "));"


DateValue для обоих дат исползуется, чтобы они были точно приведены к одному виду (системному dd.mm.yyyy).

Запрос работает, данные выбираются правильно. Но хотелось бы задать вопрос к гуру - стоит ли так делать, или есть более ПРАВИЛЬНОЕ решение.
...
Рейтинг: 0 / 0
SQL-запрос сравнения дат
    #32405861
Ozerov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
:) Это-то понятно что в текстовый можно перевести и сравнить, думал что есть прямое решение, а не через...

Кстати, когда сравнение в текстовом формате, то дату надо приводить к сл. формату: год.месяц.день Иначе сравнение работать будет, но неправильно:)
...
Рейтинг: 0 / 0
SQL-запрос сравнения дат
    #32405871
Ozerov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...я имел ввиду что если знак не "=", а ">" или "<" использовать.
...
Рейтинг: 0 / 0
SQL-запрос сравнения дат
    #32405883
boevik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть несколько правил которые обнаружил при работе с SQL Server и Access
1. Дата на выходе всегда в системном формате.
2. Дата в SQL запросах передается в формате mm/dd/yyyy или yyyy-mm-dd.
3. Дата в Stored Procedured передается в системном формате.

В виду местной специфики никогда не приходилось передавать дату разделеную точками.

формату доверять - себя не уважать
Очень странное утверждение и не согласен с ним
...
Рейтинг: 0 / 0
SQL-запрос сравнения дат
    #32406083
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут весь корень проблемы состоит в том, что многие VB функции для работы с датой используют региональные настройки виндов и об этом никогда нельзя забывать.
Я уже сталкивался с программами, которые глючили при нестандратном формате даты в виндах (можно хоть такой поставить: 2004-11-24). Решение:
1. ср-вами API можно получить формат даты с разделителями или засунуть свою дату, а на выходе получить уже в текщем формате.
2. ср-вами VB:
2.1 Если вам надо получить текстовую строку нужного формата, а на руках у вас переменная типа Date, то используйте Format:
Format(Date,"mm/dd/yyyy")
2.2 Если у вас наоборот строка или в отдельных переменных день, месяц, год, тогда спасение функция DateSerial()
Dim d as Date

iDay=CInt(strDay)
iMon=CInt(strMon)
iYear=CInt(strYear)
d=DateSerial(iDay, iMon, iYear)

Ну и на последок, не забывать еще, что в VB в формате Date хранится дата вместе со временем. Так что если вы напишите d=Now(), то получите дату со временем и в:
If d=Date Then...
никогда не полчите True, потому что чистая дата Date будет не равна переменной d, в которой в дробной части лежит время в секундах с начала дня
...
Рейтинг: 0 / 0
SQL-запрос сравнения дат
    #32406169
Фотография PA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
d1 = InputBox( "vedite" ) 
Data2.RecordSource =  "Select sum(Obem) as f1 from test where (Time = "  & Format(d1, "\#mm\/dd\/yyyy\#" )
...
Рейтинг: 0 / 0
SQL-запрос сравнения дат
    #32411347
Yuriy Goodz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2PA
Проверил. Работает. А можно маленький коммент по обратным слэшам в Format(d1, "\#mm\/dd\/yyyy\#). В описании Format про это ничего не сказано.

Похоже, обратный слэш показывает, сто следующий символ не служебный. То е так?
...
Рейтинг: 0 / 0
SQL-запрос сравнения дат
    #32411355
Yuriy Goodz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2boebik

"Формату доверять себя не уважать."

Я о том, что функция полностью зависима от региональных настроек и если не указывать дополнительной информации то результаты работы программы на компах с разными настройками будут плачевными.
Например, Формат возвращает Variant и при том же сравнении будет приводить типы в соответствии со сравниваемыми переменными. Если в примере Time = " & Format(d1,"\#mm\/dd\/yyyy\#") Time будет string, то и результат Format тоже будет стрингом в сравнении. А если Time будет дата, то и результат Format будет сравниваться в Date типе. Таким образом имеет, что жестко зашив формат даты mm/dd/yyyy мы получаем полную ж;%у огурцов при обычном сравнении (а не в SQL) на системе с региональными настройками русскими или украинскими.

В общем тонкостей - вагон. На сайте Мелкософта есть отличная серия статей про борьбу с форматом Date. Там авторы также придерживаются мысли, что чем меньше Дату мы юзаем, тем меньше глюков мы имеем.
...
Рейтинг: 0 / 0
SQL-запрос сравнения дат
    #32411387
boevik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2Yuriy Goodz,

1. Можно ли получить ссылку на статьи о которых Вы упоминули.

2. Format не нужно использовать для сравнения дат, по моему я нигде и никогда не заявлял такого.
Основное приминение функции Format (для дат) это из системного формата даты получить требуемый.
К примеру, имея переменную типа Date (в системном формате) надо получить дату в американском формате. В этом случае функция Format просто не заменима
Код: plaintext
1.
Format(Now,  "mm/dd/yyyy" )


3. Для сравнения и работы с датами лучше использовать переменные типа Date. Для этого и существуют функции DateAdd, DateDiff и т.д.
...
Рейтинг: 0 / 0
SQL-запрос сравнения дат
    #32412095
Фотография PA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yuriy GoodzА можно маленький коммент по обратным слэшам в Format
Пожалуйста:
(\) Display the next character in the format string. To display a character that has special meaning as a literal character, precede it with a backslash (\). The backslash itself isn't displayed. Using a backslash is the same as enclosing the next character in double quotation marks. To display a backslash, use two backslashes (\\).
...
Рейтинг: 0 / 0
SQL-запрос сравнения дат
    #32412166
Фотография DIKI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да какие замороты с датами?
{ts 'yyyy-mm-dd hh:min:ss'}

Select sum(Obem) as f1 from test where (Time = {ts '" & Format(d1, "yyyy-mm-dd") & " 00:00:00'}"
...
Рейтинг: 0 / 0
SQL-запрос сравнения дат
    #32413442
Yuriy Goodz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2boevik

http://www.microsoft.com/Rus/Msdn/Activ/MSVB/Archive/Data/Default.mspx
...
Рейтинг: 0 / 0
SQL-запрос сравнения дат
    #32413477
Yuriy Goodz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 РА

Да, протупил. В описании User-Defined Numeric Formats (Format Function) есть и про backslash :(
Фэнкс
...
Рейтинг: 0 / 0
SQL-запрос сравнения дат
    #32413500
Yuriy Goodz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2DIKI

Навреное опять плохо ищу .. мне MSDN грит, что не знает он ничего про фигурные скобки ...не будет ли любезен многоуважаемый джин бросить в меня дескрипшином?
...
Рейтинг: 0 / 0
SQL-запрос сравнения дат
    #32413827
Фотография DIKI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/acdata/ac_8_con_03_04l0.asp
...
Рейтинг: 0 / 0
SQL-запрос сравнения дат
    #32418346
Yuriy Goodz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ага. Понятно. Это еще один промежуточный формат специально для ODBC и OLE DB.
Ну не знаю следует ли использовать еще один доп.промежуточный формат. Опыт подсказывает, что более простой код легче сопровождать самому в будущем. А все эти доп.навороты потом выливаются в дополнительные часы, которые тратятся на разбор той крутизны, которую сам же и наворотил. Я все-таки придерживаюсь линии - пусть код будет больше, но проще. "Синдром" тотальной оптимизации у меня прошлом уже давно. Время - деньги.

Но в любом случае спасибо за наводку. Будет полезно знать, если встретится когда-нибудь такая фича.
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / SQL-запрос сравнения дат
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]