Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Запрос работает в SQLExpress 2005 и не работает в SQLExpresss 2012  [new]
Иван2016
Member

Откуда:
Сообщений: 10
Уважаемые гуру, требуется ваша помощь.
Есть вот такой запрос:
SELECT * FROM [grdb].[dbo].[GTP_CurrentValues] WHERE  (YEAR(dt) = YEAR(GETDATE())) AND (MONTH(dt) = MONTH(GETDATE()))

и он замечательно работает в SQLExpress 2005.
Переношу задачу на новый сервер SQLExpress2012 (подобных запросов ТУЧА и они много сложнее) и результат - возвращается 0 строк. Если модифицировать его вот так -
SELECT * FROM [grdb].[dbo].[GTP_CurrentValues] WHERE  (YEAR(dt) = YEAR(GETDATE())) AND (MONTH(dt) = 1)
, т.е. конкретизировать значение второго параметра, выборка происходит корректно. Т.е. если несколько раз внутри одного запроса вызвать GETDATE(), получаем в итоге дырку от бублика, причем без ошибок.
Можно ли что-нибудь покрутить в настройках, чтобы существующие запросы таки работали? Можно, конечно, надекларить переменных и сформировать запрос, но этот вариант смерти подобен.
1 мар 16, 23:13    [18885021]     Ответить | Цитировать Сообщить модератору
 Re: Запрос работает в SQLExpress 2005 и не работает в SQLExpresss 2012  [new]
Иван2016
Member

Откуда:
Сообщений: 10
Еще добавлю: только что попробовал видоизменить запрос вот так:
SELECT * FROM [grdb].[dbo].[GTP_CurrentValues] WHERE  (YEAR(dt) = YEAR(GETDATE())) OR (MONTH(dt) = MONTH(GETDATE()))

- это работает. Т.е. сиквелу не нравится не сам факт множественного вызова GETDATE(), а именно AND!!! Как быть-то?
1 мар 16, 23:19    [18885051]     Ответить | Цитировать Сообщить модератору
 Re: Запрос работает в SQLExpress 2005 и не работает в SQLExpresss 2012  [new]
o-o
Guest
declare @t table(dt varchar(20));
insert into @t values ('01/03/2016')

set language us_english;

SELECT * 
FROM @t 
WHERE  (YEAR(dt) = YEAR(GETDATE())) AND (MONTH(dt) = MONTH(GETDATE()))

SELECT * 
FROM @t 
WHERE  (YEAR(dt) = 2016) AND (MONTH(dt) = 1)

set language russian;

SELECT * 
FROM @t 
WHERE  (YEAR(dt) = YEAR(GETDATE())) AND (MONTH(dt) = MONTH(GETDATE()))

SELECT * 
FROM @t 
WHERE  (YEAR(dt) = 2016) AND (MONTH(dt) = 1)
1 мар 16, 23:22    [18885059]     Ответить | Цитировать Сообщить модератору
 Re: Запрос работает в SQLExpress 2005 и не работает в SQLExpresss 2012  [new]
Иван2016
Member

Откуда:
Сообщений: 10
o-o
SELECT * 
FROM @t 
WHERE  (YEAR(dt) = YEAR(GETDATE())) AND (MONTH(dt) = MONTH(GETDATE()))


вот именно это уже и не работает...
1 мар 16, 23:26    [18885069]     Ответить | Цитировать Сообщить модератору
 Re: Запрос работает в SQLExpress 2005 и не работает в SQLExpresss 2012  [new]
Иван2016
Member

Откуда:
Сообщений: 10
Повторюсь еще раз: запросов подбного вида в задаче сотни, поэтому длинные модификации не прокатят. Решить это отдельными запросами я и сам могу... Хочу понять, откуда "ноги растут" и что делать.
1 мар 16, 23:28    [18885075]     Ответить | Цитировать Сообщить модератору
 Re: Запрос работает в SQLExpress 2005 и не работает в SQLExpresss 2012  [new]
o-o
Guest
то ж блин.
1. не храните дату строкой, храните датой
2. логину язык смените на тот, что на старом сервере был
3. вы запустили мой пример или нет??? на обоих языках не работает?
1 мар 16, 23:29    [18885079]     Ответить | Цитировать Сообщить модератору
 Re: Запрос работает в SQLExpress 2005 и не работает в SQLExpresss 2012  [new]
o-o
Guest
в строке 01/03/2016 месяц какой, 01 или 03?
1 мар 16, 23:31    [18885086]     Ответить | Цитировать Сообщить модератору
 Re: Запрос работает в SQLExpress 2005 и не работает в SQLExpresss 2012  [new]
Иван2016
Member

Откуда:
Сообщений: 10
o-o,

выполнил, вложил скриншот

К сообщению приложен файл. Размер - 146Kb
1 мар 16, 23:43    [18885106]     Ответить | Цитировать Сообщить модератору
 Re: Запрос работает в SQLExpress 2005 и не работает в SQLExpresss 2012  [new]
o-o
Guest
так я знаю, что там будет.
это ВЫ посмотрите внимательно и поймите,
что пара запросов (одинаковых) выдает РАЗНОЕ в зависимости от языка сессии.
в первом случае не ловит март, зато ловит январь.
во втором как раз наоборот.
код один и тот же, результаты разные, а дата одна и та же, 01/03/2016.
ну и у вас то же самое.
код и таблица одинаковые, а язык сессии другой
1 мар 16, 23:58    [18885118]     Ответить | Цитировать Сообщить модератору
 Re: Запрос работает в SQLExpress 2005 и не работает в SQLExpresss 2012  [new]
o-o
Guest
ну оставьте только запрос без конкретных года и месяца, раз не видите.
declare @t table(dt varchar(20));
insert into @t values ('01/03/2016')

set language us_english;

SELECT * 
FROM @t 
WHERE  (YEAR(dt) = YEAR(GETDATE())) AND (MONTH(dt) = MONTH(GETDATE()))

set language russian;

SELECT * 
FROM @t 
WHERE  (YEAR(dt) = YEAR(GETDATE())) AND (MONTH(dt) = MONTH(GETDATE()))
2 мар 16, 00:03    [18885127]     Ответить | Цитировать Сообщить модератору
 Re: Запрос работает в SQLExpress 2005 и не работает в SQLExpresss 2012  [new]
Иван2016
Member

Откуда:
Сообщений: 10
o-o
ну оставьте только запрос без конкретных года и месяца, раз не видите.
declare @t table(dt varchar(20));
insert into @t values ('01/03/2016')

set language us_english;

SELECT * 
FROM @t 
WHERE  (YEAR(dt) = YEAR(GETDATE())) AND (MONTH(dt) = MONTH(GETDATE()))

set language russian;

SELECT * 
FROM @t 
WHERE  (YEAR(dt) = YEAR(GETDATE())) AND (MONTH(dt) = MONTH(GETDATE()))


