На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! информация о разделе
user posted imageДанный раздел предназначается исключительно для обсуждения вопросов использования языка запросов SQL. Обсуждение общих вопросов, связанных с тематикой баз данных - обсуждаем в разделе "Базы данных: общие вопросы". Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ.

Модераторы: Akina
Страницы: (3) 1 [2] 3  все  ( Перейти к последнему сообщению )  
> Непонятки с датой
    Цитата Vit @ 31.12.04, 15:25
    Примерно так: (это лучше чем использование строк)

    Я так собственно и сделал, но! Проблема, как выяснилось не решилась - на домашнем компьютере работает, а на чужом нет - вылетает исключение из-за формата даты!
      Цитата .alex,2.01.05, 18:08 @
      на домашнем компьютере работает, а на чужом нет - вылетает исключение из-за формата даты!


      глянуть можешь на удаленном компе Язык и региональные стандарты -> Формат даты и сравнить у себя?
        Цитата Lavrik,2.01.05, 14:44 @
        глянуть можешь на удаленном компе Язык и региональные стандарты -> Формат даты и сравнить у себя?

        Дело в том, что у меня есть доступ только к sql server'y, а про формат даты смогу узнать только числа 10ого :( Неужели нет какого-нибудь универсального способа?
          Можно установить у себя в проге нужный формат.
          DateSeparator='.';
          ShortDateFormat="dd.mm.yyyy";

          Добавлено
          Цитата .alex,2.01.05, 14:04 @
          Неужели нет какого-нибудь универсального способа

          Передавать как число.
            Цитата Bas,2.01.05, 15:55 @
            Можно установить у себя в проге нужный формат.
            DateSeparator='.';
            ShortDateFormat="dd.mm.yyyy";

            ОК, проверю.
            Цитата Bas,2.01.05, 15:55 @
            Передавать как число.

            Это как? Типа тип данных не datetime, а просто целочисленный сделать?
              Может использовать CONVERT , особое внимание на третий параметр. Нелпа нет так что взглянуть негде :huh:
                тут чтото другое.
                когда квери получает дату как параметр, пример из моеи проги
                ExpandedWrap disabled
                   ADOQuery1.Close;
                    ADOQuery1.SQL.Clear;
                    ADOQuery1.SQL.Add('SELECT Gacdena.PerID, VPerson.person, VPerson.gankofileba, Gacdena.DateOn, Gacdena.DateOff, Gacdena.Mizezi, ');
                    ADOQuery1.SQL.Add('Gacdena.BNumber, Gacdena.BSeries, Gacdena.BDateOn, Gacdena.BDateOff, Gacdena.Biuletini, Gacdena.Doctor, ');
                    ADOQuery1.SQL.Add('Gacdena.Clinic, DATEDIFF(DD, Gacdena.DateOn, Gacdena.DateOff) + 1 AS Interval, Metka.PerID AS PerID1');
                    ADOQuery1.SQL.Add('FROM Gacdena INNER JOIN VPerson ON Gacdena.PerID = VPerson.perID LEFT OUTER JOIN Metka ON Gacdena.PerID = Metka.PerID');
                    ADOQuery1.SQL.Add('WHERE Gacdena.DateOff IS NOT NULL AND Gacdena.DateOn <= :DTP2 AND Gacdena.DateOff >= :DTP1');
                    ADOQuery1.SQL.Add('ORDER BY Metka.PerID DESC, VPerson.person, Gacdena.DateOn');
                    ADOQuery1.Parameters.ParamByName('DTP1').Value := DTP1.Date;
                    ADOQuery1.Parameters.ParamByName('DTP2').Value := DTP2.Date;
                    ADOQuery1.Open
                и когда он связан с SQL Server-ом запрос передает так, я скопировал запрос из профаилера
                ExpandedWrap disabled
                  sp_executesql N'SELECT Gacdena.PerID, VPerson.person, VPerson.gankofileba, Gacdena.DateOn, Gacdena.DateOff, Gacdena.Mizezi,
                  Gacdena.BNumber, Gacdena.BSeries, Gacdena.BDateOn, Gacdena.BDateOff, Gacdena.Biuletini, Gacdena.Doctor,
                  Gacdena.Clinic, DATEDIFF(DD, Gacdena.DateOn, Gacdena.DateOff) + 1 AS Interval, Metka.PerID AS PerID1
                  FROM Gacdena INNER JOIN VPerson ON Gacdena.PerID = VPerson.perID LEFT OUTER JOIN Metka ON Gacdena.PerID = Metka.PerID
                  WHERE Gacdena.DateOff IS NOT NULL AND Gacdena.DateOn <= @P1 AND Gacdena.DateOff >= @P2
                  ORDER BY Metka.PerID DESC, VPerson.person, Gacdena.DateOn
                  ', N'@P1 datetime,@P2 datetime', '20050103 00:00:00:000', '20050101 00:00:00:000'
                когда квери получает дату как параметр, если конечно получает коректно, то далше уже система гарантирует правилные переобразования.
                исходя из етого, если в программе нписано
                ExpandedWrap disabled
                  pszSQLQuery.Parameters.ParamByName('D1').Value := dtpBegin.DateTime
                проблем не далжно быть, так как dtpBegin.DateTime тоже автоматически генерирует система.
                у меня смутные подозрения на счет того, что гдето тип данных не DateTime а чтото другое, и соответственно в том месте не правилно производится конвертация.
                .alex устонави на тои, чужои машине делфи, и в пошаговом режиме погляди все переобразования.
                  Цитата Kobra,3.01.05, 10:13 @
                  .alex устонави на тои, чужои машине делфи, и в пошаговом режиме погляди все переобразования.

                  Незя...
                  Цитата Kobra,3.01.05, 10:13 @
                  проблем не далжно быть, так как dtpBegin.DateTime тоже автоматически генерирует система.
                  у меня смутные подозрения на счет того, что гдето тип данных не DateTime а чтото другое, и соответственно в том месте не правилно производится конвертация.

                  Может проблема, в том что я использую свойство DateTime, а не Date у TDateTimePicker'a? Просто когда я переносил базу, я сначала экспортировал её в access'вскую, а потом обратно импортировал в ms sql, может в процессе экспорта/импорта поменялся тип данных поля DateM? У меня сейчас нет возможности проверить, но ваще такое возможно?
                    Цитата .alex,3.01.05, 17:57 @
                    Может проблема, в том что я использую свойство DateTime, а не Date у TDateTimePicker'a?

                    если в своистве Time TDateTimePicker-а стоит "0" то резултат только дата, а если чтото другое - то дата время, так что ета без разницы. протестируи, сам увидиш.

                    Цитата .alex,3.01.05, 17:57 @
                    У меня сейчас нет возможности проверить, но ваще такое возможно?
                    с аксесом не знаком, но что значит не могу проверить? кто мешает на своем компе протестировать аналогичную ситуацию?

                    и вообше, почему
                    Цитата .alex,3.01.05, 17:57 @
                    Незя...
                    на том компе установить своии штуки для тестировки? извени, у меня такого ограничения не бывало и не понемаю смысл.
                      Цитата Kobra,4.01.05, 09:47 @
                      кто мешает на своем компе протестировать аналогичную ситуацию?

                      Проверю, просто тогда не мог.
                      Цитата Kobra,4.01.05, 09:47 @
                      и вообше, почему Цитата (.alex @ 3.01.05 17:57)
                      на том компе установить своии штуки для тестировки? извени, у меня такого ограничения не бывало и не понемаю смысл.

                      Я устанавливал свои штуки не на том компе, на котором стоит сервер, а на другом, который находиться с ним в сети, а делфи я на сервере поставить не могу!
                      Цитата Kobra,3.01.05, 10:13 @
                      и когда он связан с SQL Server-ом запрос передает так, я скопировал запрос из профаилера

                      Где находится этот профайлер?
                        профаилер можно вызвать из ентерпраиз менеджера. ето одна из сервисних програм SQL Server-а. чтото на подобии борландовского SQL Monitor-а.
                          Короче профайлер после моего запроса: (где pszCells - это строка вида: CELLId = 1 OR CELLId = 2 OR CELLId = 3, dtpBegin и dtpEnd - это объекты класса TDateTimePicker, а lbCounters - это объект класса TListBox)
                          ExpandedWrap disabled
                            SQL.Add('SELECT val, DateM FROM INTCELL WITH (NOLOCK)');
                            SQL.Add('WHERE (DateM >= :D1 AND DateM <= :D2) AND (' + pszCells + ')');
                            SQL.Add('AND (CounterId = :P1) ORDER BY DateM ASC');
                            Parameters.ParamByName('D1').Value := dtpBegin.DateTime;
                            Parameters.ParamByName('D2').Value := dtpEnd.DateTime;
                            Parameters.ParamByName('P1').Value := lbCounters.ItemIndex + 1;

                          показывает следующий запрос:
                          ExpandedWrap disabled
                            exec sp_executesql N'SELECT val, DateM FROM INTCELL WITH (NOLOCK)
                            WHERE (DateM >= @P1 AND DateM <= @P2) AND (CELLId = 1 OR CELLId = 2 OR CELLId = 3)
                            AND (CounterId = @P3) ORDER BY DateM ASC
                            ', N'@P1 datetime,@P2 datetime,@P3 int', 'Dec 17 2004 10:27PM', 'Dec 24 2004 10:27PM', 1

                          Что-то я не понимаю почему он так извращает дату.
                          И ещё, почему-то перестало работать условие:
                          ExpandedWrap disabled
                            (DateM >= :D1 AND DateM <= :D2)

                          Все данные у меня записаны на 18 число декабря 2004г, раньше выборка работала правильно, а теперь только если я ставлю начало интервала, т.е. dtpBegin, на 17 число. :wacko:

                          Добавлено
                          И исчё! Зачем нужно:
                          ExpandedWrap disabled
                            pszSQLQuery.Parameters.ParseSQL(XXX, true);
                            на месте
                            ExpandedWrap disabled
                              dtpBegin.DateTime
                            напиши
                            ExpandedWrap disabled
                              dtpBegin.Date
                            и
                            Цитата Kobra,4.01.05, 09:47 @
                            если в своистве Time TDateTimePicker-а стоит "0" то резултат только дата
                            а ты передаеш и дату и время, соответственно
                            'Dec 18 2004 10:27PM' в лубом случае болше 'Dec 18 2004' и выборки нет.

                            'Dec 17 2004 10:27PM' в лубом случае менше 'Dec 18 2004' и выборки нормалная.

                            ExpandedWrap disabled
                              pszSQLQuery.Parameters.ParseSQL(XXX, true);
                            ето харошыи тон, лично я почти никогда не пишу так как ета орерация всеравно выполняется.


                            Цитата .alex,5.01.05, 17:01 @
                            Что-то я не понимаю почему он так извращает дату.
                            он приводит дату в тот вид, какои нравится на SQL Server-у.
                            как время убереш, наверняка заработает. вроде запрос правилно передается.
                              Цитата Kobra,5.01.05, 18:06 @
                              а ты передаеш и дату и время, соответственно
                              'Dec 18 2004 10:27PM' в лубом случае болше 'Dec 18 2004' и выборки нет.
                              'Dec 17 2004 10:27PM' в лубом случае менше 'Dec 18 2004' и выборки нормалная.

                              Понял.
                              Цитата Kobra,5.01.05, 18:06 @
                              если в своистве Time TDateTimePicker-а стоит "0" то резултат только дата

                              Изменил DateTime на Date и поставил в свойстве Time у обоих TDateTimePicker - 0:00:00. Все равно передаётся вместе с датой и время:
                              ExpandedWrap disabled
                                exec sp_executesql N'SELECT val, DateM FROM INTCELL WITH (NOLOCK)
                                WHERE (DateM >= @P1 AND DateM <= @P2) AND (CELLId = 1)
                                AND (CounterId = @P3) ORDER BY DateM ASC
                                ', N'@P1 datetime,@P2 datetime,@P3 int', 'Dec 18 2004 12:00AM', 'Dec 24 2004 12:00AM', 1

                              Цитата Kobra,5.01.05, 18:06 @
                              ето харошыи тон, лично я почти никогда не пишу так как ета орерация всеравно выполняется.

                              Я тоже сначала так подумал, но после того как посмотрел в профайлер, решил спросить, ибо когда я ставлю эту строчку:
                              ExpandedWrap disabled
                                SQL.Add('SELECT val, DateM FROM INTCELL WITH (NOLOCK)');
                                SQL.Add('WHERE (DateM >= :D1 AND DateM <= :D2) AND (' + pszCells + ')');
                                SQL.Add('AND (CounterId = :P1) ORDER BY DateM ASC');
                                Parameters.ParseSQL(SQL.Text, TRUE);
                                Parameters.ParamByName('D1').Value := dtpBegin.Date;
                                Parameters.ParamByName('D2').Value := dtpEnd.Date;
                                Parameters.ParamByName('P1').Value := Integer(lbCounters.Items.Objects[lbCounters.ItemIndex]);

                              дата приводиться к float :wacko:
                              ExpandedWrap disabled
                                exec sp_executesql N'SELECT val, DateM FROM INTCELL WITH (NOLOCK)
                                WHERE (DateM >= @P1 AND DateM <= @P2) AND (CELLId = 1)
                                AND (CounterId = @P3) ORDER BY DateM ASC
                                ', N'@P1 float,@P2 float,@P3 int', 3.833900000000000e+004, 3.834500000000000e+004, 1

                              Это нормально? :wall:
                              Сообщение отредактировано: .alex -
                                'Dec 18 2004 12:00AM' ето настроики такие и потому, если перефразировать получится "18,12,2004 00:00:00" так что ето не страшно.

                                Цитата .alex,5.01.05, 18:19 @
                                дата приводиться к float
                                веть дата-время хранится как число, так что система сама определяет в каком виде для него будет удобнее получить данные. ето нормално.

                                протести такои вариант
                                ExpandedWrap disabled
                                  Parameters.ParamByName('D1').Value := StrToDate(datetostr(dtpBegin.Date));
                                не зависимо от устоновок DateTimePicker-а отсекает время.
                                Сообщение отредактировано: Kobra -
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) 1 [2] 3  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0648 ]   [ 15 queries used ]   [ Generated: 28.04.24, 07:18 GMT ]