Глюки при выборке по дате.

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
valdis000
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 23.09.2003 (Вт) 8:57

Глюки при выборке по дате.

Сообщение valdis000 » 01.04.2005 (Пт) 11:54

БД Access. В таблице есть поле типа ДАТА.
Данные заненсены только в период с 1.03.05 по 31.01.05.
А теперь проблема.
Выбираю данные с 1.04.05 по 30.04.05 - запрос возвращает данные за март. с 2 по 30.04.05 дает тоже. и т.д. до 4.
Запрос с 4-30.04.05 работает правильно. и такая же тема со всеми остальными месяцами.
К базе подключаюсь с помощью АДО.
Запрос такой:
"select distinct поле from таблица where дата between #" & D1.Value & "# and #" & D2.Value & "#;" дата формат dd/MM/yyyy.


И вопрос: как это побороть?
[/syntax]
Valdis000

Sedge
Alternative Choice
Alternative Choice
Аватара пользователя
 
Сообщения: 1049
Зарегистрирован: 16.05.2002 (Чт) 18:23
Откуда: Somewhere-In-The-Net

Сообщение Sedge » 01.04.2005 (Пт) 12:04

Попробуй скормить ему даты, преобразованные к yyyy-mm-dd

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 01.04.2005 (Пт) 12:16

mm/dd/yyyy
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 01.04.2005 (Пт) 12:27