Благодарю Вас за помощь, вопрос закрыт!
Указанный Вами вариант не сработал, но решение оказалось верным (ниже поясню почему).
Хронология событий следующая:
1. Запускаю указанный Вами код - при английском языке выборки не происходит вообще.
2. Смотрю в настройки серверов (2005 и 2012) - язык по умолчанию русский.
3. У меня есть некоторая тонкость - приложение х86 запущено в среде с архитектурой х64 (SQL x86 на w2k8. Соответственно на каждом шагу имеем проблему с ошибкой вида "В указанном DSN архитектура драйвера и архитектура приложения не соответствуют друг другу." Поскольку серверные компоненты задачи написаны на разных языках и в разных средах (кросс-платформенная Qt + QODBCv3, МS VS2013 + .Net 4.x), приходится использовать различные DSN с одним именем, зарегистрированных из-под syswow64 и из панели управления. Именно в параметрах DSN и были языковые различия. Установил русский язык и все заработало.
4. А теперь инфо на заметку всем: опытным путем я установил, что если зарегистрированный в Management Studio серевер совпадает с регистрацией DSN, то студия начинает использовать для собственной работы именно этот DSN!!! Не думаю, что это фича, т.к. сложно без понимания этого факта найти "костыли". Именно поэтому мои запросы и не выполнялись! Изменил язык в DSN и запросы в студии также стали как миленькие работать, в том числе в приложении.
2 мар 16, 09:07    [18885668]     Ответить | Цитировать Сообщить модератору
 Re: Запрос работает в SQLExpress 2005 и не работает в SQLExpresss 2012  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31956
Иван2016
Изменил язык в DSN и запросы в студии также стали как миленькие работать, в том числе в приложении.
Ужас какой. О исправлении ошибок никто и не думает, как я понимаю?
Или так десятилетиями и будут задавать вопросы, типа:
Иван2016
Можно ли что-нибудь покрутить в настройках, чтобы существующие запросы таки работали? Можно, конечно, надекларить переменных и сформировать запрос, но этот вариант смерти подобен.
и ругать "глючный мелкософт"?
2 мар 16, 09:15    [18885700]     Ответить | Цитировать Сообщить модератору
 Re: Запрос работает в SQLExpress 2005 и не работает в SQLExpresss 2012  [new]
Glory
Member

Откуда:
Сообщений: 104751
https://technet.microsoft.com/en-us/library/ms190245(v=sql.105).aspx
2 мар 16, 09:40    [18885851]     Ответить | Цитировать Сообщить модератору
 Re: Запрос работает в SQLExpress 2005 и не работает в SQLExpresss 2012  [new]
Иван2016
Member

Откуда:
Сообщений: 10
Glory
https://technet.microsoft.com/en-us/library/ms190245(v=sql.105).aspx

Вот не поленился, внимательно все почитал по ссылке и нигде не нашел противоречий со своим кодом. В любом случае всем спасибо, вопрос решен!
2 мар 16, 10:57    [18886305]     Ответить | Цитировать Сообщить модератору
 Re: Запрос работает в SQLExpress 2005 и не работает в SQLExpresss 2012  [new]
Glory
Member

Откуда:
Сообщений: 104751
Иван2016
Вот не поленился, внимательно все почитал по ссылке и нигде не нашел противоречий со своим кодом.

Ваш код зависит о каких то региональных настроек.
А нормальный код - не зависит.
2 мар 16, 10:59    [18886322]     Ответить | Цитировать Сообщить модератору
 Re: Запрос работает в SQLExpress 2005 и не работает в SQLExpresss 2012  [new]
Иван2016
Member

Откуда:
Сообщений: 10
Glory
Иван2016
Вот не поленился, внимательно все почитал по ссылке и нигде не нашел противоречий со своим кодом.

Ваш код зависит о каких то региональных настроек.
А нормальный код - не зависит.

Glory
Иван2016
Вот не поленился, внимательно все почитал по ссылке и нигде не нашел противоречий со своим кодом.

Ваш код зависит о каких то региональных настроек.
А нормальный код - не зависит.

Ок, копаем дальше. Для пытливых умов жуем тему дальше.
Итак, посмотрел я внимательно еще раз на данные. Конкретный код нихт фунциклюрен по причине работы с данными, которые хранятся в формате '1998-02-23 10:00:00.123', который действительно не удовлетворяет требованиям указанной Вами статьи kb. Поскольку именно этот массив данных без изменений заливается с подлинкованного внешнего сервера (чужого), решение вроде бы лежит на поверхности: при импорте этого массива вырезать значения миллисекунд, но есть одно "НО": это как раз тот самый случай, когда "размер имеет значение". Т.е. в этом поле хранится метка времени, привязанная контроллером телемеханики к моменту измерений, которые происходят, замечу, 32 раза в секунду. Обрезать хвост - значит потерять возможность выполнения вычислений, для чего и существует данное ПО. Хранить по-другому - никак нельзя, т.к. разработчик ПО верхнего уровня регулярно меняет структуру и форматы данных без уведомлений. Так что приходится крутиться.
P.S. за ссылку спасибо - мой экспириенс заметно вырос :)
2 мар 16, 11:22    [18886539]     Ответить | Цитировать Сообщить модератору
 Re: Запрос работает в SQLExpress 2005 и не работает в SQLExpresss 2012  [new]
Glory
Member

Откуда:
Сообщений: 104751
Иван2016
Конкретный код нихт фунциклюрен по причине работы с данными, которые хранятся в формате '1998-02-23 10:00:00.123',

Для начала данные надо хранить в полях того типа, который лучше всего подходит для этих данных
Для дат лучше всего подходит тип данных datetime. У которого один единственный формат хранения
2 мар 16, 11:28    [18886585]     Ответить | Цитировать Сообщить модератору
 Re: Запрос работает в SQLExpress 2005 и не работает в SQLExpresss 2012  [new]
Иван2016
Member

Откуда:
Сообщений: 10
Glory,
Поскольку именно этот массив данных без изменений заливается с подлинкованного внешнего сервера (чужого)
2 мар 16, 11:43    [18886675]     Ответить | Цитировать Сообщить модератору
 Re: Запрос работает в SQLExpress 2005 и не работает в SQLExpresss 2012  [new]
Glory
Member

Откуда:
Сообщений: 104751
Иван2016
Поскольку именно этот массив данных без изменений заливается с подлинкованного внешнего сервера (чужого)

