sysdate -1问题

时间:2018-07-12 13:02:12

标签: sql oracle

所以我在运行此查询的位是*旁边是即时通讯卡住的位置,我希望我的搜索仅显示昨天的日期,但是即使我知道昨天有数据,我的查询也没有返回结果,我无法使用日期,因为我希望我的脚本每天自动运行

06-JUL-18 09.49.53.000000000-这是日期在表上最初显示的内容,而在下面是表的desc,我放入substr(Creation_Timestamp,1,18)的原因是因为我仅想看一些日期和时间

CREATION_TIMESTAMP NOT NULL TIMESTAMP(6)

Select substr(Creation_Timestamp, 1, 18),
       A.Message_Class,
       A.Channel,
       A.Data_Centre,
       B.Line_Of_Business,
       count(*) 
From   Payld_Data.Received_Messages A,
       Recon_Data.Reconciliation_Control B
Where  A.Conversation_Id = B.Conversation_Id
and    a.message_class = 'IR-CIS-VERIFY-RESP'
**and Creation_Timestamp like sysdate -1**
group by substr(Creation_Timestamp, 1, 18),
       A.Message_Class,
       A.Channel,
       A.Data_Centre,
       B.Line_Of_Business;

5 个答案:

答案 0 :(得分:2)

and Creation_Timestamp like sysdate -1

实际上与以下内容相同:

and Creation_Timestamp = TO_CHAR( sysdate -1, (SELECT value FROM NLS_SESSION_PARAMETERS WHERE parameter = 'NLS_TIMESTAMP_FORMAT' ) )

这很可能包含小时,分钟,秒和小数秒部分,您的LIKE条件将尝试匹配该部分。由于从昨天起没有确切的小时,分​​钟,秒和小数秒的值,因此您的查询将不会返回任何内容。

相反,您需要查询范围:

Select substr(Creation_Timestamp, 1, 18),
       A.Message_Class,
       A.Channel,
       A.Data_Centre,
       B.Line_Of_Business,
       count(*) 
From   Payld_Data.Received_Messages A
       INNER JOIN Recon_Data.Reconciliation_Control B
       ON ( A.Conversation_Id = B.Conversation_Id )
Where  a.message_class = 'IR-CIS-VERIFY-RESP'
and    Creation_Timestamp >= TRUNC( sysdate ) - 1
and    Creation_Timestamp  < TRUNC( sysdate )
group by substr(Creation_Timestamp, 1, 18),
       A.Message_Class,
       A.Channel,
       A.Data_Centre,
       B.Line_Of_Business;

答案 1 :(得分:0)

因为您的列不是字符串,所以请忽略我以前的答案。
请尝试以下操作:

....
AND Creation_Timestamp >= TRUNC(sysdate-1)
AND Creation_Timestamp < TRUNC(sysdate)
....

此外,您应该使用substr(Creation_Timestamp, 1, 18)或您喜欢的任何格式来代替TO_CHAR(Creation_Timestamp, 'DD-Mon-YY HH24:MI:SS')
selectgroup by中都是如此。

答案 2 :(得分:0)

对两者使用相同的格式,并进行简单的字符串比较

AND TO_CHAR(Creation_Timestamp, ‘YYYYMMDD’) = TO_CHAR(Sysdate - 1, ‘YYYYMMDD’)

答案 3 :(得分:-1)

我相信问题在这里

and Creation_Timestamp **like** sysdate -1

like 运算符通常意味着将搜索包含某些内容的文本,就像您试图查找包含单词dog的每个字符串一样:

where column_name like "%dog%"

因此,您应该选择=<<=

如果您确切想要昨天:

and Creation_Timestamp = sysdate -1

如果要在今天之前的所有时间

and Creation_Timestamp < sysdate

如果您要执行与上述类似的操作,但要说明sysdate-1

and Creation_Timestamp <= sysdate -1

编辑:由于我不确定时间戳的小时数将如何影响这种情况,因此我必须添加一些内容。我不知道是否可以像上面那样简单地工作,或者是否需要按如下所示的日期进行转换:

and CAST(Creation_Timestamp as date) < SYSDATE

答案 4 :(得分:-2)

如果您的Creation_Timestamp是格式为DD-Mon-YY字符串,然后是时间,则应尝试以下操作:

....
AND Creation_Timestamp LIKE TO_CHAR(sysdate-1, 'DD-Mon-YY') || '%'
....

更新
由于列不是字符串,请忽略此答案。
我不会删除此评论,因为评论很重要