Страница 1 из 1

coalesce

Добавлено: 07 окт 2014, 09:34
novichok
Подскажите, почему
select schfact.dfact выдаёт дату, а
select coalesce(schfact.dfact,'') какое-то число, хрен знает откуда взятое?
И coalesce(schfact.dfact,0), и coalesce(schfact.dfact,#date(0,0,0000)) тоже выдают это число.

В запросе есть left join, поэтому юзаю coalesce, как же быть в такой ситуации?

Re: coalesce

Добавлено: 07 окт 2014, 11:06
RAJAH
В MS SQL "галактическая" дата хранится в виде числа: '2014-10-07' => '7DE-0A-07' => 7DE0A07 => 131992071. Надо преобразовывать!

Re: coalesce

Добавлено: 07 окт 2014, 11:23
novichok
Во дела! А как преобразовывать?

Re: coalesce

Добавлено: 07 окт 2014, 11:27
edward_K
#date(0,0,0000) плохо пашет. Попробуйте #date(1,1,1900). А вообще да - с пустыми датами есть проблема

Re: coalesce

Добавлено: 07 окт 2014, 11:43
novichok
#date(1,1,1900) тоже число выдаёт :-(

Re: coalesce

Добавлено: 07 окт 2014, 12:36
Den
Вам это запрос нужен чисто аналитический в саппорт/sql ?

Re: coalesce

Добавлено: 07 окт 2014, 13:22
novichok
Den писал(а):Вам это запрос нужен чисто аналитический в саппорт/sql ?
Нет, в vip-е пишу программу с этим запросом

Re: coalesce

Добавлено: 07 окт 2014, 14:00
RAJAH
novichok писал(а):
Den писал(а):Вам это запрос нужен чисто аналитический в саппорт/sql ?
Нет, в vip-е пишу программу с этим запросом
Тогда выведенное значение обработайте какой-нибудь функцией преобразования. Например...

Re: coalesce

Добавлено: 07 окт 2014, 14:43
Den
У меня код :

Код: Выделить всё

Interface ljoin;
 table struct tempdate
 (
   baseddoc :date
  ,nodoc    :string[20]
  ,soprddoc :date
 )
  ;
 create view
   from tempdate
  ;

HandleEvent
 Cminit:{

sql select basedoc.ddoc as baseddoc
          ,basedoc.nodoc  as nodoc
          ,coalesce(katsopr.dsopr,#date(0,0,0)) as soprddoc
          from basedoc inner join stepdoc on basedoc.nrec=stepdoc.cbasedoc and basedoc.viddoc=201
                       left join katsopr on stepdoc.nrec=katsopr.cstepdoc
  into tempdate byname;


            _loop tempdate
             logstrtofile('c:\debug\123.txt',tempdate.baseddoc+'----'+tempdate.nodoc+'----'+tempdate.soprddoc);

        }
end;
end.
кажет то даты намано высчитываются из накладных.

а вот если запустить сей dsql запрос из саппорт/sql то да - выводится как описано топикстартером.

Re: coalesce

Добавлено: 07 окт 2014, 15:55
novichok
Вот такой у меня запрос глючит:

Код: Выделить всё

stmt := sqlAllocStmt;
  sqlAddStr(query,'select katorg.name,grsopr.nsopr,grsopr.dsopr,katsopr.nsopr,katsopr.dsopr,katsopr.summa,katsopr.snalogs,');
  sqlAddStr(query,'coalesce(schfact.num,'#39+''#39+'),coalesce(schfact.dfact,'#39+''#39+'),');
  sqlAddStr(query,'grsopr.nrec,coalesce(gruzopol.name,'#39+''#39+'),');
  sqlAddStr(query,'basedoc.nodoc,basedoc.ddoc,basedoc.total,basedoc.nds,basedoc.nrec,');
  sqlAddStr(query,'coalesce(schfact.nrec,0) from grsopr ');
  sqlAddStr(query,'inner join katorg on grsopr.corg=katorg.nrec ');
  sqlAddStr(query,'left join katorg gruzopol on grsopr.cgruzto=gruzopol.nrec ');
  sqlAddStr(query,'inner join katsopr on katsopr.cgrsopr=grsopr.nrec ');
  sqlAddStr(query,'left join schfact on katsopr.cschfact=schfact.nrec ');
  sqlAddStr(query,'inner join stepdoc on katsopr.cstepdoc=stepdoc.nrec inner join basedoc on stepdoc.cbasedoc=basedoc.nrec ');
  sqlAddStr(query,'where grsopr.vidsopr=201 and katsopr.vidsopr=201 and katsopr.wadoc=0 ');
  sqlAddStr(query,'and (grsopr.dsopr between #date('+day(d_n)+','+month(d_n)+','+year(d_n)+') and #date('+day(d_k)+','+month(d_k)+','+year(d_k)+')) ');
  sqlAddStr(query,'order by katorg.name,coalesce(gruzopol.name,'#39+''#39+'),grsopr.dsopr,grsopr.nsopr,basedoc.ddoc,basedoc.nodoc,katsopr.dsopr,katsopr.nsopr');

  k_osh:=sqlPrepare(stmt,query);    
Буду по совету RAJAH преобразовывать перед выводом в excel.

Re: coalesce

Добавлено: 07 окт 2014, 20:38
Den

Код: Выделить всё

Interface ljoin;
 table struct tempdate
 (
   baseddoc :date
  ,nodoc    :string[20]
  ,soprddoc :date
 )
  ;
 create view
  var query,stmt :longint;

   from tempdate
  ;

HandleEvent
 Cminit:{
              stmt := sqlAllocStmt;
        	  sqlAddStr(query, ' select basedoc.ddoc as baseddoc');
        	  sqlAddStr(query, '       ,basedoc.nodoc  as nodoc');
        	  sqlAddStr(query, '       ,coalesce(katsopr.dsopr,#date(0,0,0)) as soprddoc');
        	  sqlAddStr(query, '   from basedoc inner join stepdoc on basedoc.nrec=stepdoc.cbasedoc and basedoc.viddoc=201');
        	  sqlAddStr(query, '       left join katsopr on stepdoc.nrec=katsopr.cstepdoc');
   			  sqlPrepare(stmt,query);
			  sqlExecute(stmt);
 				  if (sqlFetchInto(stmt,#tempdate) != tsOk)
				        Message('неудача :(');
			  	  sqlFreeStmt(stmt);


            _loop tempdate
             logstrtofile('c:\debug\123.txt',tempdate.baseddoc+'----'+tempdate.nodoc+'----'+tempdate.soprddoc);

        }
end;
end.
все работает