Green-sell.info

Новые технологии
6 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Сравнение дат в access

Сравнение дат в access

как правильно задавать Дату и ДатуВремя в SQL запросах в Access? К БД подключаюсь при помощи ADO.. Не понятно мне вот что: При добавлении новой записи в таблицу, я делаю так:

Дата:

INSERT INTO table (t_date)
VALUE («27.10.2008»)

ДатаВремя:

INSERT INTO table (t_datetime)
VALUE («27.10.2008 21:30:00»)

Вобщем формат Даты и ДатыВремени такой.. И все работает..

А вот если нужно сравнить дату, например:

SELECT *
FROM table
WHERE table.t_datetime = «27.10.2008 21:30:00»

то уже возникает ошибка..


Stas © ( 2008-05-27 15:45 ) [1]

#27.10.2008 21:30:00# помоему так.


MsGuns © ( 2008-05-27 15:55 ) [2]

Использовать параметрические запросы


Anatoly Podgoretsky © ( 2008-05-27 15:58 ) [3]

> MsGuns (27.05.2008 15:55:02) [2]

Бесполезно сравнивать числа с плавающей запятой на абсолютную точность.


MsGuns © ( 2008-05-27 16:07 ) [4]

>Anatoly Podgoretsky © (27.05.08 15:58) [3]
>Бесполезно сравнивать числа с плавающей запятой на абсолютную точность.

А причем здесь «числа с плавающей запятой» ?


Dmitry_177 ( 2008-05-27 16:19 ) [5]

только не понятно еще, где-то накопал в интернете что нужно так: месяц/день/год хотя работает как я написал.. непонятно что-то..


Anatoly Podgoretsky © ( 2008-05-27 16:23 ) [6]

> MsGuns (27.05.2008 16:07:04) [4]

А в Акцесс хранится именно в этом формате, совпадает с TDateTime


MsGuns © ( 2008-05-27 16:40 ) [7]

>Dmitry_177 (27.05.08 16:19) [5]
>где-то накопал в интернете что нужно так: месяц/день/год хотя работает как я написал.. непонятно что-то..


palva © ( 2008-05-27 16:48 ) [8]

По правилам нужно так #месяц/день/год#
Если Access обнаруживает, что дата невалидная он пробует поменять местами месяц и день.


Anatoly Podgoretsky © ( 2008-05-27 16:52 ) [9]

> palva (27.05.2008 16:48:08) [8]

Когда меняет не страшно, страшно когда не меняет и ничего не говорит.


Dmitry_177 ( 2008-05-27 17:05 ) [10]

хм.. тут наверно может быть тогда ошибка..(((

вот к примеру наша дата 27.10.2008.. 27-го меся не бывает, поэтому меняет местами и все ок.. а будет такая 12.10.2008 дата? Access запишет ее как 12 октября или 10 декабря?


palva © ( 2008-05-27 18:27 ) [11]


> Access запишет ее как 12 октября или 10 декабря?

Вы хотите, чтобы мы для вас попробовали?


Anatoly Podgoretsky © ( 2008-05-27 21:44 ) [12]

Пусть сначала моральный ущерб оплатит.


Правильный_Вася ( 2008-05-27 22:21 ) [13]

использовать параметры в запросах
тогда никаких многозначностей не будет


Dmitry_177 ( 2008-05-28 11:14 ) [14]

Еще вопрос.. А как сравнить ДатаВремя с Датой?

ДатаВремя — 27.10.2008 21:30:00
и Дата — 27.10.2008

вот нужно сравнить только дату, попробовал сделать так:

SELECT * FROM table
WHERE t_datetime = #27/10/2008#

не сравнивается.. помогите


Правильный_Вася ( 2008-05-28 11:32 ) [15]


Dmitry_177 ( 2008-05-28 11:39 ) [16]

SELECT * FROM table
WHERE t_datetime BETWEEN (#27/10/2008 00:00:00#, #27/10/2008 23:59:59#)


Dmitry_177 ( 2008-05-28 11:40 ) [17]

т.е. так:
SELECT * FROM table
WHERE t_datetime BETWEEN #27/10/2008 00:00:00# AND #27/10/2008 23:59:59#


DiamondShark © ( 2008-05-28 14:19 ) [18]


> т.е. так:
> SELECT * FROM table
> WHERE t_datetime BETWEEN #27/10/2008 00:00:00# AND #27/10/2008
> 23:59:59#

Лучше так:
WHERE t_datetime >= #27/10/2008 00:00:00# AND t_datetime


Dmitry_177 ( 2008-05-28 23:59 ) [19]

А при добавлении записи:

INSERT INTO table (t_datetime)
VALUE («27.10.2008 21:30:00»)

правильней будет тоже месяц/день/год ?


Palladin © ( 2008-05-29 07:58 ) [20]

правильней (относительно) будет

q.SQL.Text:=»insert into table (t_datetime) values (:PDateTime)»;
q.Parameters.ParamByName(«PDateTime»).Value:=Date;
q.ExecSQL;

ну или то, что предложит sniknik :), но с тем же подходом с параметром.


Anatoly Podgoretsky © ( 2008-05-29 16:50 ) [21]

> Dmitry_177 (28.05.2008 11:40:17) [17]

Это не дает гарантии, что в условие попадут все записи за 27,10,2008 более того в текстовом виде вообще возможны разные сюрпризы.

Сравнение дат через Sql запрос

yuretz

Доброго времени суток!

Сразу оговорюсь, за программирование БД взялся недавно, поэтому просьба ногами не бить

Есть такая проблемка:

БД MSAccess (*.mdb), доступ до нее из delphi через ADO.

Подскажите пожалуйста текст SQL запроса для выборки по датам (больше, меньше, равна)

вот фрагментик кода, что в нем нужно поправить:

FizFind.Active:=false;
FizFind.SQL.Clear;
FizFind.SQL.Add(‘Select * from table’);
FizFind.sql.Add(‘WHERE’);
if FindDate.Text<>» then FizFind.SQL.Add(‘BirDate = ‘+FindDate.Text);
FizFind.active:=true;

сдесь FizFind — ADQQuery, FindDate — коомпонент TEdit, откуда берется значение для сравнения; BirDate — поле в таблице типа DateTime

В данном случае выскочит ошибка нессответствия типов данных, а как надо прописать, чтобы прошло сравнение?

Guest

yuretz

Пробовал кавычки, выдает «нессответствие типов данных в выражении условия отбора» оно и понятно, в общем-то, в кавычки обычно строковые переменные заключаются, а у меня поле DateTime

Других идей нет?

Shurikanin

Barmutik

_dimka_

Mistey

BirDate имеет тип ДАТА? Если база Акцесовская, то все просто. Сначала дату надо привести в американскому стандарту. Можно воспользоваться в этом случае фунцией Format, но у меня так ничего не получилось, и писала функцию сама. Это во-первых. А во-вторых: в Access в SQL-запросах дату необходимо заключать в символы «решетка». В итоге должно получиться: #mm/dd/yyyy#

Читать еще:  Как посчитать возраст в access

А вот базах dBase и FoxPro такая фишка не срабатывает. Так до сих пор там запрос по датам сделать не могу. Даже с помощью мастера.

Margo

Приветствую!
Решила не создавать новую тему, а воспользоваться уже существующей. 😆
У меня примерно таже проблема, но с тем условием что БД в MSSQL.
Как организовать сравнение дат через запрос?
Дату которую нужно сравнивать с табличной вводит юзер. (это параметры InqTime0 и InqTime1)

ADOQuery1.SQL.Add(‘SELECT Count(DISTINCT [№_изделия]) AS Count ‘);
ADOQuery1.SQL.Add(‘FROM Изделия ‘);
ADOQuery1.SQL.Add(WHERE ‘Время_начала_сборки BETWEEN’);
ADOQuery1.SQL.Add(QuotedStr(FormatDateTime(‘dd/mm/yyyy’,InqTime0))+’ AND’);
ADOQuery1.SQL.Add(QuotedStr(FormatDateTime(‘dd/mm/yyyy’,InqTime1)));
ADOQuery1.SQL.Add(‘ AND Время_окончания_сборки BETWEEN’);
ADOQuery1.SQL.Add(QuotedStr(FormatDateTime(‘dd/mm/yyyy’,InqTime0))+’ AND’);
ADOQuery1.SQL.Add(QuotedStr(FormatDateTime(‘dd/mm/yyyy’,InqTime1)));

Надеюсь на скорый ответ.

Margo

sax_ol
так и знала что будет подвох.

Параметры sql или delphi?

Margo

Margo

Margo

Margo

ммм. ложила. Вот что у меня получалось

ADOQuery1.SQL.Text := ‘SELECT Count(DISTINCT [№_изделия]) AS Count FROM Изделия WHERE Изделия.Время_начала_сборки >= »%’+InqTime0+’%» AND Изделия.Время_окончания_сборки

Margo

sax_ol
хорошо)
эммм. параметры..

ADOQuery1.SQL.Add(‘Время_начала_сбоки >=’);
ADOQuery1.SQL.ADD(‘:Q’);
ADOQuery1.Parameters.ParamByName(‘Q’).Value:= InqTime0;
ADOQuery1.SQL.Add(‘Время_окончания_сборки

Margo

sax_ol
Оно работает!
Ну наконец-то ))
Спасибо огромное))

