{{{
delta = timedelta(seconds=-3600)
print delta2
-1 day, 23:00:00
}}}
The resultant SQL generated by `date_interval_sql` for the MySQL backend
would be something like:
{{{
UPDATE `scheduling_event`
SET ...
`my_datetime` = (`my_table`.`my_datetime` + INTERVAL '-1
0:0:82800:0' DAY_MICROSECOND),
WHERE (...)
}}}
**AND** what we want is the following:
{{{
UPDATE `scheduling_event`
SET ...
`my_datetime` = (`my_table`.`my_datetime` + INTERVAL '-0 0:0:3600:0'
DAY_MICROSECOND),
WHERE (...)
}}}
In layman's terms - the two layers are not convertible in a one-to-one
sense. A `timedelta` in for the example above in Python means: '''go back
one day and *add* 23 hours'''. So some `datetime + delta` would just
subtract one hour.
In MySQL, however, "INTERVAL '-1 0:0:82800:0' DAY_MICROSECOND)" means:
'''add a negative one day and 23 hours'''.
--
Ticket URL: <https://code.djangoproject.com/ticket/24959>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
* needs_docs: => 0
* needs_tests: => 0
* needs_better_patch: => 0
Old description:
> If I have a `timedelta` object in python that represents a negative
> difference, e.g.:
>
> {{{
> delta = timedelta(seconds=-3600)
> print delta2
> -1 day, 23:00:00
> }}}
>
> The resultant SQL generated by `date_interval_sql` for the MySQL backend
> would be something like:
>
> {{{
> UPDATE `scheduling_event`
> SET ...
> `my_datetime` = (`my_table`.`my_datetime` + INTERVAL '-1
> 0:0:82800:0' DAY_MICROSECOND),
> WHERE (...)
> }}}
>
> **AND** what we want is the following:
>
> {{{
> UPDATE `scheduling_event`
> SET ...
> `my_datetime` = (`my_table`.`my_datetime` + INTERVAL '-0 0:0:3600:0'
> DAY_MICROSECOND),
> WHERE (...)
> }}}
>
> In layman's terms - the two layers are not convertible in a one-to-one
> sense. A `timedelta` in for the example above in Python means: '''go
> back one day and *add* 23 hours'''. So some `datetime + delta` would
> just subtract one hour.
>
> In MySQL, however, "INTERVAL '-1 0:0:82800:0' DAY_MICROSECOND)" means:
> '''add a negative one day and 23 hours'''.
New description:
If I have a `timedelta` object in python that represents a negative
difference, e.g.:
{{{
delta = timedelta(seconds=-3600)
print delta2
-1 day, 23:00:00
}}}
The resultant SQL generated by `date_interval_sql` for the MySQL backend
would be something like:
{{{
UPDATE `my_table`
SET ...
`my_datetime` = (`my_table`.`my_datetime` + INTERVAL '-1
0:0:82800:0' DAY_MICROSECOND),
WHERE (...)
}}}
**AND** what we want is the following:
{{{
UPDATE `my_table`
SET ...
`my_datetime` = (`my_table`.`my_datetime` + INTERVAL '-0 0:0:3600:0'
DAY_MICROSECOND),
WHERE (...)
}}}
In layman's terms - the two layers are not convertible in a one-to-one
sense. A `timedelta` in for the example above in Python means: '''go back
one day and *add* 23 hours'''. So some `datetime + delta` would just
subtract one hour.
In MySQL, however, ''"INTERVAL '-1 0:0:82800:0' DAY_MICROSECOND)"'' means:
'''add a negative one day and 23 hours'''.
--
--
Ticket URL: <https://code.djangoproject.com/ticket/24959#comment:1>
Old description:
> If I have a `timedelta` object in python that represents a negative
> difference, e.g.:
>
> {{{
> delta = timedelta(seconds=-3600)
> print delta2
> -1 day, 23:00:00
> }}}
>
> The resultant SQL generated by `date_interval_sql` for the MySQL backend
> would be something like:
>
> {{{
> UPDATE `my_table`
> SET ...
> `my_datetime` = (`my_table`.`my_datetime` + INTERVAL '-1
> 0:0:82800:0' DAY_MICROSECOND),
> WHERE (...)
> }}}
>
> **AND** what we want is the following:
>
> {{{
> UPDATE `my_table`
> SET ...
> `my_datetime` = (`my_table`.`my_datetime` + INTERVAL '-0 0:0:3600:0'
> DAY_MICROSECOND),
> WHERE (...)
> }}}
>
> In layman's terms - the two layers are not convertible in a one-to-one
> sense. A `timedelta` in for the example above in Python means: '''go
> back one day and *add* 23 hours'''. So some `datetime + delta` would
> just subtract one hour.
>
> In MySQL, however, ''"INTERVAL '-1 0:0:82800:0' DAY_MICROSECOND)"''
> means: '''add a negative one day and 23 hours'''.
New description:
If I have a `timedelta` object in python that represents a negative
difference, e.g.:
{{{
delta = timedelta(seconds=-3600)
print delta2
-1 day, 23:00:00
}}}
The resultant SQL generated by `date_interval_sql` for the MySQL backend
would be something like:
{{{
UPDATE `my_table`
SET ...
`my_datetime` = (`my_table`.`my_datetime` + INTERVAL '-1
0:0:82800:0' DAY_MICROSECOND),
WHERE (...)
}}}
**AND** what we want is the following:
{{{
UPDATE `my_table`
SET ...
`my_datetime` = (`my_table`.`my_datetime` + INTERVAL '-0 0:0:3600:0'
DAY_MICROSECOND),
WHERE (...)
}}}
In layman's terms - the two layers are not convertible in a one-to-one
sense. A `timedelta` in for the example above in Python means: '''go back
one day and *add* 23 hours'''. So some `datetime + delta` would just
subtract one hour.
In MySQL, however, ''INTERVAL '-1 0:0:82800:0' DAY_MICROSECOND)'' means:
'''add a negative one day and 23 hours'''.
--
--
Ticket URL: <https://code.djangoproject.com/ticket/24959#comment:2>
Old description:
> If I have a `timedelta` object in python that represents a negative
> difference, e.g.:
>
> {{{
> delta = timedelta(seconds=-3600)
> print delta2
> -1 day, 23:00:00
> }}}
>
> The resultant SQL generated by `date_interval_sql` for the MySQL backend
> would be something like:
>
> {{{
> UPDATE `my_table`
> SET ...
> `my_datetime` = (`my_table`.`my_datetime` + INTERVAL '-1
> 0:0:82800:0' DAY_MICROSECOND),
> WHERE (...)
> }}}
>
> **AND** what we want is the following:
>
> {{{
> UPDATE `my_table`
> SET ...
> `my_datetime` = (`my_table`.`my_datetime` + INTERVAL '-0 0:0:3600:0'
> DAY_MICROSECOND),
> WHERE (...)
> }}}
>
> In layman's terms - the two layers are not convertible in a one-to-one
> sense. A `timedelta` in for the example above in Python means: '''go
> back one day and *add* 23 hours'''. So some `datetime + delta` would
> just subtract one hour.
>
> In MySQL, however, ''INTERVAL '-1 0:0:82800:0' DAY_MICROSECOND)'' means:
> '''add a negative one day and 23 hours'''.
New description:
If I have a `timedelta` object in python that represents a negative
difference, e.g.:
{{{
delta = timedelta(seconds=-3600)
print delta2
-1 day, 23:00:00
}}}
The resultant SQL generated by `date_interval_sql` for the MySQL backend
would be something like:
{{{
UPDATE `my_table`
SET ...
`my_datetime` = (`my_table`.`my_datetime` + INTERVAL '-1
0:0:82800:0' DAY_MICROSECOND),
WHERE (...)
}}}
**AND** what we want is the following:
{{{
UPDATE `my_table`
SET ...
`my_datetime` = (`my_table`.`my_datetime` + INTERVAL '-0 0:0:3600:0'
DAY_MICROSECOND),
WHERE (...)
}}}
In layman's terms - the two layers are not convertible in a one-to-one
sense. A `timedelta` in for the example above in Python means: '''go back
one day and *add* 23 hours'''. So some `datetime + delta` would just
subtract one hour.
In MySQL, however, ''INTERVAL '-1 0:0:82800:0' DAY_MICROSECOND'' means:
'''add a negative one day and 23 hours'''.
--
--
Ticket URL: <https://code.djangoproject.com/ticket/24959#comment:3>
Comment (by timgraham):
What does your QuerySet look like?
--
Ticket URL: <https://code.djangoproject.com/ticket/24959#comment:4>
Comment (by fredpalmer):
Where it came up for me was a bulk `QuerySet.update()` using the `F()`
object, e.g.:
{{{
...
delta = start_current - start_previous # Get the offset to add to
filtered objects
Event.objects.filter(**filters).update(start=F("start") + delta)
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/24959#comment:5>
* type: Uncategorized => Bug
* stage: Unreviewed => Accepted
--
Ticket URL: <https://code.djangoproject.com/ticket/24959#comment:6>
Comment (by Tim Graham):
I'm attaching the start of a regression test.
--
Ticket URL: <https://code.djangoproject.com/ticket/24959#comment:7>
* Attachment "24959-test.diff" added.
* owner: nobody => felixxm
* status: new => assigned
--
Ticket URL: <https://code.djangoproject.com/ticket/24959#comment:8>
* has_patch: 0 => 1
Comment:
[https://github.com/django/django/pull/7571 PR]
--
Ticket URL: <https://code.djangoproject.com/ticket/24959#comment:9>
* stage: Accepted => Ready for checkin
--
Ticket URL: <https://code.djangoproject.com/ticket/24959#comment:10>
* status: assigned => closed
* resolution: => fixed
Comment:
In [changeset:"b63d0c54b05ede2589e2b720eb0c102c02891962" b63d0c54]:
{{{
#!CommitTicketReference repository=""
revision="b63d0c54b05ede2589e2b720eb0c102c02891962"
Fixed #24959 -- Fixed queries using negative timedeltas on MySQL and
Oracle.
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/24959#comment:11>