Регистрация  |  Вход

DateTime в Dinamic SOQL

Привет,
Подскажите, а то что-то у меня вывих мозга случился.
Как правильно вставить 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 которая передается в функцию и в этой строке уже должны быть встроены все данные, чтобы их тоже не передавать через параметры в фукнцию.