Сравнение дат в access

GM>Server: Msg 242, Level 16, State 3, Line 1
GM>The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.

А как должен сервер понимать твою строку?
как ‘dd.mm.yyyy’, ‘mm.dd.yyyy’ или еще как-нибудь?

Если строка получается на клиенте, то рекомендую передавать параметры как datatime, а не как строку..

Если нужно иметь эту переменную на сервере, то
составь свою дату из кусочков используя DATEADD
(хотя можно конечно изменить строку на ‘03.31.2002’ и все заработает до первого изменения региональных настроек)

Здравствуйте Good Man, Вы писали:

GM>Строковый формат даты сравнивать недопустимо:

GM>IF (‘15.05.2002’ > ‘31.03.2002’)
GM>PRINT ‘Больше’
GM>ELSE
GM>PRINT ‘Меньше’

GM>Выдает значение: ‘Меньше’

вообще-то надо так:

GM>Server: Msg 242, Level 16, State 3, Line 1
GM>The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.
Логично, черт возьми. Он не может понять, как конвертить ‘31.03.2002’ в дату — надо указать стиль.

Здравствуйте Sinclair, Вы писали:

Какая выборка будет, производится быстрее в MS SQL 2000?

Предположим, что есть таблица «Table1». В таблице есть поле “DateField1” типа DateTime. Приведу два примера:

SELECT * FROM Table1
WHERE CONVERT(varchar, DateField1, 104) = ‘15.05.2002’

SELECT * FROM Table1
WHERE DateField1 = CONVERT(DATETIME, ‘2002-05-15 00:00:00’, 102)»;

В Access вообще нет необходимости заниматься конвертированием:

«…WHERE DateField1 = #05/15/02#…»

Конвертирование, при сравнении дат, должно сильно уменьшать скорость выборки данных в MS SQL 2000.

Здравствуйте Good Man, Вы писали:

GM>Здравствуйте Sinclair, Вы писали:

GM>Какая выборка будет, производится быстрее в MS SQL 2000?

GM>Предположим, что есть таблица «Table1». В таблице есть поле “DateField1” типа DateTime. Приведу два примера:

GM>SELECT * FROM Table1
GM>WHERE CONVERT(varchar, DateField1, 104) = ‘15.05.2002’

GM>SELECT * FROM Table1
GM>WHERE DateField1 = CONVERT(DATETIME, ‘2002-05-15 00:00:00’, 102)»;
Ясен пень — вариант 2 будет выполняться не медленнее, т.к. в нем преобразование выполняется лишь раз — в начале запроса. Использование непреобразованного значения поля позволяет оптимизировать запрос при помощи индексов. Суперумный сервер мог бы построить обратное преобразование в случае 1 и свести его к случаю 2. Например, запрос

легко сводится к

Но я сииильно сомневаюсь, что преобразование даты в строку может быть так соптимизировано хотя бы одним из существующих серверов. Даже запросы типа

и то выполняются фулл сканом.

GM>В Access вообще нет необходимости заниматься конвертированием:

