'[pervasive][интерфейс ODBC Engine]Неверное значение даты, времени или метки времени" При попытке сравнить даты

Я не могу пройти мимо этой ошибки.

У меня есть поле даты, хранящееся в формате mmddyy.

Я хочу возвращать только записи с датой после 31.12.2019.

Я понимаю, что Pervasive по умолчанию использует гггг-мм-дд.

Я переформатирую дату с помощью этого кода:

Convert(Concat('20',Concat(Right(Date,2),Concat('-',Concat(Left(Date,2),Concat('-',Substring(Date)))))),SQL_DATE)

Значение даты 081820 возвращает 44061.

Convert('2019-12-31',SQL_DATE)

возвращает 43830.

And Convert(Concat('20',Concat(Right(Order_Header.Date_Shipped,2),Concat('-',Concat(Left(Order_Header.Date_Shipped,2),Concat('-',Substring(Order_Header.Date_Shipped,3,2)))))),SQL_DATE) > Convert('2019-12-31',SQL_DATE)

возвращается

[pervasive][ODBC Engine Interface]Invalid date, time or timestamp value

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


person James Marshall    schedule 18.08.2020    source источник


Ответы (1)


В ваших данных могут быть значения, недопустимые для даты. Вам, вероятно, следует проверить записи. Спецификация даты требует месяца от 1 до 12, дня от 1 до 31 в зависимости от месяца (поэтому 30 февраля будет недействительным) и года от 0000 до 9999. Что-то вроде этого для месяцев, вы хотите проверить также дни:

insert into sodate (f1) values ('442020');
insert into sodate (f1) values ('  2020');
select f1, left(f1,2) from sodate where left(f1,2) not in ('01','02','03','04','05','06','07','08','09','10','11','12')

В substring в первом примере отсутствуют параметры. Получив дату в правильном формате ('гггг-мм-дд'), вы сможете сравнить ее со значением даты, не преобразовывая ее в тип данных SQL_DATE. Еще одна вещь: вы добавляете «20» перед всеми годами, что произойдет, если ваши данные датируются до 2000 года? Вам нужно будет учитывать это. В PCC, когда я запускаю:

select Convert('2019-12-31',SQL_DATE)

Я получил:

    EXPR_1
==========
12/31/2019

Я использовал следующее:

create table sodate (f1 char(6));
insert into sodate (f1) values ('123119');
insert into sodate (f1) values ('081818');
insert into sodate (f1) values ('081820');
insert into sodate (f1) values ('082020');
select * from sodate;

-- This should give the results you want
select concat(concat(concat(concat(concat('20',right(f1, 2)),'-'),left(f1,2)),'-'),substring(f1,3,2)) from sodate where
concat(concat(concat(concat(concat('20',right(f1, 2)),'-'),left(f1,2)),'-'),substring(f1,3,2)) > '2019-12-31';
-- This query shows you don't need the CONVERT to compare a date.  
select concat(concat(concat(concat(concat('20',right(f1, 2)),'-'),left(f1,2)),'-'),substring(f1,3,2)) from sodate where

concat(concat(concat(concat(concat('20',right(f1, 2)),'-'),left(f1,2)),'-'),substring(f1,3,2)) › = сейчас()

И получил следующие результаты:

EXPR_1        
==============
2019-12-31    
2020-08-18  

и второй запрос дает:

EXPR_1        
==============
2020-08-20    
person mirtheil    schedule 18.08.2020
comment
Вы, сэр, легенда. Бог среди людей. За последние пару месяцев я изучил все тонкости PSQL, 99% из ваших комментариев на других сайтах. Я публикую здесь, и вы почти сразу же появляетесь с материалом, чтобы помочь мне взломать его. Моя логика переформатирования даты возвращала 8 строк с «2000-00-00». Добавьте заявление Case, мурлыкая, как котенок. - person James Marshall; 19.08.2020