Помоему катят оба варианта. Только даты надо заключать в шарпы (#).
Lasciate ogni speranza, voi ch'entrate.

valdis000
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 23.09.2003 (Вт) 8:57

Сообщение valdis000 » 04.04.2005 (Пн) 8:52

Таже тема. Во всех вариантах если в одной из дат стоит с 1-4 выборка неправильно идет.
Valdis000

Sedge
Alternative Choice
Alternative Choice
Аватара пользователя
 
Сообщения: 1049
Зарегистрирован: 16.05.2002 (Чт) 18:23
Откуда: Somewhere-In-The-Net

Сообщение Sedge » 04.04.2005 (Пн) 12:34

Чудеса.
1. Какова структура у таблицы (в частности - какой формат поля, в котором хранится дата)?
2. Что выводит debug.print D1.Value и debug.print D2.Value?

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 04.04.2005 (Пн) 19:23

Sedge писал(а):Какова структура у таблицы (в частности - какой формат поля, в котором хранится дата)?

Формат поля, в котором хранится дата, может быть только один - дата. А как это аксесс на экране показывает - это вообще дело десятое.
Код: Выделить всё
-- Все записи позже 3 апреля 2005 года 16:38
select *
from TableName
where datefield > '20050403 16:38:00'

Если вдруг аксесс не поддерживает одинарные кавычки - ну, что там для строк используется, двойные, видимо...

Sedge
Alternative Choice
Alternative Choice
Аватара пользователя
 
Сообщения: 1049
Зарегистрирован: 16.05.2002 (Чт) 18:23
Откуда: Somewhere-In-The-Net

Сообщение Sedge » 04.04.2005 (Пн) 22:07

Ennor писал(а):
Sedge писал(а):Какова структура у таблицы (в частности - какой формат поля, в котором хранится дата)?

Формат поля, в котором хранится дата, может быть только один - дата. А как это аксесс на экране показывает - это вообще дело десятое.

Гы. Совсем не то хотел спросить 8) Читай "какой тип у поля, в котором храниться дата". Хотя вот только что перечитал самый первый постинг - там написано что "Дата". Просто возникли подозрения, что стоит какой-нибудь char (или что там у нас в Access'е). Должны же откуда-то ноги у глюка расти.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 05.04.2005 (Вт) 1:18

Sedge писал(а):... Просто возникли подозрения, что стоит какой-нибудь char (или что там у нас в Access'е)...
Ой-е, только не это! Ты представляешь, как он будет сравнивать между собой два варчара? :shock:
Да, это имеет смысл уточнить у автора вопроса. А вообще, скрипт на таблицы не помешал бы, хотя в аксессе с этим могут быть траблы у новичка.

Sedge
Alternative Choice
Alternative Choice
Аватара пользователя
 
Сообщения: 1049
Зарегистрирован: 16.05.2002 (Чт) 18:23
Откуда: Somewhere-In-The-Net

Сообщение Sedge » 05.04.2005 (Вт) 9:50

Ennor писал(а):Ой-е, только не это! Ты представляешь, как он будет сравнивать между собой два варчара? :shock:

Вполне. Вообще, потягав данные из sql'ной базы 1С я уже начал дуть на воду :(

valdis000
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 23.09.2003 (Вт) 8:57

Сообщение valdis000 » 08.04.2005 (Пт) 11:10

Ennor писал(а):
Sedge писал(а):Какова структура у таблицы (в частности - какой формат поля, в котором хранится дата)?

Формат поля, в котором хранится дата, может быть только один - дата. А как это аксесс на экране показывает - это вообще дело десятое.
Код: Выделить всё
-- Все записи позже 3 апреля 2005 года 16:38
select *
from TableName
where datefield > '20050403 16:38:00'

Если вдруг аксесс не поддерживает одинарные кавычки - ну, что там для строк используется, двойные, видимо...


Нашел работающий вариант:
дату даю в запрос вот так: #yyyy-MM-dd# и он работает правильно.
а вот #dd/MM/yyyy# глючит и #yyyy/MM/dd# то же глючит.[/b]
Valdis000

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 08.04.2005 (Пт) 11:19

Ммм. Я бы все-таки дефисы попробовал убрать. Кстати, а как он воспримет, скажем, #2005-03-07# - как третье июля или все-таки седьмое марта? :)

МаринаМ
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 07.04.2005 (Чт) 19:00

Re: Глюки при выборке по дате.

Сообщение МаринаМ » 08.04.2005 (Пт) 11:51

valdis000 писал(а):Запрос такой:
"select distinct поле from таблица where дата between #" & D1.Value & "# and #" & D2.Value & "#;" дата формат dd/MM/yyyy.
[/syntax]


Ф-цию DateValue пробовал?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 08.04.2005 (Пт) 12:43

Ennor писал(а):Ммм. Я бы все-таки дефисы попробовал убрать. Кстати, а как он воспримет, скажем, #2005-03-07# - как третье июля или все-таки седьмое марта? :)

По ISO это именно DDDD-MM-YY, так что март.
Lasciate ogni speranza, voi ch'entrate.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 08.04.2005 (Пт) 21:30

Гы :). Так то по ISO... А у меня были реальные случаи, когда MSSQL 7.0 интерпретировал подобные записи произвольно - в основном это происходило в случае появления третьей локали в системе (сервер ставит америкос, прогу пишет русский, дату вводит мадьяр). И получался полный бред: для маски ввода "AA-BB-CCCC" сервак смотрел на значение АА и если оно было меньше 13, то считал его месяцем, а если больше - то днем. После такого, перефразируя Sedge, я не то что на воду дую - я к ней без порошкового огнетушителя не подхожу...

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 08.04.2005 (Пт) 22:20

ну на сиквеле все намного проще, можно заюзать ф-ю CONVERT в зависимости от вида даты и все будет ок,
а вот в акцессе, как правильно было замечено, дату нужно всегда передавать в виде #YYYY-MM-DD# и все будет тип-топ

Mao
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 95
Зарегистрирован: 10.10.2004 (Вс) 13:09

Сообщение Mao » 09.04.2005 (Сб) 10:32

WhereStr = "WHERE [Дата] >= #" & Month(DateValue('1.03.05')) & "/" & Day(DateValue('1.03.05')) & "/" & Year(DateValue('1.03.05')) & "# "
В таком ключе у меня все корректно пашет

PLA
Новичок
Новичок
 
Сообщения: 33
Зарегистрирован: 08.04.2005 (Пт) 16:09
Откуда: Москва

Сообщение PLA » 15.04.2005 (Пт) 15:07

Резюме:
1)Дата в SQL запросе для БД Access берется всегда в решетки -#Дата#
2)Формат даты yyyy/MM/dd
3)Разделитель года, месяца, дня брать из настроек Виндуса "Язык и стандарты".

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 15.04.2005 (Пт) 17:09

PLA писал(а):3)Разделитель года, месяца, дня брать из настроек Виндуса "Язык и стандарты".

На какой машине - сервере или клиенте? То-то и оно...

PLA
Новичок
Новичок
 
Сообщения: 33
Зарегистрирован: 08.04.2005 (Пт) 16:09
Откуда: Москва

Сообщение PLA » 15.04.2005 (Пт) 18:18

Естественно сервере, т.к. он обрабатывает SQL запрос.

Но можно для облегчения создать связанные таблицы в БД Access на компьютере клиента и тогда формат брать из клиентских настроек.

Отступление.
В MSDN про формат даты нашел следующие:

Date Setting Date Format
AMERICAN mm/dd/yy
ANSI yy.mm.dd
BRITISH/FRENCH dd/mm/yy
GERMAN dd.mm.yy
ITALIAN dd-mm-yy
JAPAN yy/mm/dd
TAIWAN yy/mm/dd
USA mm-dd-yy
MDY mm/dd/yy
DMY dd/mm/yy
YMD yy/mm/dd
SHORT Short date format determined by the Windows Control Panel short date setting.
LONG Long date format determined by the Windows Control Panel long date setting.

При этом мягкотелые видимо не знают географии.
У них есть AMERICAN и USA формат.

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 15.04.2005 (Пт) 19:43

Ага, и еще совсем забыли про нас - dd.mm.yy :)
Моду создают модоки, а распространяют модозвоны.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 15.04.2005 (Пт) 23:30

hCORe писал(а):Ага, и еще совсем забыли про нас - dd.mm.yy :)
Наша раскладка идентична немецкой.

PLA писал(а):Естественно сервере, т.к. он обрабатывает SQL запрос.

Но можно для облегчения создать связанные таблицы в БД Access на компьютере клиента и тогда формат брать из клиентских настроек.
Я не знаю, как с этим обстоит дело в аксессе, но в случае сиквела, чем получить национальный формат даты на сервере, проще использовать нативный, указанный мной выше и понимаемый всегда однозначно.

Основная проблема тут в том, что сервер в общем случае не знает формата даты той страны, в которой он установлен. И не надо делать круглые глаза - вы в курсе, что, например, в Венгрии разделитель даты состоит из двух символов - точки и пробела? Ну а теперь найдите мне этот формат среди тех, которые перечислил PLA :). Как успехи? То-то же.

А теперь представьте себе русского программиста, который всю жизнь записывал дату в сто девятом формате, и чье начальство заключает контракт с мадьярами. Через некоторое время после сего знаменательного события его ставят перед фактом, что его программа, доселе отлично работавшая на русских виндах и русских серверах (под последним имеется в виду MSSQL, установленный на винду с русскими региональными настройками), в среднем через раз косячит по черному при отображении очередной даты - в зависимости от того, из чего и как формировался SQL-запрос в каждом конкретном случае.

В свое время я сам побывал в шкуре главного героя этой трагедии. Теперь, если нужно, я всегда пишу примерно так:
Код: Выделить всё
Format(DateVar, "yyyymmdd hh:mi:ss")

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.04.2005 (Сб) 8:54

Ennor, поэтому параметрические запросы рулят :)
Lasciate ogni speranza, voi ch'entrate.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 16.04.2005 (Сб) 11:47

Когда ты передаешь дату параметром, ты ее форматируешь как-то, верно? Она же строкой передается, а не как binary( 8 ) (в этом случае вылезли бы косяки с "началом времен" - оно везде разное, блин). Вот формат этой строки может быть сервером:
1. не понят (это в лучшем случае)
2. понят неправильно (ну, это штатная ситуация, надо понимать :) ).

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.04.2005 (Сб) 13:05

Ты не прав, Борис :)
Под параметрическим запросом я имею ввиду выполнение запроса не через Execute, а через объект Command (и задание параметров в коллекции Parameters, у членов которой есть свойство Type).
Lasciate ogni speranza, voi ch'entrate.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 16.04.2005 (Сб) 14:15

alibek писал(а):Ты не прав, Борис :)
Под параметрическим запросом я имею ввиду выполнение запроса не через Execute, а через объект Command (и задание параметров в коллекции Parameters, у членов которой есть свойство Type).

Все, вопросов нет :).

SK | Heaton
Обычный пользователь
Обычный пользователь
 
