Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle sql未读取整个字符串_Sql_Oracle_Date_Oracle11g - Fatal编程技术网

Oracle sql未读取整个字符串

Oracle sql未读取整个字符串,sql,oracle,date,oracle11g,Sql,Oracle,Date,Oracle11g,我有一个oracle sql查询来获取从2021年5月18日到2021年5月28日的日期 由于某些原因,斜杠后的值不会被读取,因为第4个月的值也会被输出。我不知道我错在哪里。如果你有能力,请帮帮忙,非常感谢你抽出时间 注意:日期已使用varchar数据类型存储在数据库中 SELECT datadate FROM mytable WHERE trailerid= '1' and datattime>'05:00:00' and datattime<'12:00:00' AND

我有一个oracle sql查询来获取从2021年5月18日到2021年5月28日的日期

由于某些原因,斜杠后的值不会被读取,因为第4个月的值也会被输出。我不知道我错在哪里。如果你有能力,请帮帮忙,非常感谢你抽出时间

注意:日期已使用varchar数据类型存储在数据库中

 SELECT datadate
 FROM mytable
 WHERE trailerid= '1'  and datattime>'05:00:00' and datattime<'12:00:00'
 AND datadate between '18/05/2021'  and '28/05/2021'
 GROUP BY datadate ORDER BY datadate;

当人们将日期值存储为字符串时,就会发生这种情况

看看这是否有帮助:

 AND to_date(datadate, 'dd/mm/yyyy') between to_date('18/05/2021', 'dd/mm/yyyy')  
                                         and to_date('28/05/2021', 'dd/mm/yyyy')

您不必重新开始,只需将数据移动到datetime列即可

ALTER TABLE t ADD x DATE;

UPDATE t SET x = to_date(concat(datadate,datatime), 'dd/mm/yyyyhh24:mi:ss'))
WHERE datadate in (SELECT to_char(to_date('1999-12-31', 'yyyy-mm-dd') + level, 'dd/mm/yyyy') FROM dual CONNECT BY level <= 10000)
然后删除datadate和datatime列,并将x重命名为datadatetime

现在,像BETWEEN这样的查询可以正常工作,如果您只需要日期部分,则可以执行TRUNC(x)。(您甚至可以切换到其他日期部分,如小时,以缩短分和秒,或一年中的一周,将日期舍入到一周的开始等)
如果您只需要执行
x-TRUNC(x)
的时间,它会给出一个十进制数字,如中午12点的0.5或下午6点的0.75,或者您可以根据您想要执行的操作来选择。在9.0/24.0和17.0/24.0之间执行
x-TRUNC(x)比执行字符串比较更好

嘿,谢谢你的回答,但它显示了一个错误:(这不是一个有效的匹配,正如我所说的那样——当人们将值存储为字符串时,就会发生这种情况。该列中的某些值不符合该日期格式,Oracle会引发错误。对此,除了查找和修复无效值外,您无能为力。一个简单但低效的方法是使用循环和存储(或显示)无效的行,以便您以后可以修复它们。您是否打算将
datadate
也包装在
to_date
中?我认为这就是您回答的全部要点。当然,@mathguy。谢谢。我应该尽量不要一次做几件事,结果非常糟糕:(这种格式的日期没有顺序,因为要比较日期,你需要先比较年,然后是月,然后是天。字符串中这部分的顺序不同。我不知道我错在哪里-就在你说的部分周围:日期已经用varchar数据类型存储在数据库中-不,不,不,不,不。修复这个基础我的问题和这个后果永远消失了嘿,谢谢,我之所以想尝试这个,是因为我在那个专栏里有大量的数据。现在看来我必须重新开始。谢谢你的回答如果你要坚持将日期存储为字符串,至少要将它们存储在yyyy-mm-dd中,这样在工作之间..你呢抱怨'18/05..'和'28/05..'之间的
返回04个日期,但字符串
19/04..
实际上介于两者之间,原因与“M/A”介于“L/Y”和“Z/Z”之间相同即使A不在Y和Z之间!老实说,添加另一个datetime类型的列、将数据复制到该列、删除旧列并将新列重新命名为旧列大约需要5分钟。另外,您的新的闪亮datetime列也可以存储datatime的内容。将日期存储为字符串也会弄乱优化器的统计信息,poten主要导致错误的执行计划虽然您的总体方法是合理的,但oracle中没有DATETIME数据类型。此应用程序的正确数据类型是DATE(ALTER TABLE t ADD x DATE;)更新,谢谢Ed
ALTER TABLE t ADD x DATE;

UPDATE t SET x = to_date(concat(datadate,datatime), 'dd/mm/yyyyhh24:mi:ss'))
WHERE datadate in (SELECT to_char(to_date('1999-12-31', 'yyyy-mm-dd') + level, 'dd/mm/yyyy') FROM dual CONNECT BY level <= 10000)
SELECT * FROM t WHERE x is null