Чужая ошибка проектирования является индульгенцией для ее тиражирования ?
Что мешает создать _свои дополнительные_ поля к источнику "без изменений" ?
2 мар 16, 11:47    [18886708]     Ответить | Цитировать Сообщить модератору
 Re: Запрос работает в SQLExpress 2005 и не работает в SQLExpresss 2012  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Иван2016
Glory,
Поскольку именно этот массив данных без изменений заливается с подлинкованного внешнего сервера (чужого)
Так заливайте с изменениями.
Сразу в поле правильного типа.
Кстати, в указанном формате достаточно заменить пробел на латинскую букву T,
и дата всегда будет распознаваться однозначно.
Если строка в формате YYYY-MM-DDThh:mm:ss.nnn, конечно
2 мар 16, 11:53    [18886748]     Ответить | Цитировать Сообщить модератору
 Re: Запрос работает в SQLExpress 2005 и не работает в SQLExpresss 2012  [new]
Иван2016
Member

Откуда:
Сообщений: 10
Glory
Иван2016
Поскольку именно этот массив данных без изменений заливается с подлинкованного внешнего сервера (чужого)

Чужая ошибка проектирования является индульгенцией для ее тиражирования ?
Что мешает создать _свои дополнительные_ поля к источнику "без изменений" ?

Программа _сдана в промышленную эксплуатацию_ 2 года назад. Финансировать никакие телодвижения никто не будет, вышеописанный нюанс выявлен только при переходе на новый SQL и более производительное железо. Система управляет теплогенераторами суммарной мощностью около 500 МВт в час, каждый размером с 5-ти этажный дом. Любая неточность в расчетах приведет к _милионным_ штрафам в сутки. На изменения при этом никто не выделит _ни копейки_.
2 мар 16, 12:05    [18886807]     Ответить | Цитировать Сообщить модератору
 Re: Запрос работает в SQLExpress 2005 и не работает в SQLExpresss 2012  [new]
Glory
Member

Откуда:
Сообщений: 104751
Иван2016
Программа _сдана в промышленную эксплуатацию_ 2 года назад. Финансировать никакие телодвижения никто не будет, вышеописанный нюанс выявлен только при переходе на новый SQL и более производительное железо.

Этот "нюанс" не зависит ни от железа, ни от версии SQL.

ЗЫ
Кто-то кого-то просто напарил на бабки.
2 мар 16, 12:09    [18886822]     Ответить | Цитировать Сообщить модератору
 Re: Запрос работает в SQLExpress 2005 и не работает в SQLExpresss 2012  [new]
Тройка
Member

Откуда:
Сообщений: 88
Иван2016
Система управляет теплогенераторами суммарной мощностью около 500 МВт в час, каждый размером с 5-ти этажный дом.

Это печально((( Прям страшно жить, зная что такие системы могут быть настолько безграмотно сделаны(((
5 мар 16, 14:38    [18900531]     Ответить | Цитировать Сообщить модератору
 Re: Запрос работает в SQLExpress 2005 и не работает в SQLExpresss 2012  [new]
aleks2
Guest
Тройка
Иван2016
Система управляет теплогенераторами суммарной мощностью около 500 МВт в час, каждый размером с 5-ти этажный дом.

Это печально((( Прям страшно жить, зная что такие системы могут быть настолько безграмотно сделаны(((


Оне ишо вернутся... с вопросом: пачиму у нас медленно работает?!

Я так понимаю, что с экпресс они слезли из-за быстродействия
WHERE  (YEAR(dt) = YEAR(GETDATE())) AND (MONTH(dt) = MONTH(GETDATE()))
и еще не знают, что тут даже энтерпрайз будет бессилен.
5 мар 16, 16:07    [18900747]     Ответить | Цитировать Сообщить модератору
 Re: Запрос работает в SQLExpress 2005 и не работает в SQLExpresss 2012  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31956
Иван2016
Программа _сдана в промышленную эксплуатацию_ 2 года назад. Финансировать никакие телодвижения никто не будет, вышеописанный нюанс выявлен только при переходе на новый SQL и более производительное железо. Система управляет теплогенераторами суммарной мощностью около 500 МВт в час, каждый размером с 5-ти этажный дом. Любая неточность в расчетах приведет к _милионным_ штрафам в сутки. На изменения при этом никто не выделит _ни копейки_.
Что сказать, обычное дело, когда ответственные промышленные решения разрабатывают студенты-дилетанты, и что после внедрения и подписания актов все на всё забивают, даже не думая о необходимости техподдержки (хотя поддержка обычно предусматривается даже для вполне надёжных серийных решений вполне уважаемых фирм).
5 мар 16, 20:01    [18901359]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить