Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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
Sql 在oracle查询中混淆“截止日期”和“长期截止日期”之间的结果_Sql_Oracle_Date - Fatal编程技术网

Sql 在oracle查询中混淆“截止日期”和“长期截止日期”之间的结果

Sql 在oracle查询中混淆“截止日期”和“长期截止日期”之间的结果,sql,oracle,date,Sql,Oracle,Date,我有一个名为subscription的表,如下所示 desc subscription; Name Null Type --------------------- -------- ---------- SUBSCRIPTION_ID NOT NULL NUMBER(38) EXPIRATIONDATE DATE` SELECT subscription_id, expirationd

我有一个名为subscription的表,如下所示

desc subscription;

Name                  Null     Type       
--------------------- -------- ----------
SUBSCRIPTION_ID       NOT NULL NUMBER(38)
EXPIRATIONDATE                 DATE`
SELECT
  subscription_id,
  expirationdate
FROM subscription
WHERE subscription_id = 41919;

SUBSCRIPTION_ID        EXPIRATIONDATE          
---------------------- -------------------------
41919                  18-JAN-14 13:45:56 
和查询的输出,如下所示

desc subscription;

Name                  Null     Type       
--------------------- -------- ----------
SUBSCRIPTION_ID       NOT NULL NUMBER(38)
EXPIRATIONDATE                 DATE`
SELECT
  subscription_id,
  expirationdate
FROM subscription
WHERE subscription_id = 41919;

SUBSCRIPTION_ID        EXPIRATIONDATE          
---------------------- -------------------------
41919                  18-JAN-14 13:45:56 
我试图以不同的方式执行下面的查询

第一个查询返回一行:

第二个查询不返回任何行:

此处,上述两个where子句是相同的。第一个正在尝试使用to_date,第二个将long转换为date。但是当我看到output时,第一个返回一行,第二个不返回任何结果。 我无法找出“长到日期”转换在这里的区别

long-to-date之间的转换也是正确的。 从dual中选择trunc1389613102220/1000、0/24*60*60+至日期'01/01/1970','mm/dd/yyyy'

输出: 2014年1月13日11:38:22

从dual中选择Trunc138963780000/1000、0/24*60*60+至日期'01/01/1970','mm/dd/yyyy'

输出: 2014年1月13日18:30:00


有人能帮我理解第一次查询和第二次查询之间的区别吗?

检查通过查询DBMS\u Xplan生成的解释计划的完整输出,它将向您显示由于计算这些常量而在内部使用的值。这可能表明存在意外的数据类型转换。

问题实际上不是基于历元的查询,而是表中的数据以及在某种程度上为非历元版本构建日期的方式。您使用的是2位数年份和4位数格式掩码。当您在过滤器中使用“截止日期”时,您实际使用的是0014年,而不是2014年;您可以通过转换字符串值看到,但显示四位数年份的结果:

select to_char(to_date('13-JAN-14 11:38:22', 'dd/mm/yyyy hh24:mi:ss'),
  'YYYY-MM-DD HH24:MI:SS') as test_date
from dual;

TEST_DATE         
-------------------
0014-01-13 11:38:22 
关键的部分是您正在使用格式模型YYYY转换14。作为:

数字元素用前导零填充到元素的宽度 元素允许的最大值。例如,yyy元素 填充为长度为“9999”的四位数字

虽然这一部分主要是关于to_char,但同样的情况也适用于to_date。当您对日期'14','YYYY'执行此操作时,它被解释为对日期'0014','yyy'。您可以使用RRRR,或者RR,因为您只提供了一年中的两位数字,这两位数字中的任何一位都可以为您提供2014年;但最好是直言不讳

看起来您在插入过程中也这样做了,因为如果记录41919的过期日期也是0014,那么您的第一个查询将只找到该记录

当您使用历元时间戳转换时,您实际上得到的是2014,因此您的记录实际上不在该范围内

要确认这一点,请在初始查询中指定一个格式模型,其中包含全年:

select subscription_id,
  to_char(expirationdate, 'YYYY-MM-DD HH24:MI:SS') as expirationdate
from subscription
where subscription_id = 41919; 

SUBSCRIPTION_ID EXPIRATIONDATE    
--------------- -------------------
          41919 0014-01-18 13:45:56 
如果您在第一次查询中更改日期字符串或格式模型,您也将看不到任何数据,因为Oracle有时在解析这些字符串时非常有用:

select s.subscription_id from subscription s
where s.expirationdate - (116/24) between TO_DATE('13-JAN-14 11:38:22',
    'dd-mon-rr hh24:mi:ss')
  and TO_DATE('13-JAN-14 18:30:00', 'dd-mon-rr hh24:mi:ss')
and s.subscription_id=41919;

。。。如果表日期为0014,则不会返回任何行。

Yes。你是对的。问题在于我插入的2位数年份。谢谢你的帮助。