Select 两个时间戳之间的日期

Select date from between two timestamps

我面临以下问题。 我有一个带有 table 的数据库,它保存日期(及其时间)。

现在我想知道日期在两个时间戳之间的所有 tables 信息,但我收到以下错误: 01830.00000 - "date format picture ends before converting entire input string".

到目前为止我所做的是这个查询:

SELECT * FROM ARBEITSBLOCK WHERE STARTZEIT BETWEEN '30.11.2015 19:00:00' 
                                              and  '01.12.2015 19:05:00'; 

这并没有给我任何结果,但应该有:

SELECT * FROM ARBEITSBLOCK 
WHERE TO_CHAR(STARTZEIT,'DD.MM.YYYY H24:MM:SS') BETWEEN '30.11.2015 13:00:00' 
                                                    and '01.12.2015 19:05:00'; 

试试这个语句(使用 Oracle 语法)

SELECT *
FROM   ARBEITSBLOCK 
WHERE  STARTZEIT BETWEEN TO_DATE ('12/04/2015 09:00:00 AM', 'mm/dd/yyyy hh:mi:ss AM')
                     AND TO_DATE ('12/04/2015 10:00:00 AM', 'mm/dd/yyyy hh:mi:ss AM');

如果 STARTZEIT 是 DATE 列,那么为什么要将它与字符串进行比较?

通过这样做,您依赖 Oracle 能够说 "aha! This string is really a date, so I will attempt to convert it for you!"。这一切都很好,但是 Oracle 如何知道字符串中的日期是如何格式化的?

好吧,nls_date_format 参数默认为 'DD-MON-RR',我想您现在可以明白为什么会收到 "date format picture ends before converting entire input string" 错误,因为 'DD-MON-RR' 比 '30.11.2015 19:00:00' 短很多。

与其依赖这种隐式转换和随之而来的错误(如您所见!),您应该显式地将字符串转换为日期,您可以使用 to_date()函数。

例如:

select *
FROM   ARBEITSBLOCK
WHERE STARTZEIT BETWEEN to_date('30.11.2015 19:00:00', 'dd.mm.yyyy hh24:mi:ss')
                and to_date('01.12.2015 19:05:00', 'dd.mm.yyyy hh24:mi:ss');

Oracle 不会以您看到的格式 存储日期。它在内部存储在 7 bytes 中,每个字节存储日期时间值的不同组成部分。

您必须将 TO_DATE 与正确的 FORMAT MODEL 一起使用,以将文字显式转换为 DATE.

SELECT * 
FROM   ARBEITSBLOCK 
WHERE  STARTZEIT BETWEEN 
      TO_DATE('30.11.2015 19:00:00', 'DD.MM.YYYY HH24:MI:SS') 
AND 
      TO_DATE('01.12.2015 19:05:00', 'DD.MM.YYYY HH24:MI:SS'); 

记住,DATE 数据类型有日期和时间元素,TIMESTAMP是一个扩展DATE数据类型