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
数据类型。
我面临以下问题。 我有一个带有 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
数据类型。