2010-06-07 49 views
40

Trong mysql tôi có thể làm điều này:From Now() để Current_timestamp trong PostgreSQL

SELECT * 
FROM table 
WHERE auth_user.lastactivity > NOW() - 100 

bây giờ trong postgresql Tôi đang sử dụng truy vấn này:

SELECT * 
FROM table 
WHERE auth_user.lastactivity > CURRENT_TIMESTAMP - 100 

nhưng tôi nhận được lỗi này:

operator does not exist: timestamp with time zone - integer 

Tôi có thể giải quyết bằng cách nào?

Trả lời

85

Sử dụng một khoảng thời gian thay vì một số nguyên:

SELECT * 
FROM table 
WHERE auth_user.lastactivity > CURRENT_TIMESTAMP - INTERVAL '100 days' 
3

Đây là những gì các tài liệu MySQL nói về NOW():

Returns the current date and time as a value in 'YYYY-MM-DD HH:MM:SS' or YYYYMMDDHHMMSS.uuuuuu format, depending on whether the function is used in a string or numeric context. The value is expressed in the current time zone.

mysql> SELECT NOW(); 
     -> '2007-12-15 23:50:26' 
mysql> SELECT NOW() + 0; 
     -> 20071215235026.000000 

Bây giờ, bạn chắc chắn có thể làm giảm thời gian thông minh của bạn để một cái gì đó ít hơn ...

SELECT (
date_part('year', NOW())::text 
|| date_part('month', NOW())::text 
|| date_part('day', NOW())::text 
|| date_part('hour', NOW())::text 
|| date_part('minute', NOW())::text 
|| date_part('second', NOW())::text 
)::float8 + foo; 

Nhưng, đó sẽ là một ý tưởng thực sự xấu, những gì bạn cần phải hiểu là thời gian và ngày không phải là số unformated ngu ngốc, họ là họ own type với họ own set of functionsoperators

Vì vậy, lần MySQL cơ bản cho phép bạn đối xử với NOW() như một loại dumber, hoặc nó ghi đè + để tạo một giả định mà tôi không thể tìm thấy trong tài liệu MySQL. Dù sao, bạn có thể muốn xem các loại dateinterval trong pg.

24

Bạn cũng có thể sử dụng now() trong Postgres. Vấn đề là bạn không thể thêm/trừ số nguyên từ timestamp hoặc timestamptz. Bạn có thể làm như Mark Byers gợi ý và trừ một khoảng thời gian, hoặc sử dụng các loại date mà cho phép bạn thêm/trừ số nguyên

SELECT now()::date + 100 AS date1, current_date - 100 AS date2 
+3

Không giảm hạng, nhưng: INTERVAL làm rõ đơn vị bạn đang làm khi bạn thực hiện phép toán ngày. Ví dụ, nó là không rõ ràng mà ngay lập tức trong tương lai trong thời gian 'now() :: date + 100' đại diện. Có một trường hợp toán học số nguyên là cần thiết trên toán INTERVAL? –

4

Dưới đây là một ví dụ ...

select * from tablename where to_char(added_time, 'YYYY-MM-DD') = to_char(now(), 'YYYY-MM-DD') 

added_time là một tên cột mà tôi đã chuyển đổi thành char cho phù hợp với

+0

Điều đó sẽ hoạt động rất chậm vì nó tính toán hoạt động trên mỗi hàng. Vì vậy, nó không thể sử dụng chỉ mục trên cột 'added_time' đơn giản. Tất nhiên, bạn có thể tạo chỉ mục chức năng cho biết trên 'to_char (added_time, 'YYYY-MM-DD')' nhưng có vẻ như trên không trong tình huống đó. – Hubbitus

-2
select * from table where column_date > now()- INTERVAL '6 hours'; 
+3

Trong khi điều này có thể trả lời câu hỏi, vui lòng cung cấp giải thích ngắn gọn về mã của bạn và lý do giải thích vấn đề ban đầu. – user1438038

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