Как использовать между условием с использованием основного запроса и подзапроса [duplicate]

Python 3.6.0 Timings

Вот результаты синхронизации с использованием Python 3.6.0. Имейте в виду, что эти времена относятся друг к другу, а не абсолютны.

Я придерживался только мелких копий, а также добавил некоторые новые методы, которые не были возможны в Python2, например list.copy() ( Python3 эквивалент среза ) и распаковки (*new_list, = list):

METHOD                  TIME TAKEN
b = a[:]                6.468942025996512   #Python2 winner
b = a.copy()            6.986593422974693   #Python3 "slice equivalent"
b = []; b.extend(a)     7.309216841997113
b = a[0:len(a)]         10.916740721993847
*b, = a                 11.046738261007704
b = list(a)             11.761539687984623
b = [i for i in a]      24.66165203397395
b = copy.copy(a)        30.853400873980718
b = []
for item in a:
  b.append(item)        48.19176080400939

Мы видим, что старый победитель по-прежнему выходит сверху, но на самом деле не на огромную сумму, учитывая повышенную читаемость подхода Python3 list.copy().

Обратите внимание, что эти методы делают not выводными эквивалентными результатами для любого ввода, отличного от списков. Все они работают для разрезаемых объектов, некоторые работы для любого итерабельного, но только copy.copy() работает для любого объекта Python.


Вот код тестирования для заинтересованных сторон ( Шаблон отсюда ):

import timeit

COUNT = 50000000
print("Array duplicating. Tests run", COUNT, "times")
setup = 'a = [0,1,2,3,4,5,6,7,8,9]; import copy'

print("b = list(a)\t\t", timeit.timeit(stmt='b = list(a)', setup=setup, number=COUNT))
print("b = copy.copy(a)\t\t", timeit.timeit(stmt='b = copy.copy(a)', setup=setup, number=COUNT))
print("b = a.copy()\t\t", timeit.timeit(stmt='b = a.copy()', setup=setup, number=COUNT))
print("b = a[:]\t\t", timeit.timeit(stmt='b = a[:]', setup=setup, number=COUNT))
print("b = a[0:len(a)]\t", timeit.timeit(stmt='b = a[0:len(a)]', setup=setup, number=COUNT))
print("*b, = a\t", timeit.timeit(stmt='*b, = a', setup=setup, number=COUNT))
print("b = []; b.extend(a)\t", timeit.timeit(stmt='b = []; b.extend(a)', setup=setup, number=COUNT))
print("b = []\nfor item in a: b.append(item)\t", timeit.timeit(stmt='b = []\nfor item in a:  b.append(item)', setup=setup, number=COUNT))
print("b = [i for i in a]\t", timeit.timeit(stmt='b = [i for i in a]', setup=setup, number=COUNT))

175
задан NullVoxPopuli 21 August 2014 в 17:21
поделиться

8 ответов

Ваша вторая дата до первой даты (т. е. вы запрашиваете между 29 сентября 2010 года и 30 января 2010 года). Попробуйте изменить порядок дат:

SELECT *
FROM `objects`
WHERE (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')
346
ответ дан Daniel Vandersluis 21 August 2018 в 14:37
поделиться
  • 1
    Благодарю. я пропустил «около дат». – xeo 6 February 2016 в 22:08
  • 2
    Я знал об этом, но теперь у нас есть проблема с UPDATE. Я пытаюсь использовать BETWEEN для UPDATE, если он работает так же? – Ingus Graholskis 2 June 2017 в 09:55
  • 3
    @IngusGraholskis: предложение where должно работать одинаково в операторах select или update. – T30 30 June 2017 в 12:37

Попробуйте включить даты:

2010-09-29 > 2010-01-30?
0
ответ дан Conner 21 August 2018 в 14:37
поделиться

Как расширение ответа от @sabin и подсказка, если вы хотите сравнить только часть date (без времени):

Если поле для сравнения - это тип datetime и только даты указаны для сравнения, тогда эти даты внутренне преобразованы в значения datetime . Это означает, что следующий запрос

SELECT * FROM `objects` WHERE (date_time_field BETWEEN '2010-01-30' AND '2010-09-29')

будет внутренне преобразован в

SELECT * FROM `objects` WHERE (date_time_field BETWEEN '2010-01-30 00:00:00' AND '2010-09-29 00:00:00')

.

Это, в свою очередь, приводит к результату, который не включает объекты с 2010-09-29 с значением времени больше 00:00:00!

Таким образом, если все объекты с датой 2010-09-29 также должны быть включены, поле для сравнения должно преобразуется в дату:

SELECT * FROM `objects` WHERE (DATE(date_time_field) BETWEEN '2010-01-30' AND '2010-09-29')
1
ответ дан ltlBeBoy 21 August 2018 в 14:37
поделиться

Ваш запрос должен иметь дату как

select * from table between `lowerdate` and `upperdate`

try

SELECT * FROM `objects` 
WHERE  (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')
21
ответ дан Nik 21 August 2018 в 14:37
поделиться

Является ли date_field типа datetime? Также вам нужно сначала поставить раннюю дату.

Это должно быть:

SELECT * FROM `objects` 
WHERE  (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')
11
ответ дан Rocket Hazmat 21 August 2018 в 14:37
поделиться

DATE () - это функция MySQL, которая извлекает только часть даты выражения даты или даты / времени

SELECT * FROM table_name WHERE DATE(date_field) BETWEEN '2016-12-01' AND '2016-12-10';
9
ответ дан sabin 21 August 2018 в 14:37
поделиться
  • 1
    вы могли добавить объяснение, чтобы люди поняли, что вы делаете. – Franz Gleichmann 15 December 2016 в 07:39

Может возникнуть проблема с настройкой даты на стороне сервера или на стороне клиента. Я обнаружил, что это общая проблема в нескольких базах данных, когда хост настроен на испанский, французский или любой другой ..., который может повлиять на формат dd / mm / yyyy или mm / dd / yyyy.

1
ответ дан SoulWanderer 21 August 2018 в 14:37
поделиться
  • 1
    Проблема заключалась в том, что более старая дата была указана до более поздней даты. – theninjagreg 24 June 2015 в 20:09
2
ответ дан Fahd Allebdi 1 November 2018 в 08:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: