我是SQL的新手,尤其是Oracle。
我创建了一个日期=>的集合日期由日期(i)
组成我有一个表表,其列日期和收入。
当我进行查询时
select sum(revenue) from table where date between to_date(date(i),'dd-mm-yyyy') and to_date(date(i+1),'dd-mm-yyyy')
我无法获得正确的数字=>这些值小于正确值。
当我做
select sum(revenue) from table where date>=date(i) and date<=date(i+1)
不同的故事=&gt;我收到空值。
仅
command = SCRIPT + " R > " + OUT_FILE + " 2>/dev/null &"
subprocess.call(command, shell=True)
while(True):
if OUT_FILE is modified
do something on OUT_FILE
效果很好。
但为什么?
答案 0 :(得分:2)
为什么要将DATE
值转换为DATE
值?
当您执行to_date(date(i),'dd-mm-yyyy')
时,会发生以下情况:
使用当前date(i)
格式将日期值NLS_DATE_FORMAT
隐式转换为字符串。
然后使用格式DATE
dd-mm-yyyy
值
醇>
因此,如果偶然,您当前的NLS_DATE_FORMAT
格式等于dd-mm-yyyy
,那么您的查询就会有效。
或者,为了使其正常运行,请在运行查询之前执行ALTER SESSION SET NLS_DATE_FORMAT = 'dd-mm-yyyy';
。但是,将DATE值转换为DATE值是一个愚蠢而无用的想法。
答案 1 :(得分:0)
您的收藏中的变量已经是日期,您可以将它们再次转换为日期(这是您永远不应该做的事情)。将DATE转换为DATE时,Oracle先前使用默认日期格式掩码将变量转换为字符串。你可以看到你的:
SELECT value
FROM nls_session_parameters
WHERE parameter = 'NLS_DATE_FORMAT'
就我而言,我的日期格式为DD-MM-RR
。因此,如果我将日期01-01-2015再次转换为日期,它将按照以下方式转换:
1. It will be implicitly converted into a string using the DD-MON-RR mask. I would get 01-01-15.
2. Then, it will convert the string 01-01-15 into a date using the mask you provide (dd-mm-yyyy). In this case, to_date('01-01-15','dd-mm-yyyy') will return 01-01-0015.
这可能是您在查询中未获得任何结果的原因:
select sum(revenue) from table where date between to_date(date(i),'dd-mm-yyyy') and to_date(date(i+1),'dd-mm-yyyy')
如果您使用了&#39; dd-mm-rrrr&#39;相反,它会将字符串01-01-15转换为01-01-2015,您的查询可能会返回某些内容。我不知道,这取决于你收藏中的日期。
答案 2 :(得分:0)
日期值还包含时间。因此,两个日期只有在包含同一天且时间相同时才相等。
所以当你比较&#34; 17-11-2015 07:15:00&#34;与&#34; 17-11-2015&#34;它不会是平等的。
这将说明在您的语句中返回的行数少于预期:
where date between date(i) and date(i+1)
日期(加时间)可能大于日期(i + 1),即使日期相同。
如果您对时间组件不感兴趣,请使用trunc()函数来消除时间组件。所以你可以写:
select sum(revenue) from table where trunc(date) between date(i) and date(i+1)
(我认为那个日期(i)没有时间)。