2015-12-04 159 views
1

我正面臨以下問題。 我有一個數據庫,其中保存了日期(及其時間)。從兩個時間戳之間選擇日期

現在我想知道日期在兩個時間戳之間的所有表信息,但出現以下錯誤: 01830. 00000 - 「日期格式圖片在轉換整個輸入字符串之前結束」。

我做什麼到目前爲止,這是查詢:

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'; 
+3

'arbeitsblock'的數據類型是什麼?請顯示示例數據。此外,您可以使用'TIMESTAMP'2015-11-30 19:00:00'在Oracle中使用ISO標準日期格式。我會推薦這個。 –

+0

Arbeitsblock是表名,「Startzeit」是日期。 – Ron

+0

這實際上解決了我的問題。謝謝! – Ron

回答

3

試試這個聲明(使用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'); 
+0

這個查詢有什麼問題? –

+0

您的查詢運行良好。但試着解釋它preethi –

1

如果STARTZEIT是DATE列,那麼你爲什麼試圖將它與一個字符串進行比較?

通過這樣做,您就可以依靠Oracle能夠說出「aha!這個字符串確實是一個日期,因此我會嘗試將它轉換爲您!」。這一切都很好,但Oracle如何知道字符串中的日期是如何格式化的呢?

那麼,有默認爲'DD-MON-RR'的nls_date_format參數,我想你現在可以看到爲什麼你在轉換整個輸入字符串之前得到「日期格式圖片結束」錯誤,因爲' 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'); 
0

Oracle不店在格式你看到日期。它將其內部存儲在7 bytes中,每個字節存儲日期時間值的不同分量。

您必須使用TO_DATE適當業態模式字面顯式轉換爲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數據類型

相關問題