2013-04-18 24 views
5

Tôi có một cột datetime trong Oracle (MM/DD/YYYY HH: MM: SS AM/PM) nhưng khi tôi làm điều này:Subtract một giờ từ datetime chứ không phải là một ngày

SELECT MAX(D_DTM)-1 FROM tbl1 

. .. nó quay trở lại một ngày. Làm cách nào để xóa một giờ khỏi cột thay vì một ngày?

Tôi cũng đã nhận thấy rằng datetime hồ sơ cho 12:00 nhìn như MM/DD/YYYY và không MM/DD/YYYY 00:00:00; Tôi không chắc liệu điều đó có quan trọng không.

+0

How are you xem các giá trị 12:00? Có phải thông qua SQLPlus hoặc ngôn ngữ front-end (C#, PHP, v.v.) không? –

+0

sử dụng Toad, có phải là giao diện người dùng không?Tôi mới là Oracle env – user2061886

+0

Nó có thể là một điều TOAD, nhưng tôi không quen thuộc với TOAD. Nếu tất cả các ngày khác trong cột hiển thị thành phần thời gian và ngày "nửa đêm" thì không, tôi nghĩ rằng an toàn để giả định rằng "nửa đêm" thực sự ở đó và TOAD chỉ là "giúp đỡ" giấu nó. Có thể có một cài đặt mà bạn có thể bật hoặc tắt tính năng này, nhưng đó chỉ là phỏng đoán. Tôi biết rằng các ngôn ngữ .NET và PHP sẽ nhận ra phần thời gian - ngay cả khi nó bằng 0 - và có lẽ chỉ là về mọi ngôn ngữ khác nữa. –

Trả lời

13

Randy's answer là tốt, nhưng bạn cũng có thể sử dụng khoảng:

SELECT MAX(D_DTM)- interval '1' hour FROM tbl1 
+0

Câu trả lời hay hơn IMO, rõ ràng hơn cho những người lập trình trong tương lai biết những gì đang xảy ra – user2061886

4

có - ngày bằng số nguyên ngày.

nếu bạn muốn giờ bạn cần phải làm một số toán học - như -(1/24)

5

Hoặc sử dụng INTERVAL chức năng. Nó có kết quả tương tự nhưng tôi nghĩ rằng nó đọc rõ ràng hơn - đó là tất nhiên chỉ là một ý kiến ​​:)

SELECT MAX(D_DTM) - INTERVAL '1' HOUR FROM tbl1 

Những điều tốt đẹp về INTERVAL chức năng là bạn có thể tận dụng khoảng thời gian phải mất nhiều năm, tháng, ngày, giờ , phút hoặc giây khi giao dịch với giá trị DATE, mặc dù khoảng thời gian tháng có thể phức tạp khi xử lý các ngày cuối tháng.

Và có, báo giá xung quanh 1 trong ví dụ là bắt buộc.

Bạn cũng có thể sử dụng Oracle-cụ thể NumToDSInterval chức năng, đó là ít tiêu chuẩn nhưng linh hoạt hơn bởi vì nó chấp nhận các biến thay vì các hằng số:

SELECT MAX(D_DTM) - NUMTODSINTERVAL(1, 'HOUR') FROM tbl1 
2

Một phương pháp sử dụng khoảng thời gian là

NUMTODSINTERVAL(number, expression) 

ví dụ

NUMTODSINTERVAL(150, 'DAY') 
NUMTODSINTERVAL(1500, 'HOUR') 
NUMTODSINTERVAL(15000, 'MINUTE') 
NUMTODSINTERVAL(150000, 'SECOND') 

Tôi mang cái này lên sử dụng nó rất hữu ích cho các tình huống khi sử dụng INTERVAL sẽ không hoạt động.

4
select sysdate - numtodsinterval(1,'hour') from dual 
1

Đơn giản của nó.

sysdate - 5/(24 * 60 * 60) -> Trừ 5 giây từ systime

sysdate - 5/(24 * 60) -> Trừ 5 phút từ systime

sysdate - 5/(24) -> Trừ 5 giờ, kể từ systime

Do đó

chọn (sysdate - (1/24)) từ kép

+0

Bạn có thể mở rộng thêm một chút về câu trả lời của mình, chẳng hạn như tại sao bạn đang sử dụng phép chia để trừ? –

+0

@CodyGuldner Bộ phận tính toán giá trị như một phần nhỏ của ngày. (1 giờ là 1/24 của một ngày, vì vậy 5/24 ngày là 5 giờ.) Phép trừ sau đó trừ đi ngày. Cá nhân, tuy nhiên, tôi sẽ lo lắng về lỗi dấu phẩy động. – jpmc26

+0

@ jpmc26 Ý tưởng là thông tin như vậy nên được đưa vào câu trả lời. –

Các vấn đề liên quan