GM>«…WHERE DateField1 = #05/15/02#…»

GM>Конвертирование, при сравнении дат, должно сильно уменьшать скорость выборки данных в MS SQL 2000.
Нет. Правильно эта фраза читается вот так:
Конвертирование при сравнении дат может сильно уменьшить скорость выполнения запроса в MS SQL 2000
Вариант 2, рассмотренный выше, выполняется не хуже, чем select * from t2 where int_field

Сравнение дат в access

есть база с таблицей где колонка eventdate1 содержит даты, в формате Text (2007/3/1, yy/mm/dd), надо въвести датъ которъе отвечают данному ********** SQL 1:2:3:4:SELECT *FROM events_backWHERE eventdate1>’2007/3/15’ORDER BY eventdate1;ну вот странная штука въводит и такие датъ : 2007/3/5, 2007/3/8, 2007/3/2Подскажите в чем тут дело?

строка 2007/3/5>2007/3/15,поэтому их и выбирает.Для корректной работы с датами поле должно иметь тип данных «Дата/время»

во первых рекомендую в запросе писать так: WHERE eventdate1>#2007/3/15# или WHERE eventdate1>cdate(‘2007/3/15’). Прописал но результат абсолютний ноль. За предложение спасибо, просто база не моя, я объчно колонку датъ в формате Date устанавливаю и проблем никаких, а сейчас все менять не реально – много записей. Интересно что, 2007/3/11 не въводит но въводит 2007/3/5, 2007/3/8, 2007/3/2 и др.Подскажите, будте так добръ:))

И что же теперь надо всю eventdate1 конвертить в «Дата/время»?

WHERE CDate(Format([date1],»dd/mm/yy»))>CDate(Format(‘2007/03/15’,»dd/mm/yy»));вот это точно работает, только что проверил

Ну это уж по желанию, я бы, конечно, сконвертировал или перенес в другое поле,чтобы не иметь в дальнейшем проблем. Можно и cdate(eventdate1) попробовать, толькопо вычисляемому полю выборки и сортировки медленнее будут.

Читать еще:  Типы данных в access

Вообще по сути надо делать все сразу нормально, а так я бы сейчас создал новое поле как надо и перенес из того текстового пля все данные как говориться «нужно сегодня думать о будущем»

Вообще по сути надо делать все сразу нормально, а так я бы сейчас создал новое поле как надо и перенес из того текстового пля все данные как говориться «нужно сегодня думать о будущем»

Сомнительно, вы проверьте свою конструкцию скажем на 1 декабря и на 12 января и сравните.

Сомнительно, вы проверьте свою конструкцию скажем на 1 декабря и на 12 января и сравните.

Лучше, конечно, использовать функции созданные для этого:CDate(FormatDateTime(eventdate1))

не совсем понял с Вашими датами если что поправьтевот данные в таблице:id date11 2006/12/012 2007/01/12вот запрос:SELECT tbl1.id, tbl1.date1FROM tbl1WHERE (((CDate(Format([date1],»dd/mm/yy»)))>CDate(Format(‘2006/12/01’,»dd/mm/yy»))));вот результат запроса:id date12 2007/01/12

Я вообще не понимаю зачем в запросе eventdate1 преобразовывать. Сравнивать-то надо значения. Другое дело как параметр передать – тут и нужно дату отформатировать в американский стандарт.». WHERE eventdate1 > » & «#» & Format(paramdate, «mm/dd/yy») & «#»

Я вообще не понимаю зачем в запросе eventdate1 преобразовывать. Сравнивать-то надо значения. Другое дело как параметр передать – тут и нужно дату отформатировать в американский стандарт.». WHERE eventdate1 > » & «#» & Format(paramdate, «mm/dd/yy») & «#»

‘2006/12/01’ – это какая дата? 12 января или 1 декабря. И как тут вы прикажете функции Format это понимать?

Вы самито попробуйте выполнить то что что написали WHERE eventdate1 > » & «#» & Format(paramdate, «mm/dd/yy») & «#».

а функции format прикажем понимать так как надо, иначе зачем ей второй параметр, и вообще эта функция ничего не понимает, а делает то что ей скажет программист, т.е. преобразовать текстовую строку в строку определенного формата – заданного вторым параметром, а преобразовывать мы будем так как заложено в логике клиента, если клиентское ПО заносит в базу строку с форматом «yyyy/m/dd» значит 2006/12/01 это 1 декабря 2006 года, а если клиентское ПО заносит в базу строку с форматом «yyyy/d/mm» значит 2006/12/01 это 12 января 2006 года.Компьютер делает не то что ты от него хочеш, а то что ты ему прикажешь.

Дык если eventdate1 – текстовое поле, то причем тут дата? В этом случае сравнивать-то можно только текстовые значения, ибо в eventdate1 можно записать что угодно. Тут или надо придерживаться строгих правил записи данных в eventdate1 или лучше вообще нормальное поле типа дата завести. Кстати, как вы сравнивате текст1>текст2? Не кажется ли вам странным такое выражение? единственно корректное сравнение тут может быть только текст1=текст2.

1214 просмотра

2 ответа

9 Репутация автора

Я знаю, что этот вопрос задавался несколько раз, но я думаю, что это немного уникально. У меня есть база данных MS Access с полем DateTime, которое мне нужно сравнить с датой> = ‘01.01.2016’ или любой другой датой по этому вопросу.

Мой основной запрос выглядит следующим образом

Чтобы сравнить с датами, я знаю, что нужно сделать ГДЕ время> = # 1/1/2016 #

Проблема в том, что сравнение Даты / Времени автоматически вводится в другое программное обеспечение, которое я запускаю, поэтому синтаксис не может быть изменен.

Все предложение WHERE вводится автоматически в зависимости от того, какое поле я указываю в качестве поля DateTime.

Я попробовал следующее

Это возвращает результаты, но, к сожалению, не правильно сравнивает дату. У кого-нибудь есть идеи, как мне это сделать? Любая помощь будет принята с благодарностью!

Соединение между программным обеспечением и базой данных в соединении ODBC, с включенным ANSI 92.

Ответы (2)

34865 Репутация автора

Правильно, весь оператор WHERE DTime> = ‘01.01.2016’ генерируется другим программным обеспечением и не может быть отредактирован.

Как уже заметил Брэд, это не Access SQL, поэтому он никогда не будет работать.

Единственный вариант – изменить запрос на сквозной запрос, который отправит следующее:

к SQL Server, который понимает синтаксис.

Автор: Gustav Размещён: 29.06.2016 10:45

1 плюс

1375 Репутация автора

Оператор SQL – это всегда String, последовательность символов. Это может быть строковая переменная или константа в коде VBA или SQL свойство объекта Query. В любом случае им можно манипулировать перед выполнением: в объекте Query:

Идея такова: если Access может запустить его, Access может изменить его заранее.
Если оператор не изменен, предложение будет сделано для String значений, а не DateTime значений.

В таблице столбцы date_in и date_out в виде «14.10.19»
Столбцы типа string

В программе получаю период, например, с «14.10.19» по «01.11.19»
Нужно выбрать строки, у которых date_in и date_out укладываются в выбранный интервал или если указана одна граница. Например, date_in то выбрать все, которые после этой даты

получаю строки у которых день месяца больше указанного, месяц и год игнорируются
можно написать и

и т.д. Но хотелось бы покороче.

1 ответ 1

У вас явно неверно спроектирована база данных. Выбор по диапазону дат из поля типа «строка» корректно невозможен без дополнительных преобразований. Для того, что бы избежать подобного, необходимо тип полей date_in и date_out изменить на «Дата и время» (для MS Access) через конструктор таблиц.

Читать еще:  Как вычислить возраст в access

После этого запрос на выборку по диапазону дат будет иметь достаточно короткий и очевидный вид:

Хочу отдельно обратить внимание на формат констант типа дата в запросе: для MS Access они должны быть строго в формате USA: #M/D/YYYY# , то есть, даты и месяц указываются без предстоящего нуля (не 01-31 и 01-12 , а 1-31 и 1-12 ), и месяц указывается перед датой. Разделитель – строго слеш / . Дата оборачивается с двух сторон в решетки # .

Типы данных в Access

