DATE_FORMAT В запросе MongoDB только по дате месяца [дубликат]

Что вам нужно знать:

    текст, который представляет несколько строк, также содержит непечатаемые символы между строками (мы называем их разделителями строк), как возврат каретки (CR - в строковых литералах, представленных как "\r") line line (LF - в строковых литералах, представленных как "\n")
  • , когда вы читаете данные с консоли, это позволяет пользователю вводить свой ответ, и когда он будет сделан, ему необходимо как-то подтверждают этот факт. Для этого пользователю необходимо нажать клавишу «enter» / «return» на клавиатуре. Важно то, что этот ключ, помимо обеспечения размещения пользовательских данных на стандартном входе (представленный System.in, который читается Scanner), также отправляет зависимые от ОС разделители строк (например, для Windows \r\n) после этого. Поэтому, когда вы запрашиваете у пользователя значение типа age, а пользовательские типы 42 и нажимаете enter, стандартный вход будет содержать "42\r\n".

Проблема

Scanner#nextInt (и другие методы Scanner#nextType) не позволяют сканеру потреблять эти разделители строк. Он прочитает их из System.in (как еще Сканер узнает, что больше нет цифр от пользователя, которые представляют age значение, чем перед пробелом?), Который удалит их со стандартного ввода, но он также будет кешем эти разделители строк внутри. Нам нужно помнить, что все методы Scanner всегда сканируются, начиная с кэшированного текста.

Теперь Scanner#nextLine() просто собирает и возвращает все символы , пока не найдет разделители строк (или конец потока). Но поскольку разделители строк после прочтения номера из консоли сразу обнаруживаются в кеше сканера, он возвращает пустую строку, что означает, что сканер не смог найти символ до этих разделителей строк (или конца потока). BTW nextLine также потребляет эти разделители строк.

Решение

Поэтому, когда вы хотите запросить номер, а затем для всей строки, избегая этой пустой строки в результате nextLine, либо

  • потребляет разделитель строк слева от nextInt из кеша сканеров, вызывая nextLine, или вызывая skip("\\R"), чтобы позволить Scanner пропускать часть, сопоставляемую с \R, которая представляет разделитель строк (подробнее о \R: https : //stackoverflow.com/a/31060125 )
  • вообще не используют nextInt (ни next, ни какие-либо методы nextTYPE). Вместо этого прочитайте целые строки данных по строке nextLine и номера разбора из каждой строки (при условии, что одна строка содержит только одно число) для правильного типа, например int, через Integer.parseInt.

BTW: Scanner#nextType методы могут пропускать разделители (по умолчанию все пробелы, такие как вкладки, разделители строк), в том числе кэшированные сканером, пока они не найдут следующее значение без разделителя (токен). Благодаря этому для ввода типа "42\r\n\r\n321\r\n\r\n\r\nfoobar" код

int num1 = sc.nextInt();
int num2 = sc.nextInt();
String name = sc.next();

сможет правильно назначить num1=42 num2=321 name=foobar.

277
задан royhowie 11 August 2015 в 07:20
поделиться

10 ответов

Запрос в отношении диапазона дат (определенного месяца или дня) в Cookbook MongoDB имеет очень хорошее объяснение по этому вопросу, но ниже - это то, что я опробовал самостоятельно и это работает.

items.save({
    name: "example",
    created_at: ISODate("2010-04-30T00:00:00.000Z")
})
items.find({
    created_at: {
        $gte: ISODate("2010-04-29T00:00:00.000Z"),
        $lt: ISODate("2010-05-01T00:00:00.000Z")
    }
})
=> { "_id" : ObjectId("4c0791e2b9ec877893f3363b"), "name" : "example", "created_at" : "Sun May 30 2010 00:00:00 GMT+0300 (EEST)" }

Основываясь на моих экспериментах, вам нужно будет сериализовать ваши даты в формате, поддерживаемом MongoDB, потому что следующее дало нежелательные результаты поиска.

items.save({
    name: "example",
    created_at: "Sun May 30 18.49:00 +0000 2010"
})
items.find({
    created_at: {
        $gte:"Mon May 30 18:47:00 +0000 2015",
        $lt: "Sun May 30 20:40:36 +0000 2010"
    }
})
=> { "_id" : ObjectId("4c079123b9ec877893f33638"), "name" : "example", "created_at" : "Sun May 30 18.49:00 +0000 2010" }

Во втором примере результаты не ожидались, но все же был получен один. Это связано с тем, что выполняется базовое сравнение строк.

431
ответ дан Dinei 28 August 2018 в 21:17
поделиться
db.collection.find({"createdDate":{$gte:new ISODate("2017-04-14T23:59:59Z"),$lte:new ISODate("2017-04-15T23:59:59Z")}}).count();

Замените collection именем коллекции, которую хотите выполнить запрос

6
ответ дан aldoWan 28 August 2018 в 21:17
поделиться

Python и pymongo

Поиск объектов между двумя датами в Python с pymongo в коллекции posts (на основе учебника ):

from_date = datetime.datetime(2010, 12, 31, 12, 30, 30, 125000)
to_date = datetime.datetime(2011, 12, 31, 12, 30, 30, 125000)

for post in posts.find({"date": {"$gte": from_date, "$lt": to_date}}):
    print(post)

Где {"$gte": from_date, "$lt": to_date} указывает диапазон в терминах типов datetime.datetime.

5
ответ дан Anton Tarasenko 28 August 2018 в 21:17
поделиться

Чтобы уточнить. Важно знать, что:

  • Да, вы должны передать объект Date Javascript.
  • Да, это должно быть ISODate friendly
  • Да, из моего опыта, чтобы это работало, вам нужно манипулировать датой ISO
  • Да, работает с датами, как правило, всегда утомительный процесс, а mongo не является исключением

. Вот рабочий фрагмент кода, где мы немного манипулируем датами для обеспечения Mongo (здесь я использую mongoose и хотите, чтобы результаты для строк, атрибут даты которых меньше (до) даты, заданной как параметр myDate), могут корректно обрабатывать:

var inputDate = new Date(myDate.toISOString());
MyModel.find({
    'date': { $lte: inputDate }
})
17
ответ дан arcseldon 28 August 2018 в 21:17
поделиться

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

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
<head>

    <script>
//jquery
    $(document).ready(function(){  
    $("#select_date").click(function() { 
    $.ajax({
    type: "post",
    url: "xxx", 
    datatype: "html",
    data: $("#period").serialize(),  
    success: function(data){
    alert(data);
    } ,//success

    }); //event triggered

    });//ajax
    });//jquery  
    </script>

    <title></title>
</head>

<body>
    <form id="period" name='period'>
        from <input id="selecteddate" name="selecteddate1" type="text"> to 
        <input id="select_date" type="button" value="selected">
    </form>
</body>
</html>

в моем файле py (python) я преобразовал его в «iso fomate» следующим образом

date_str1   = request.POST["SelectedDate1"] 
SelectedDate1   = datetime.datetime.strptime(date_str1, '%m/%d/%Y').isoformat()

и сохранен в моей коллекции dbmongo с помощью «SelectedDate» «как поле в моей коллекции

для извлечения данных или документов между двумя датами, которые я использовал в следующем запросе

db.collection.find( "SelectedDate": {'$gte': SelectedDate1,'$lt': SelectedDate2}})
0
ответ дан ayu for u 28 August 2018 в 21:17
поделиться

