为什么我收到错误消息 "Invalid number" 因为 UserID 是 NUMBER
Why I get error message "Invalid number" since UserID is NUMBER
我有点困惑,不知道我哪里弄错了。
SELECT uta.StartDate, uta.EndDate FROM user_timesheets_absence uta
WHERE uta.UserID = 353
AND uta.Approved = 'true'
AND '2020-03-06' BETWEEN TO_DATE(uta.StartDate,'YYYY-MM-DD') AND TO_DATE(uta.EndDate,'YYYY-MM-DD') + INTERVAL '1' DAY
在以下查询中出现错误
ORA-01722: invalid number
我试图理解错误在哪里,但是当我更深入地查询时,我看不出错误在哪里。
ABSENCETYPE VARCHAR2(255 CHAR)
ANSWER VARCHAR2(500 CHAR)
APPROVED NUMBER(10,0)
COMMENT_ CLOB
DAYS NUMBER(10,0)
ENDDATE VARCHAR2(50 CHAR)
ISANSWERED NUMBER(10,0)
ISREJECTED NUMBER(10,0)
STARTDATE VARCHAR2(50 CHAR)
USERABSENCEID NUMBER(10,0)
USERHASSEEN VARCHAR2(500 CHAR)
USERID NUMBER(10,0)
WIDTH NUMBER(10,0)
当我向 table 中插入数据时,我使用了这种数据并且工作正常。但是当我使用 SELECT 语句时,我得到了错误。我希望错误是 UserID,但事实并非如此。
Insert into DB.USER_TIMESHEETS_ABSENCE (ABSENCETYPE,ANSWER,APPROVED,DAYS,ENDDATE,ISANSWERED,ISREJECTED,STARTDATE,USERABSENCEID,USERHASSEEN,USERID,WIDTH) values ('1','ne',0,8,'2020-02-06',1,1,'2020-01-30',89,'1',348,160);
谁能告诉我,我哪里弄错了?这里有什么问题?
为什么 STARTDATE 和 ENDDATE 定义为字符串而不是 date
。不使用正确的数据类型肯定会引入数据损坏问题。这当然是我要开始寻找的地方。
另一件事是,在将字符串转换为日期(或数字)时始终使用显式转换,反之亦然。在这种情况下,您应该使用日期文字。而不是
AND '2020-03-06' BETWEEN TO_DATE(uta.StartDate,'YYYY-MM-DD') AND TO_DATE(uta.EndDate,'YYYY-MM-DD')
使用
AND date '2020-03-06' BETWEEN TO_DATE(uta.StartDate,'YYYY-MM-DD') AND TO_DATE(uta.EndDate,'YYYY-MM-DD')
如果您的日期列中有数据损坏并且您使用的是 12c 或更高版本,您可以使用 VALIDATE_CONVERSATION 来过滤不包含有效日期的行:
SELECT uta.StartDate, uta.EndDate FROM user_timesheets_absence uta
WHERE uta.UserID = 353
AND uta.Approved = 'true'
AND validate_conversion(uta.StartDate,'YYYY-MM-DD') = 1
AND validate_conversion(uta.EndDate,'YYYY-MM-DD') = 1
AND date '2020-03-06' BETWEEN TO_DATE(uta.StartDate,'YYYY-MM-DD') AND TO_DATE(uta.EndDate,'YYYY-MM-DD') + INTERVAL '1' DAY
您还可以使用它来查找无效的日期字符串:
SELECT *
FROM user_timesheets_absence uta
WHERE validate_conversion(uta.StartDate,'YYYY-MM-DD') = 0
OR validate_conversion(uta.EndDate,'YYYY-MM-DD') = 0
此查询中存在不止一个问题。
首先,这里:
AND uta.Approved = 'true'
approved
是一个数字,但您将它与字符串 'true' 进行比较。这是行不通的。在等号右侧使用文字数字。
然后,这里:
AND '2020-03-06'
BETWEEN TO_DATE(uta.StartDate,'YYYY-MM-DD')
AND TO_DATE(uta.EndDate,'YYYY-MM-DD') + INTERVAL '1' DAY
您正在将字符串与日期进行比较。这行不通。您可能想要 between
左侧的文字日期。我还建议使用 + 1
而不是间隔语法,它应该保留给 timestamp
s:
AND DATE '2020-03-06'
BETWEEN TO_DATE(uta.StartDate,'YYYY-MM-DD')
AND TO_DATE(uta.EndDate,'YYYY-MM-DD') + 1
我有点困惑,不知道我哪里弄错了。
SELECT uta.StartDate, uta.EndDate FROM user_timesheets_absence uta
WHERE uta.UserID = 353
AND uta.Approved = 'true'
AND '2020-03-06' BETWEEN TO_DATE(uta.StartDate,'YYYY-MM-DD') AND TO_DATE(uta.EndDate,'YYYY-MM-DD') + INTERVAL '1' DAY
在以下查询中出现错误
ORA-01722: invalid number
我试图理解错误在哪里,但是当我更深入地查询时,我看不出错误在哪里。
ABSENCETYPE VARCHAR2(255 CHAR)
ANSWER VARCHAR2(500 CHAR)
APPROVED NUMBER(10,0)
COMMENT_ CLOB
DAYS NUMBER(10,0)
ENDDATE VARCHAR2(50 CHAR)
ISANSWERED NUMBER(10,0)
ISREJECTED NUMBER(10,0)
STARTDATE VARCHAR2(50 CHAR)
USERABSENCEID NUMBER(10,0)
USERHASSEEN VARCHAR2(500 CHAR)
USERID NUMBER(10,0)
WIDTH NUMBER(10,0)
当我向 table 中插入数据时,我使用了这种数据并且工作正常。但是当我使用 SELECT 语句时,我得到了错误。我希望错误是 UserID,但事实并非如此。
Insert into DB.USER_TIMESHEETS_ABSENCE (ABSENCETYPE,ANSWER,APPROVED,DAYS,ENDDATE,ISANSWERED,ISREJECTED,STARTDATE,USERABSENCEID,USERHASSEEN,USERID,WIDTH) values ('1','ne',0,8,'2020-02-06',1,1,'2020-01-30',89,'1',348,160);
谁能告诉我,我哪里弄错了?这里有什么问题?
为什么 STARTDATE 和 ENDDATE 定义为字符串而不是 date
。不使用正确的数据类型肯定会引入数据损坏问题。这当然是我要开始寻找的地方。
另一件事是,在将字符串转换为日期(或数字)时始终使用显式转换,反之亦然。在这种情况下,您应该使用日期文字。而不是
AND '2020-03-06' BETWEEN TO_DATE(uta.StartDate,'YYYY-MM-DD') AND TO_DATE(uta.EndDate,'YYYY-MM-DD')
使用
AND date '2020-03-06' BETWEEN TO_DATE(uta.StartDate,'YYYY-MM-DD') AND TO_DATE(uta.EndDate,'YYYY-MM-DD')
如果您的日期列中有数据损坏并且您使用的是 12c 或更高版本,您可以使用 VALIDATE_CONVERSATION 来过滤不包含有效日期的行:
SELECT uta.StartDate, uta.EndDate FROM user_timesheets_absence uta
WHERE uta.UserID = 353
AND uta.Approved = 'true'
AND validate_conversion(uta.StartDate,'YYYY-MM-DD') = 1
AND validate_conversion(uta.EndDate,'YYYY-MM-DD') = 1
AND date '2020-03-06' BETWEEN TO_DATE(uta.StartDate,'YYYY-MM-DD') AND TO_DATE(uta.EndDate,'YYYY-MM-DD') + INTERVAL '1' DAY
您还可以使用它来查找无效的日期字符串:
SELECT *
FROM user_timesheets_absence uta
WHERE validate_conversion(uta.StartDate,'YYYY-MM-DD') = 0
OR validate_conversion(uta.EndDate,'YYYY-MM-DD') = 0
此查询中存在不止一个问题。
首先,这里:
AND uta.Approved = 'true'
approved
是一个数字,但您将它与字符串 'true' 进行比较。这是行不通的。在等号右侧使用文字数字。
然后,这里:
AND '2020-03-06'
BETWEEN TO_DATE(uta.StartDate,'YYYY-MM-DD')
AND TO_DATE(uta.EndDate,'YYYY-MM-DD') + INTERVAL '1' DAY
您正在将字符串与日期进行比较。这行不通。您可能想要 between
左侧的文字日期。我还建议使用 + 1
而不是间隔语法,它应该保留给 timestamp
s:
AND DATE '2020-03-06'
BETWEEN TO_DATE(uta.StartDate,'YYYY-MM-DD')
AND TO_DATE(uta.EndDate,'YYYY-MM-DD') + 1