如何在oracle中解决此选择写入错误?

如何在oracle中解决此选择写入错误?,oracle,Oracle,我想从2019年1月6日到2019年1月9日进行选择,但程序会返回其他范围,如显示图像 请记住,数据库中的日期字段是varchar2,我将其存储为dd/MM/yyyy格式 如果希望06/08值表示天数,请明确: BETWEEN TO_DATE('06/01/2019','DD/MM/YYYY') AND TO_DATE('09/01/2019','DD/MM/YYYY') 目前,它以月份形式返回06/08值,通常在比较日期列时使用 我强烈建议您使用to_date来避免歧义比较字符串与字符串、数

我想从2019年1月6日到2019年1月9日进行选择,但程序会返回其他范围,如显示图像

请记住,数据库中的日期字段是varchar2,我将其存储为dd/MM/yyyy格式


如果希望06/08值表示天数,请明确:

BETWEEN TO_DATE('06/01/2019','DD/MM/YYYY')
AND TO_DATE('09/01/2019','DD/MM/YYYY')
目前,它以月份形式返回06/08值,通常在比较日期列时使用

我强烈建议您使用to_date来避免歧义比较字符串与字符串、数字与数字、日期与日期-不要冒险混淆比较字符串与数字、日期与字符串


展开@user7294900的答案,当您将“日期”值存储为字符串时,必须将列值和目标范围值从字符串转换为实际日期

如果您这样做:

WHERE DATA_TRANSACAO BETWEEN '06/01/2019' AND '09/01/2019'
然后在列值和这些文本之间进行字符串比较,任何以“07”或“08”开头的字符串以及大多数以“06”开头的字符串都将被视为该范围的一部分。Oracle纯粹把它们当作字符串,它不知道或不在乎你有多少天和几个月的概念,或者你认为这个顺序是不同的。 如果您真的被字符串卡住了,那么您需要将比较的两面与日期进行比较:

WHERE TO_DATE(DATA_TRANSACAO, 'DD/MM/YYYY') BETWEEN TO_DATE('06/01/2019', 'DD/MM/YYYY')
  AND TO_DATE('09/01/2019', 'DD/MM/YYYY')
或使用ANSI文字:

WHERE TO_DATE(DATA_TRANSACAO, 'DD/MM/YYYY') BETWEEN DATE '2019-06-01' AND DATE '2019-01-09'
或者,如果有非午夜时间,这会更有用,但在您的数据中并非如此:

WHERE TO_DATE(DATA_TRANSACAO, 'DD/MM/YYYY') >= DATE '2019-06-01'
AND TO_DATE(DATA_TRANSACAO, 'DD/MM/YYYY') < DATE '2019-01-10' -- notice one day later

请阅读并接受答案,不要将日期存储为字符串!只是…不要。永远不会有好结果。谢谢@bobjarvisuer7294900谢谢你的回答。但它不起作用。请记住,数据库中我的日期字段是varchar2,我以dd/MM/yyyy@JoãoNzuzi不这样做,另存为日期,看起来您将其另存为MM/DD/yyyyythanks,以获取您的建议@user7294900谢谢Alex Poole。此日期数据在2019年1月6日、2019年1月9日、2019年1月6日、2019年1月9日和2019年1月9日之间的“DD/MM/yyyyy”之间传输,运行良好。
WHERE DATAHORA_TRANSACAO >= DATE '2019-06-01'
AND DATAHORA_TRANSACAO < DATE '2019-01-10' -- notice one day later