Сообщения: 63
Зарегистрирован: 16.08.2005 (Вт) 10:10

Сообщение SK | Heaton » 08.09.2005 (Чт) 10:01

Код: Выделить всё
Function sAmericanDateStyle(datDate As Date) As String
    sAmericanDateStyle = "#" & Format$(datDate, "mm.dd.yyyy") & "#"
End Function

Private Sub Command1_Click()
'îòêðûâàåì áàçó
Adodc1.ConnectionString = "Provider = Microsoft.Jet.OLEDB.4.0;Data Source=" + App.Path + "\DATA\data.mdb;Persist Security Info=False"
Adodc1.CommandType = adCmdText
'Ñîçäàåì çàïðîñ
d1 = "#" & Format$(CDate(DTPicker1.Value), "mm\/dd\/yyyy") & "#"
d2 = "#" & Format$(CDate(DTPicker2.Value), "mm\/dd\/yyyy") & "#"
Adodc1.RecordSource = "select * from data where date BETWEEN " + d1 + " and " + d2 + " "


у меня не получается... если я делаю запрос между с месяц1 до месяц1, тогда все ок. А если между с месяц1 до месяц2, тогда не получатся..
============================
Учимся кодить
============================

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 09.09.2005 (Пт) 8:24

Ennor писал(а):Основная проблема тут в том, что сервер в общем случае не знает формата даты той страны, в которой он установлен.


Вах да в чем проблем?

Для MS SQL сервера я дату даю в формате

'yyyymmyy' - Это всегда однозначно. В любой стране.

Можно, конечно и

'yyyy-mm-dd', но без тире короче, так что этот вариант не пользую ;)

Access требует заключение даты в # и наличие разделителя. В общем для него подходят варианты:

#yyyy-mm-dd# и #m/d/yyyy# - из них я предпочитаю первый.

Ennor писал(а): И не надо делать круглые глаза - вы в курсе, что, например, в Венгрии разделитель даты состоит из двух символов - точки и пробела? Ну а теперь найдите мне этот формат среди тех, которые перечислил PLA :). Как успехи? То-то же.


Да пофиг мне какой разделитель в Венгрии, вообще-то. В строку запроса я ставлю дату которая будет однозначно понята в любой стране.

А для вывода на формы/отчеты использую Named форматы. И все без проблем. В любой стране.

Ennor писал(а):Теперь, если нужно, я всегда пишу примерно так:
Код: Выделить всё
Format(DateVar, "yyyymmdd hh:mi:ss")


Надо сказать - пишешь правильно ;)
Только лучше после слова Format ставить $ и время не всегда нужно, но это частности... :lol:
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

SK | Heaton
Обычный пользователь
Обычный пользователь
 
Сообщения: 63
Зарегистрирован: 16.08.2005 (Вт) 10:10

Сообщение SK | Heaton » 12.09.2005 (Пн) 13:58

Andrey Fedorov писал(а):Access требует заключение даты в # и наличие разделителя. В общем для него подходят варианты:
#yyyy-mm-dd# и #m/d/yyyy# - из них я предпочитаю первый.


у меня всеравно не получается

Код: Выделить всё
Function sAmericanDateStyle(datDate As Date) As String
    sAmericanDateStyle = "#" & Format$(datDate, "yyyy-mm-dd") & "#"
End Function

Private Sub Command1_Click()
Adodc1.ConnectionString = "Provider = Microsoft.Jet.OLEDB.4.0;Data Source=" + App.Path + "\DATA\data.mdb;Persist Security Info=False"
Adodc1.CommandType = adCmdText
d1 = "#" & Format$(CDate(DTPicker1.Value), "yyyy-mm-dd") & "#"
d2 = "#" & Format$(CDate(DTPicker2.Value), "yyyy-mm-dd") & "#"
Adodc1.RecordSource = "select * from data where date BETWEEN " + d1 + " and " + d2 + " "
Adodc1.Refresh
============================
Учимся кодить
============================

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 12.09.2005 (Пн) 14:00

SK | Heaton писал(а):у меня всеравно не получается


Е-мое, ну какого типа у тебя d1 и d2 ???

И что получается в Adodc1.RecordSource - трудно глянуть???
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

След.

Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 1

    TopList