Для того, чтобы обеспечить возможность хранения в базе данных разнообразной информации, Access предлагает большой набор типов данных, перечисленных в табл. 16.1.

ТАБЛИЦА 16.1 . Типы данных

Чтобы сделать работу со списком контактов более продуктивной, следует изменить типы данных некоторых полей.

1.В окне базы данных выделите таблицу Список и щелкните на кнопке Конструктор, расположенной в верхней части окна. Выбранная таблица откроется в режиме конструктора.

2. Описание контакта может быть достаточно длинным, а максимальная длина текстовых полей ограничена 256 символами. Поэтому измените тип поля Описание на поле MEMO.

3. Щелкните на поле Дата.

Рис. 16.14. Выбор формата данных в Access

4. Для удобства прочтения даты контакта измените формат ее отображения, выбрав в раскрывающемся списке Формат поля пункт Длинный формат даты, как показано на рис. 16.14.

Кроме типа данных и формата отображения вкладка Общие окна конструктора позволяет настроить некоторые дополнительные параметры поля, влияющие на способ ввода данных. Параметр Значение по умолчанию задает содержимое поля, которое записывается в новую запись в том случае, если пользователь не ввел в это поле никаких данных. Если вы регулярно обновляете список контактов, то дата контакта чаще всего будет совпадать с текущей датой. Чтобы упростить ввод информации, можно задать текущую дату в качестве значения по умолчанию для поля Дата.

5. Введите в поле Значение по умолчанию функцию Date, которая возвращает текущую дату. В некоторых случаях требуется не только задать тип данных поля, но и ограничить его возможные значения некоторым интервалом или более сложным правилом отбора. Такое правило вводится в поле Условие на значение. Предположим, вы точно знаете, что все контакты, которые будут заноситься в список, состоятся после 1 января 1999 г. Чтобы избежать ошибок, можно заставить Access сообщать вам о вводе неверной даты. Для этого выполните следующие шаги.

6. В поле Условие на значение щелкните на кнопке построителя выражений. Откроется окно диалога. Для задания условий или значений определенных параметров Access предлагает большой набор математических операций и функций. Построитель выражений помогает ориентироваться во всем многообразии функций Access. Верхнее прокручивающееся поле построителя содержит конструируемое выражение. Его можно изменять как путем непосредственного редактирования текста, так и с помощью других кнопок и списков построителя.

7. Необходимо, чтобы дата записи была позднее, то есть больше, даты 1 января 1999 г. Поэтому щелкните на кнопке >, чтобы добавить нужное условие.

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

8. Дважды щелкните на папке Функции в левом списке построителя выражений.

9. Щелкните на папке Встроенные функции, чтобы вывести список стандартных функций Access.

10. В среднем списке выберите категорию Дата/время.

11. Двойным щелчком на имени функции DateValue добавьте ее в поле выражения. Вместо местозаполнителя аргумента «stringexpr» нужно ввести конкретную дату в строковом формате.

12. В поле выражения щелчком выделите текст «stringexpr», а затем напечатайте «1.1.99».

13. Щелкните на кнопке ОК.

Рис. 16.15. Параметры поля Дата

14. В поле Сообщение об ошибке введите текст Неверная дата, который будет появляться при вводе даты, более ранней, чем 1 января 1999 г. Окончательный набор параметров поля Дата показан на рис. 16.15.

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

Давайте изучим влияние настроенных параметров на поведение базы данных.

16. Выделите таблицу Список в окне базы данных и щелкните на кнопке Открыть. Теперь все даты отображаются в длинном формате, а в ячейке Дата в строке новой записи автоматически появляется текущая дата.

17. Щелкните в ячейке Дата второй строки, измените ее содержимое на 19.11.95 и нажмите клавишу Tab, чтобы перейти к следующему полю. Так как модифицированная дата предшествует 1 января 1999 г., что противоречит настроенному условию, Access не позволит убрать курсор из текущей ячейки и откроет окно сообщения с текстом, введенным вами в поле Сообщение об ошибке конструктора таблицы на шаге 14. Такое сообщение будет появляться до тех пор, пока вы не скорректируете дату.

Ссылка на основную публикацию
Adblock
detector