Привет,
Подскажите, а то что-то у меня вывих мозга случился.
Как правильно вставить DateTime в динамический SOQL (в query строку)
Например чисто для примера
найти все записи с CreatedDate < Datetime.now()
String query = "SELECT Id FROM Contact WHERE CreatedDate < "+ ...
Вместо ... надо вставить дату.
Если сделать просто DateTime.now() то итоговый SOQL сломается (выдаст ошибку)
Привет, Подскажите, а то что-то у меня вывих мозга случился. Как правильно вставить DateTime в динамический SOQL (в query строку) Например чисто для примера найти все записи с CreatedDate < Datetime.now() String query = "SELECT Id FROM Contact WHERE CreatedDate < "+ ... Вместо ... надо вставить дату. Если сделать просто DateTime.now() то итоговый SOQL сломается (выдаст ошибку)
Нашел вот такой пример
String dateTimeFormat = DateTime.now().format('yyyy-MM-dd\'T\'hh:mm:ss\'Z\'');
System.debug(Database.query('select Id from Account where CreatedDate = ' + dateTimeFormat));
Но что-то он не работает - какая-то лажа получается с временными зонами
Нашел вот такой [url=https://developer.salesforce.com/forums/ForumsMain?id=906F000000093IsIAI]пример[/url] [code] String dateTimeFormat = DateTime.now().format('yyyy-MM-dd\'T\'hh:mm:ss\'Z\''); System.debug(Database.query('select Id from Account where CreatedDate = ' + dateTimeFormat)); [/code] [color=red][i]это нерабочий пример, см следующее сообщение[/i][/color] Но что-то он не работает - какая-то лажа получается с временными зонами
Все, разобрался.
Проблема в том что format возвращает мне текстовое представление даты, но даты в моей локали. А в dinamic SOQL нужно вставлять текстовое представление даты но gmt+0 (наверное Z в конце на это указывает). А у меня получалось что я ищу по дате, но со смещение на n часов для моей зоны.
Заменил на formatGmt - заработало.
но почему в нете куча примеров именно с использованием именно format() непонятно!
О том что надо использовать formatGmt() нашел только в одном месте и то косвенно.
Все, разобрался. Проблема в том что format возвращает мне текстовое представление даты, но даты в моей локали. А в dinamic SOQL нужно вставлять текстовое представление даты но gmt+0 (наверное Z в конце на это указывает). А у меня получалось что я ищу по дате, но со смещение на n часов для моей зоны. [b]Заменил на formatGmt - заработало.[/b] но почему в нете куча примеров именно с использованием именно format() непонятно! О том что надо использовать formatGmt() нашел только в одном месте и то косвенно.
Вот небольшой эксперимент с датами:
Lead l = new Lead(Firstname='Test', Lastname='23de2');
insert l;
l = [SELECT Id, CreatedDate FROM Lead WHERE Id = :l.Id];
SYSTEM.DEBUG('XXXXX - 1 - '+l);
SYSTEM.DEBUG('XXXXX - 2 - '+DateTime.now());
SYSTEM.DEBUG('XXXXX - 3 - '+DateTime.now().format('yyyy-MM-dd\'T\'HH:mm:ss\'Z\''));
SYSTEM.DEBUG('XXXXX - 4 - '+DateTime.now().formatGmt('yyyy-MM-dd\'T\'HH:mm:ss\'Z\''));
delete l;
Вот что вернуло:
XXXXX - 1 - Lead:{CreatedDate=2014-10-15 10:36:03, Id=00Qg0000002o3MVEAY}
XXXXX - 2 - 2014-10-15 10:36:04
XXXXX - 3 - 2014-10-15T13:36:04Z
XXXXX - 4 - 2014-10-15T10:36:04Z
Вот небольшой эксперимент с датами: [code] Lead l = new Lead(Firstname='Test', Lastname='23de2'); insert l; l = [SELECT Id, CreatedDate FROM Lead WHERE Id = :l.Id]; SYSTEM.DEBUG('XXXXX - 1 - '+l); SYSTEM.DEBUG('XXXXX - 2 - '+DateTime.now()); SYSTEM.DEBUG('XXXXX - 3 - '+DateTime.now().format('yyyy-MM-dd\'T\'HH:mm:ss\'Z\'')); SYSTEM.DEBUG('XXXXX - 4 - '+DateTime.now().formatGmt('yyyy-MM-dd\'T\'HH:mm:ss\'Z\'')); delete l; [/code] Вот что вернуло: XXXXX - 1 - Lead:{CreatedDate=2014-10-15 10:36:03, Id=00Qg0000002o3MVEAY} XXXXX - 2 - 2014-10-15 10:36:04 XXXXX - 3 - 2014-10-15T13:36:04Z XXXXX - 4 - 2014-10-15T10:36:04Z
А не проще ли так:
DateTime dt = DateTime.now();
Database.query('select Id from Account where CreatedDate = :dt');
Параметр должен быть в той же области видимости что и динамический запрос.
А не проще ли так: [code] DateTime dt = DateTime.now(); Database.query('select Id from Account where CreatedDate = :dt'); [/code] Параметр должен быть в той же области видимости что и динамический запрос.
В том то и дело что не в одной области видимости. Формируется String query которая передается в функцию и в этой строке уже должны быть встроены все данные, чтобы их тоже не передавать через параметры в фукнцию.
[quote="Дима Лисовский"] Параметр должен быть в той же области видимости что и динамический запрос.[/quote] В том то и дело что не в одной области видимости. Формируется String query которая передается в функцию и в этой строке уже должны быть встроены все данные, чтобы их тоже не передавать через параметры в фукнцию.