MongoDB фактически хранит миллины даты как int (64), как предписано http://bsonspec.org/#/specification

Однако, это может становится довольно запутанным, когда вы извлекаете даты, поскольку клиентский драйвер будет создавать экземпляр объекта даты с его собственным местным часовым поясом. Драйвер JavaScript в консоли mongo, безусловно, сделает это.

Итак, если вы заботитесь о своих часовых поясах, убедитесь, что знаете, что это должно быть, когда вы вернетесь. Это не должно иметь большого значения для запросов, поскольку оно все равно будет соответствовать одному и тому же int (64), независимо от того, в какой временной зоне находится объект даты (надеюсь). Но я бы определенно делал запросы с объектами фактической даты (не строки), и пусть драйвер делает свое дело.

16
ответ дан Ben Smith 28 August 2018 в 21:17
поделиться

Преобразуйте свои даты в часовой пояс GMT, когда вы набиваете их в Mongo. Таким образом, никогда не возникает проблема с часовым поясом. Затем просто сделайте математику в поле twitter / timezone, когда вы вытащите данные для презентации.

2
ответ дан Chris Seymour 28 August 2018 в 21:17
поделиться

используйте $ get и $ lt, чтобы найти данные даты в mongodb

var tomorrowDate = moment(new Date()).add(1, 'days').format("YYYY-MM-DD");
db.collection.find({"plannedDeliveryDate":{ $gte: new Date(tomorrowDate +"T00:00:00.000Z"),$lt: new Date(tomorrowDate + "T23:59:59.999Z")}})
0
ответ дан KARTHIKEYAN.A 28 August 2018 в 21:17
поделиться

Используйте этот код, чтобы найти запись между двумя датами, используя $gte и $lt:

db.CollectionName.find({"whenCreated": {
    '$gte': ISODate("2018-03-06T13:10:40.294Z"),
    '$lt': ISODate("2018-05-06T13:10:40.294Z")
}});
2
ответ дан sɐunıɔןɐqɐp 28 August 2018 в 21:17
поделиться

Почему бы не преобразовать строку в целое число формы YYYYMMDDHHMMSS? Каждое приращение времени создавало бы большее целое число, и вы могли бы фильтровать целые числа, а не беспокоиться о преобразовании в время ISO.

2
ответ дан ZacharyST 28 August 2018 в 21:17
поделиться
Другие вопросы по тегам:

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