Сравнение значения даты из БД с датой литерала

1

Я получаю значение даты из базы данных DB2, используя объекты ADODB. Эта дата иногда устанавливается на 1/1/0001. Это недопустимое datetime в SQL Server. Мне нужно проверить это значение и установить его на действительную дату SQL Server (например, 1/1/1900). Объект, исходящий из ADODB, выглядит как time.struct_time. Какой лучший способ получить 1/1/0001 как объект time.struct_time и проверить его на равенство с тем же значением, что и база данных DB2?

РЕДАКТИРОВАТЬ:

Поэтому я понял, что происходит дальше. Я уже пробовал то, что предложил d0nut, но сравнение все еще не получилось. При печати в течение какого времени. time.strptime('1/1/0001', '%d/%m/%Y') возвращается, вы получаете 1/1/2001, а не 1/1/0001. Когда я пытаюсь вызвать time.asctime(timeFromDb2) (даже с допустимыми значениями даты из БД), я получаю это сообщение об исключении: argument must be 9-item sequence, not time. Я предполагаю, что объект time который я получаю из БД, недействителен, но поскольку этот сценарий ничего не делает с ним, кроме передачи его другому объекту ADODB Recordset, подключенному к SQL Server, все работает. У кого-нибудь есть предложения о том, куда идти отсюда? Код, который извлекает дату из DB2 и сохраняет ее в БД SQL Server, вставлен ниже. Это работает в течение многих лет до сегодняшнего дня, когда мы начали получать значение 1/1/0001 из DB2. объекты Inventory and Coils создаются с помощью вызова win32com.client.Dispatch("ADODB.Recordset")

self.Inventory.Fields("promised_date").Value   = self.Coils.Fields("csaxdz").Value
  • 0
    Я не думаю, что time.struct_time может быть до 1 time.struct_time .
  • 0
    Как мне проверить тип переменной? Я могу добавить любые сообщения журнала, которые я хочу, к сценарию.
Показать ещё 5 комментариев
Теги:
date
adodb

2 ответа

1

Вы должны либо иметь возможность преобразовать его в строку:

time.strftime('%d/%m/%Y', badtimeobj)

и сравните его так, или

try:
    time.asctime(timeFromDb2)
except:
    invalid = True
else:
    invalid = False

или эквивалент, если все остальные даты работают в asctime.

  • 0
    Он уже планировал отправиться в маршрут исключения, но ДЕЙСТВИТЕЛЬНО хотел знать, что, черт возьми, происходит сейчас ...
  • 0
    Кроме того, эти два вызова (не могут выполнять возврат строки в комментариях) baddate = time.strptime("1/1/0001", "%m/%d/%Y") и LogMessage(baddate.strftime('%m/%d/%Y')) результат этого исключения 'time.struct_time' object has no attribute 'strftime'
Показать ещё 2 комментария
0
>>> time.strptime('1/1/0001', '%d/%m/%Y')
time.struct_time(tm_year=1, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=1, tm_isdst=-1)

Это даст вам структуру, которую вы сможете легко сравнить.

  • 0
    Это, я только что выяснил, вызвав baddate = time.strptime("1/1/0001", "%m/%d/%Y") затем LogMessage(time.asctime(baddate)) печатает Mon Jan 01 00:00:00 2001 , что указывает на то, что первый комментарий agf был верным. Если я вызываю LogMessage(time.asctime(datefromDb2)) , я получаю следующее исключение: при Updating inventory argument must be 9-item sequence, not time . Вы точно знаете, что это значит?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню