我遇到了一个带有以下条件子句
的SQL查询To_Char(CRTE_TMS, 'YYYYmmddHH24MISS') between To_Char (TO_DATE(:endDtTime,'YYYYmmddHH24MISS')-TO_DATE('235959', 'HH24MISS')) and :endDtTime
我的高层理解是创建时间戳应该在结束时间和结束时间之间的某个时间之间。 不确定TO_DATE('235959','HH24MISS')是什么意思。
如果我在2月5日运行以下查询,则返回2月1日
SELECT TO_DATE('235959', 'HH24MISS') FROM DUAl
请帮助我理解这个条件究竟是什么意思。
答案 0 :(得分:1)
TO_DATE('235959', 'HH24MISS')
创建DATE
值。请注意,在Oracle数据类型DATE
中始终包含日期和时间部分。
如果您没有提供任何日期值,那么Oracle会将其默认为当前月份的第一天,因此TO_DATE('235959', 'HH24MISS')
返回“2018-02-01 23:59:59”
我认为这种情况没有意义:
To_Char(CRTE_TMS, 'YYYYmmddHH24MISS')
between To_Char (TO_DATE(:endDtTime,'YYYYmmddHH24MISS')-TO_DATE('235959', 'HH24MISS'))
and :endDtTime
首先,您应该比较DATE
值,而不是字符串。
我假设 TO_DATE(:endDtTime,'YYYYmmddHH24MISS')-TO_DATE('235959', 'HH24MISS'))
错误。我想你的意思是TO_DATE(:endDtTime,'YYYYmmddHH24MISS') - 1 + (1/24/60/60)
这将减1天加1秒(1/24/60/60),即减去23:59:59。
另一种可能性是TO_DATE(:endDtTime,'YYYYmmddHH24MISS') - INTERVAL '23:59:59' HOUR TO SECOND
。
所以,你的情况可能是
WHERE CRTE_TMS between TO_DATE(:endDtTime,'YYYYmmddHH24MISS') - 1 + (1/24/60/60) AND :endDtTime
答案 1 :(得分:1)
这可能是评论而不是答案。抱歉没有足够的声誉。
12小时格式表示晚上11:59:59。
您要做的是将日期格式转换为字符,并将其与其他日期进行比较,方法是使用To_char将它们转换为字符格式。我不建议这样做。 以下将给出本月的第一天
SELECT TO_DATE('235959', 'HH24MISS') FROM DUAl;
我无法理解你在这里想要达到的目标。 以下语法以字符格式给出,这是两个日期之间的差异。例如4天10小时。
To_Char (TO_DATE(:endDtTime,'YYYYmmddHH24MISS')-TO_DATE('235959', 'HH24MISS'))
然后你试图在(4天到10小时)和:结束时间之间进行比较。这是不正确的。
您可以使用以下内容转换为日期格式。
to_date('01012018 23:59:59','MMDDYYYY HH24:MI:SS')
select case when to_date('01012018 23:59:59','MMDDYYYY HH24:MI:SS') between :begindate and :enddate then 1
else null
from dual;