Проблема с доступом к данным - PullRequest
2 голосов
/ 02 июля 2010

Я использую Access 2003. У меня есть таблица с некоторыми значениями даты в столбце текстовых данных, например:

May-97
Jun-99
Jun-00
Sep-02
Jan-04

Мне нужно преобразовать их в правильный формат даты и в другой столбец даты / времениИтак, создайте новые столбцы Дата / Время и просто обновите значения из столбца Текст в этот новый столбец.Сначала это выглядело хорошо, за исключением нескольких лет после 2000 года. Новые столбцы преобразовали даты следующим образом:

May-97 > 01/05/1997
Jun-99 > 01/06/1999
Jun-00 > 01/06/2000
Sep-02 > 01/09/2010
Jan-04 > 01/01/2010

Как вы можете видеть, любые данные за год после 2000 преобразуются в 2010 год.происходит, если я запрашиваю данные, используя FORMAT (dateString, "dd / mm / yyyy").

Есть идеи, почему это так?Должен ли я разделить месяц и год и объединить их снова?

Спасибо

Ответы [ 4 ]

2 голосов
/ 05 июля 2010

Access / Jet / ACE (и многие другие компоненты Windows) используют окно для интерпретации двухзначных лет.Для 00–29 предполагается 2000–2029, а для 30–99 - 1930–1999.Это было сделано для решения проблем совместимости с Y2K когда-то в период 1997-98 годов.

Я не разрешаю ввод двухзначного года в любом месте моих приложений.Из-за этого мне не нужно иметь какой-либо код для интерпретации того, что задумал пользователь (который может ошибаться).

Это также указывает на проблему независимости формата отображения и хранения данных.со значениями даты Jet / ACE.Хранение как двойное, с целочисленной частью, указывающей день с 30.12.1899, и десятичной частью временную часть в течение дня.Любая дата, которую вы введете, будет сохранена как одно число.

Если вы введете неполную дату (т. Е. Без указания века для года), ваше приложение должно сделать предположение относительно намерений пользователя.Окно 2029 является одним из решений проблемы двухзначного года, но, на мой взгляд, совершенно неуместно зависеть от него, потому что пользователь может изменить его в своих региональных настройках панели управления.Я не пишу какой-либо сложный код для проверки дат, я просто требую четырехзначного ввода года и полностью избегаю проблемы.Я делаю это с c.1998 год как само собой разумеющийся, и все к нему полностью привыкли.Несколько пользователей кричали тогда, и я использовал «это из-за 2000 года» как оправдание, которое закрыло их.Как только они привыкли, это стало проблемой.

1 голос
/ 02 июля 2010

Дата неоднозначна, поэтому она видит 02 как номер дня.В зависимости от вашей локали может подойти что-то вроде этого:

cdate("01-" & Field)

Однако лучше всего конвертировать в четырехзначный формат год, месяц, день, который всегда однозначен.

0 голосов
/ 04 июля 2010

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

Обратите внимание, что это не Access, а операционная система, выполняющая эту работу.Вы получаете те же результаты в Excel.У меня была интересная беседа с некоторыми сотрудниками Microsoft по этому вопросу, и это на самом деле OLEAUT32.DLL.

0 голосов
/ 02 июля 2010

Доступ, по-видимому, осуществляется между форматом MM-YYYY и форматом MM-DD.Не знаю, почему он делает это для дат после 2000 года, но решил это, преобразовав исходную строковую дату в полную дату (01-May-01).Теперь Access конвертирует год в 2001 вместо 2010 года.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...