diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py
index fd0a295..8b02bff 100644
--- a/django/db/models/fields/__init__.py
+++ b/django/db/models/fields/__init__.py
@@ -283,8 +283,9 @@ class Field(object):
             return value._prepare()
 
         if lookup_type in (
-                'regex', 'iregex', 'month', 'day', 'week_day', 'search',
-                'contains', 'icontains', 'iexact', 'startswith', 'istartswith',
+                'month', 'day', 'week_day', 'hour', 'minute', 'second',
+                'regex', 'iregex', 'search', 'contains', 'icontains',
+                'iexact', 'startswith', 'istartswith',
                 'endswith', 'iendswith', 'isnull'
             ):
             return value
@@ -317,7 +318,7 @@ class Field(object):
                 sql, params = value._as_sql(connection=connection)
             return QueryWrapper(('(%s)' % sql), params)
 
-        if lookup_type in ('regex', 'iregex', 'month', 'day', 'week_day', 'search'):
+        if lookup_type in ('regex', 'iregex', 'month', 'day', 'week_day', 'hour', 'minute', 'second', 'search'):
             return [value]
         elif lookup_type in ('exact', 'gt', 'gte', 'lt', 'lte'):
             return [self.get_db_prep_value(value, connection=connection, prepared=prepared)]
@@ -639,7 +640,7 @@ class DateField(Field):
     def get_prep_lookup(self, lookup_type, value):
         # For "__month", "__day", and "__week_day" lookups, convert the value
         # to an int so the database backend always sees a consistent type.
-        if lookup_type in ('month', 'day', 'week_day'):
+        if lookup_type in ('month', 'day', 'week_day', 'hour', 'minute', 'second'):
             return int(value)
         return super(DateField, self).get_prep_lookup(lookup_type, value)
 
diff --git a/django/db/models/sql/constants.py b/django/db/models/sql/constants.py
index 63c704f..95b244d 100644
--- a/django/db/models/sql/constants.py
+++ b/django/db/models/sql/constants.py
@@ -4,7 +4,8 @@ import re
 QUERY_TERMS = dict([(x, None) for x in (
     'exact', 'iexact', 'contains', 'icontains', 'gt', 'gte', 'lt', 'lte', 'in',
     'startswith', 'istartswith', 'endswith', 'iendswith', 'range', 'year',
-    'month', 'day', 'week_day', 'isnull', 'search', 'regex', 'iregex',
+    'month', 'day', 'week_day', 'hour', 'minute', 'second',
+    'isnull', 'search', 'regex', 'iregex'
     )])
 
 # Size of each "chunk" for get_iterator calls.
diff --git a/django/db/models/sql/where.py b/django/db/models/sql/where.py
index 2427a52..62481f6 100644
--- a/django/db/models/sql/where.py
+++ b/django/db/models/sql/where.py
@@ -199,7 +199,7 @@ class WhereNode(tree.Node):
                         params)
         elif lookup_type in ('range', 'year'):
             return ('%s BETWEEN %%s and %%s' % field_sql, params)
-        elif lookup_type in ('month', 'day', 'week_day'):
+        elif lookup_type in ('month', 'day', 'week_day', 'hour', 'minute', 'second'):
             return ('%s = %%s' % connection.ops.date_extract_sql(lookup_type, field_sql),
                     params)
         elif lookup_type == 'isnull':
diff --git a/docs/ref/models/querysets.txt b/docs/ref/models/querysets.txt
index 8bff953..948fd5b 100644
--- a/docs/ref/models/querysets.txt
+++ b/docs/ref/models/querysets.txt
@@ -1646,6 +1646,72 @@ Note this will match any record with a pub_date that falls on a Monday (day 2
 of the week), regardless of the month or year in which it occurs. Week days
 are indexed with day 1 being Sunday and day 7 being Saturday.
 
+.. fieldlookup:: hour
+
+hour
+~~~~
+
+.. versionadded:: 1.3
+
+For date/datetime fields, exact hour match.
+
+Example::
+
+    Entry.objects.filter(pub_date__hour=3)
+
+SQL equivalent::
+
+    SELECT ... WHERE EXTRACT('hour' FROM pub_date) = '3';
+
+(The exact SQL syntax varies for each database engine.)
+
+This will match every record with a pub_date that occurred between
+3:00 AM and 3:59 AM.
+
+.. fieldlookup:: minute
+
+minute
+~~~~~~
+
+.. versionadded:: 1.3
+
+For date/datetime fields, exact minute match.
+
+Example::
+
+    Entry.objects.filter(pub_date__minute=30)
+
+SQL equivalent::
+
+    SELECT ... WHERE EXTRACT('minute' FROM pub_date) = '30';
+
+(The exact SQL syntax varies for each database engine.)
+
+This will match every record with a pub_date that occurred at the 30th
+minute of any hour, such as 8:30 AM or 11:30 PM.
+
+.. fieldlookup:: second
+
+second
+~~~~~~
+
+.. versionadded:: 1.3
+
+For date/datetime fields, exact second match.
+
+Example::
+
+    Entry.objects.filter(pub_date__second=0)
+
+SQL equivalent::
+
+    SELECT ... WHERE EXTRACT('second' FROM pub_date) = '0';
+
+(The exact SQL syntax varies for each database engine.)
+
+This will match every record with a pub_date that occurred at the 0th
+second of any minute.
+
 .. fieldlookup:: isnull
 
 isnull
diff --git a/tests/modeltests/basic/tests.py b/tests/modeltests/basic/tests.py
index 966798d..af8e965 100644
--- a/tests/modeltests/basic/tests.py
+++ b/tests/modeltests/basic/tests.py
@@ -18,7 +18,7 @@ class ModelTest(TestCase):
         a = Article(
             id=None,
             headline='Area man programs in Python',
-            pub_date=datetime(2005, 7, 28),
+            pub_date=datetime(2005, 7, 28, 9, 23, 34),
         )
 
         # Save it into the database. You have to call save() explicitly.
@@ -33,7 +33,7 @@ class ModelTest(TestCase):
 
         # Access database columns via Python attributes.
         self.assertEqual(a.headline, 'Area man programs in Python')
-        self.assertEqual(a.pub_date, datetime(2005, 7, 28, 0, 0))
+        self.assertEqual(a.pub_date, datetime(2005, 7, 28, 9, 23, 34))
 
         # Change values by changing the attributes, then calling save().
         a.headline = 'Area woman programs in Python'
@@ -50,6 +50,10 @@ class ModelTest(TestCase):
         self.assertEqual(Article.objects.get(pub_date__year=2005, pub_date__month=7), a)
         self.assertEqual(Article.objects.get(pub_date__year=2005, pub_date__month=7, pub_date__day=28), a)
         self.assertEqual(Article.objects.get(pub_date__week_day=5), a)
+        self.assertEqual(Article.objects.get(pub_date__hour=9, pub_date__minute=23), a)
+        self.assertEqual(Article.objects.get(pub_date__hour=9), a)
+        self.assertEqual(Article.objects.get(pub_date__minute=23), a)
+        self.assertEqual(Article.objects.get(pub_date__second=34), a)
 
         # The "__exact" lookup type can be omitted, as a shortcut.
         self.assertEqual(Article.objects.get(id=a.id), a)
@@ -76,6 +80,22 @@ class ModelTest(TestCase):
             Article.objects.filter(pub_date__week_day=6),
             [],
         )
+        self.assertQuerysetEqual(
+            Article.objects.filter(pub_date__hour=9),
+            ['<Article: Area woman programs in Python>'],
+        )
+        self.assertQuerysetEqual(
+            Article.objects.filter(pub_date__minute=23),
+            ['<Article: Area woman programs in Python>'],
+        )
+        self.assertQuerysetEqual(
+            Article.objects.filter(pub_date__month=7, pub_date__hour=8),
+            [],
+        )
+        self.assertQuerysetEqual(
+            Article.objects.filter(pub_date__month=7, pub_date__second=27),
+            [],
+        )
 
         # Django raises an Article.DoesNotExist exception for get() if the
         # parameters don't match any object.
@@ -101,6 +121,13 @@ class ModelTest(TestCase):
             pub_date__week_day=6,
         )
 
+        self.assertRaisesRegexp(
+            ObjectDoesNotExist,
+            "Article matching query does not exist.",
+            Article.objects.get,
+            pub_date__second=30,
+        )
+
         # Lookup by a primary key is the most common case, so Django
         # provides a shortcut for primary-key exact lookups.
         # The following is identical to articles.get(id=a.id).
diff --git a/tests/regressiontests/null_queries/models.py b/tests/regressiontests/null_queries/models.py
index 442535c..adcb0bd 100644
--- a/tests/regressiontests/null_queries/models.py
+++ b/tests/regressiontests/null_queries/models.py
@@ -22,4 +22,4 @@ class OuterB(models.Model):
 
 class Inner(models.Model):
     first = models.ForeignKey(OuterA)
-    second = models.ForeignKey(OuterB, null=True)
+    secondary = models.ForeignKey(OuterB, null=True)
diff --git a/tests/regressiontests/null_queries/tests.py b/tests/regressiontests/null_queries/tests.py
index 72dcd51..edc0cc6 100644
--- a/tests/regressiontests/null_queries/tests.py
+++ b/tests/regressiontests/null_queries/tests.py
@@ -53,17 +53,17 @@ class NullQueriesTests(TestCase):
         """
         obj = OuterA.objects.create()
         self.assertQuerysetEqual(
-            OuterA.objects.filter(inner__second=None),
+            OuterA.objects.filter(inner__secondary=None),
             ['<OuterA: OuterA object>']
         )
         self.assertQuerysetEqual(
-            OuterA.objects.filter(inner__second__data=None),
+            OuterA.objects.filter(inner__secondary__data=None),
             ['<OuterA: OuterA object>']
         )
 
         inner_obj = Inner.objects.create(first=obj)
         self.assertQuerysetEqual(
-            Inner.objects.filter(first__inner__second=None),
+            Inner.objects.filter(first__inner__secondary=None),
             ['<Inner: Inner object>']
         )
 
