Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: STDistance (geography Data Type мать её)

Цель - определить расстояние по географическим координатам
Берём пример из , чуть меняем его:
DECLARE @g geography;  
DECLARE @h geography;  
SET @g = geography::STGeomFromText('POINT(55.000000 33.000000)', 4326);  
SET @h = geography::STGeomFromText('POINT(55.000000 34.000000)', 4326);  
SELECT @g.STDistance(@h) AS STDistance;  
-- Моя рукописная функция, см. спойлер
SELECT [dbo].[fnAddressGeoDist](55.000000, 33.000000, 55.000000, 34.000000) AS AddressGeoDist

Получаем:
STDistance AddressGeoDist
110913.39893372463778

Яндекс карты, мат. формулы, глобус и здравый смысл подсказывают, что длина параллели на широте 55 град = 63995 метров
Так какого хрена STDistance выдаёт чёрт знает что?!
:(
первый час ночи...
+ fnAddressGeoDist
/*ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
	Функция определяет расстояние между точками 1 и 2 по их координатам.
	X - Широта, Y - Долгота, 6371000 - радиус земли в метрах
	31.03.2015
*/
ALTER FUNCTION [dbo].[fnAddressGeoDist] ( @Pos1X DECIMAL(9,6), 
					  @Pos1Y DECIMAL(9,6), 
					  @Pos2X DECIMAL(9,6), 
					  @Pos2Y DECIMAL(9,6)
) RETURNS int
AS
BEGIN
	DECLARE @Dist int
/*
	cos(d) = sin(φА)·sin(φB) + cos(φА)·cos(φB)·cos(λА − λB),
		где φА и φB — широты, λА, λB — долготы данных пунктов, d — расстояние между пунктами, измеряемое в радианах длиной дуги большого круга земного шара. 
	Расстояние между пунктами, измеряемое в километрах, определяется по формуле:
		L = d·R, где R = 6371 км — средний радиус земного шара.
*/
	SET @Dist = 6371000 * 2 * ASIN(SQRT(
      POWER(SIN((@Pos1X - ABS(@Pos2X)) * PI()/180 / 2), 2) +
      COS(@Pos1X * PI()/180) *
      COS(ABS(@Pos2X) * PI()/180) *
      POWER(SIN((@Pos1Y - @Pos2Y) * PI()/180 / 2), 2)
    ))
	RETURN @Dist
END
Ответ:
iap
Bryk_Alien
Всё бл.!!
Пол часа писал, нажал "отправить" и осенило!
Надо поменять координаты широты и долготы местами
ска
Надо ещё учесть, что Земля не шар.
MSSQL использует модель в виде эллипсоида вращения.

Это я на вычисления в спойлере посмотрел.

Не надо ничего учитывать, можно пользоваться STDistance. Все уже там учтено, кроме того, что Микрософт опять пошла своим путем. Если во всем мире принято, что геокоординаты задаются в формате Широта-Долгота, то она использует Долгота-Широта.

declare @SRID int = 4326 -- идентификатор пространственной ссылки, который определяет в том числе среднюю  длину меридиана
--Точки на экваторе
DECLARE @g0 geography = geography::STPointFromText('POINT(0 0)', @SRID) -- Долгота - Гринвич, градус = 0, широта - экватор (0)
DECLARE @h0 geography = geography::STPointFromText('POINT(1 0)', @SRID) -- Долгота - Гринвич, градус = 1, широта - экватор (0)
SELECT @h0.STDistance(@g0) / 60,  @g0.Lat as Lat0, @g0.Long as Long0, @h0.Lat as Lat1, @h0.Long as long1
--Точки на 45 широте
DECLARE @g45 geography  = geography::STPointFromText('POINT(0 45)', @SRID) -- Долгота - Гринвич, градус = 0, широта - 45-ая
DECLARE @h45 geography = geography::STPointFromText('POINT(1 45)', @SRID)  -- Долгота - Гринвич, градус = 1, широта - 45-ая
SELECT  @h45.STDistance(@g45) /60 as Distance, @g45.Lat as Lat0, @g45.Long as Long0, @h45.Lat as Lat1, @h45.Long as long1

Первый select, как и положено, дает морскую милю, которая примерно равна одной градусной минуте меридиана и экватора. Второй, как и положено - меньше

Distance Lat0 Long0 Lat1 long1
1855,32484559809 0 0 0 1


Distance Lat0 Long0 Lat1 long1
1314,10557844484 45 0 45 1

Несколько часов бился, пока понял в чем причина
Может поможет кому, а то в интернетах самые фантастические предположения, что надо SRID другой использовать или то, что результат выдается в градусах
Вопрос: STDistance (geography Data Type мать её)

Цель - определить расстояние по географическим координатам
Берём пример из , чуть меняем его:
DECLARE @g geography;  
DECLARE @h geography;  
SET @g = geography::STGeomFromText('POINT(55.000000 33.000000)', 4326);  
SET @h = geography::STGeomFromText('POINT(55.000000 34.000000)', 4326);  
SELECT @g.STDistance(@h) AS STDistance;  
-- Моя рукописная функция, см. спойлер
SELECT [dbo].[fnAddressGeoDist](55.000000, 33.000000, 55.000000, 34.000000) AS AddressGeoDist

Получаем:
STDistance AddressGeoDist
110913.39893372463778

Яндекс карты, мат. формулы, глобус и здравый смысл подсказывают, что длина параллели на широте 55 град = 63995 метров
Так какого хрена STDistance выдаёт чёрт знает что?!
:(
первый час ночи...
+ fnAddressGeoDist
/*ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
	Функция определяет расстояние между точками 1 и 2 по их координатам.
	X - Широта, Y - Долгота, 6371000 - радиус земли в метрах
	31.03.2015
*/
ALTER FUNCTION [dbo].[fnAddressGeoDist] ( @Pos1X DECIMAL(9,6), 
					  @Pos1Y DECIMAL(9,6), 
					  @Pos2X DECIMAL(9,6), 
					  @Pos2Y DECIMAL(9,6)
) RETURNS int
AS
BEGIN
	DECLARE @Dist int
/*
	cos(d) = sin(φА)·sin(φB) + cos(φА)·cos(φB)·cos(λА − λB),
		где φА и φB — широты, λА, λB — долготы данных пунктов, d — расстояние между пунктами, измеряемое в радианах длиной дуги большого круга земного шара. 
	Расстояние между пунктами, измеряемое в километрах, определяется по формуле:
		L = d·R, где R = 6371 км — средний радиус земного шара.
*/
	SET @Dist = 6371000 * 2 * ASIN(SQRT(
      POWER(SIN((@Pos1X - ABS(@Pos2X)) * PI()/180 / 2), 2) +
      COS(@Pos1X * PI()/180) *
      COS(ABS(@Pos2X) * PI()/180) *
      POWER(SIN((@Pos1Y - @Pos2Y) * PI()/180 / 2), 2)
    ))
	RETURN @Dist
END
Ответ:
Bryk_Alien
Всё бл.!!
Пол часа писал, нажал "отправить" и осенило!
Надо поменять координаты широты и долготы местами
ска
Надо ещё учесть, что Земля не шар.
MSSQL использует модель в виде эллипсоида вращения.

Это я на вычисления в спойлере посмотрел.
Вопрос: The conversion of a varchar data type to a datetime data type resulted in an out-of-range

Помогите сконвертировать datetime в smalldate:

		declare @d datetime = '2014-10-30 23:00:00.000'
			select cast(@d as smalldatetime)


Получаю ошибку
Msg 242, Level 16, State 3, Line 1
The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.


Есть какой-то универсальный способ конвертации?
Ответ: invm, Glory, Maxx

Спасибо, разобрался.
Дело было в ограничении smalldate (до 2079 года) и датами, которые не вписывались в это ограничение, но находились в таблице.

Всем спасибо еще раз.
Вопрос: как исправить ошибку 8117 Operand data type varchar is invalid for sum operator.

Здравствуйте, подскажите, пожалуйста, как можно обойти эту ошибку?

Есть поле формата vharChar(2000), в нем идет запись значений в цифрах. По этому полю нужно просчитать сумму:

select Sum(A)
from table1
В итоге получаю ошибку 8117.
Пробовала использовать функции конвертации:
1. select SUM (convert(int,A))
from table1

В итоге Сообщение 245, уровень 16, состояние 1, строка 25
Conversion failed when converting the varchar value '1
' to data type int.

2. select SUM (Sum(isnull(cast(A as float),0)))
from table1

Сообщение 8114, уровень 16, состояние 5, строка 16
Error converting data type varchar to float.

Как корректно посчитать сумму? Заранее спасибо за помощь!
Ответ:
tanya.avapu
но пользователь в него вносит числовое значение.

И что/кто помешает ему внести туда нечисловое значение ?
Вопрос: Custom data type и JDBC

Доброго времени суток.

Начинаю разбираться с PostgreSQL. Кто мне может объяснить, как правильно работать с custom data type'ами из JDBC?

Имеется в виду типы, которые создаются на уровне БД при помощи CREATE TYPE.....
Как их правильно map'ить на Java class'ы без использования ORM'ов(JPA, Hibernate, etc)? Т.е. интересует именно голый JDBC(максимум Spring JDBC Temlpates)

Гуглил, гуглил... чего-то ничего толкового не нашел..


Спасибо.
Ответ: kolobok2016,

а, обознался.

спутал с
Вопрос: node unsupported data type

В текущем унаследованном приложении есть кусочек на node.js, который обращается к процедурам БД,
получает данные через типы, и отдает дальше уже в json

Ранее для разных видов данных создавались соответствующие типы, без вложенности,
на них тип вида таблицы, что-то вроде
create or replace type t_key_value_tab force is table of t_key_value

и процедура return t_key_value_tab pipelined;

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

Создал соответствующие типы, как матрешка, и был готов отдать ноде.
Но нодист сказал, что у него выходит ошибка
NJS-010: unsupported data type in select list

Вопрос - кто либо делал связку oracle-node через сложные типы? В доке по ноде я вижу, что указаны только простые

Но может кто-либо находил решение.
Спасибо
Ответ: Мутаген,
хорошее решение, но не зависящее от меня.
Как вариант я могу и так собрать json , сделать из него clob и отдать.
Вопрос: Ошибка Argument data type numeric is invalid for argument 3 of substring function

Доброго времени суток, коллеги возник случай
Вендор используемого ПО в нашей конторе, прислал скрипт ХП t-sql, который при попытке добавить его на сервер выдает ошибку:
Argument data type numeric is invalid for argument 3 of substring function

на мою просьбу исправить данную ошибку вендор прислал сл. ответ, цитирую:
"Такая ошибка Вы ходит на неподдерживаемой версии MS SQL сервера. Видимо, у Вас 2005 сервер? Вам необходимо установить 2014"

сервера 2014 под рукой нет проверить не могу. насколько я понял из документации аргумент length - Is a positive integer or bigint expression that specifies how many characters of the expression will be returned. Меня пытаются надурить или я что то не знаю?

declare @test numeric(15,0)
set @test = 8
select substring('testtesttest',1,@test)
проверьте на 2014 кто может, спс заранее.
Ответ:
alexeyvg
redsunrise
проверьте на 2014 кто может, спс заранее.
И на 2008 работает, и на 2014. На 2005 не проверял, нету под рукой

alexeyvg спасибо.
Вопрос: Operand data type float is invalid for modulo operator

Здравствуйте.Operand data type float is invalid for modulo operator что это значит и как исправить?
Ответ: сами почитайте:
Вопрос: FB 3.0.1 Invalid data type for negation (minus operator)

Привет!

FB 3.0.1 (WI-V6.3.1.32609 Firebird 3.0)

На запрос

select 1 from TABLE1 where id = - :param


ругается:

expression evaluation not supported.
Invalid data type for negation (minus operator).

поле id в table1 типа integer
Я правильно понимаю, что это косяк в сервере или это какое-то странное новшество в FB 3?
В FB 2.5. это работало.
В FB 3 - помогает cast параметра к integer, но это же какой-то изврат...
Ответ:
Симонов Денис
судя по комментарию Адриано это багом не считает.
А мы с ним поспорим
Вопрос: The conversion of a varchar data type to a datetime data type resulted in an out-of-range value

Пытаюсь заполнить таблицу базы данных:

SQL
1
2
3
4
5
USE CommercialNetworkSkript
GO 
 
INSERT INTO Товар
VALUES (1,'продовольственный','молоко', 1, '24082016', 30)
Возникает ошибка:
Msg 242, Level 16, State 3, Line 140
The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.
The statement has been terminated.

Таблица:
SQL
1
2
3
4
5
6
7
8
CREATE TABLE Товар (
код_товара INT PRIMARY KEY,
тип VARCHAR(40),
название VARCHAR(40),
код_производителя INT,
дата_изготовления DATETIME,
срок_годности INT,
)
Ответ:
Сообщение от i-sm
С этим трудно не согласиться, но совершенно непонятно, как это должно помочь в решении проблемы.
Вам непонятно, или вы решили обидеть автора топика?

Он давно все прекрасно понял, гораздо раньше вашего ответа поставил спасибку и не задал ни одного уточняющего вопроса.