Следует ли вам выбирать типы данных MONEY или DECIMAL (x, y) в SQL Server?

Я бы использовал регулярные выражения, так как вы не всегда можете использовать Linq для SQL.

Как этот пример Linq to Objects

List<string> list = new List<string>();
list.Add("This is a sentence.");
list.Add("This is another one.");
list.Add("C# is fun.");
list.Add("Linq is also fun.");

System.Text.RegularExpressions.Regex regEx = new System.Text.RegularExpressions.Regex("This");

var qry = list
    .Where<string>(item => regEx.IsMatch(item))
    .ToList<string>();

// Print results
foreach (var item in qry)
{
    Console.WriteLine(item);
}
402
задан Peter Mortensen 21 July 2018 в 16:14
поделиться

3 ответа

Никогда не должны Вы использовать деньги. Это не точно, и это - чистый мусор; всегда используйте десятичный/числовой.

Выполнение это для наблюдения то, что я имею в виду:

DECLARE
    @mon1 MONEY,
    @mon2 MONEY,
    @mon3 MONEY,
    @mon4 MONEY,
    @num1 DECIMAL(19,4),
    @num2 DECIMAL(19,4),
    @num3 DECIMAL(19,4),
    @num4 DECIMAL(19,4)

    SELECT
    @mon1 = 100, @mon2 = 339, @mon3 = 10000,
    @num1 = 100, @num2 = 339, @num3 = 10000

    SET @mon4 = @mon1/@mon2*@mon3
    SET @num4 = @num1/@num2*@num3

    SELECT @mon4 AS moneyresult,
    @num4 AS numericresult

Вывод: 2949.0000 2949.8525

некоторым людям, которые сказали, что Вы не делите деньги на деньги:

Вот один из моих запросов для вычисления корреляций и изменения, которое к деньгам дает неправильные результаты.

select t1.index_id,t2.index_id,(avg(t1.monret*t2.monret)
    -(avg(t1.monret) * avg(t2.monret)))
            /((sqrt(avg(square(t1.monret)) - square(avg(t1.monret))))
            *(sqrt(avg(square(t2.monret)) - square(avg(t2.monret))))),
current_timestamp,@MaxDate
            from Table1 t1  join Table1 t2  on t1.Date = traDate
            group by t1.index_id,t2.index_id
299
ответ дан Peter Mortensen 22 July 2018 в 02:14
поделиться

SQLMenace сказал, что деньги неточны. Но Вы не умножаетесь/делите деньги на деньги! Насколько времена за 3 доллара 50 центов? 150 dollarcents? Вы умножаетесь/делите деньги на скаляры, которые должны быть десятичными.

DECLARE
@mon1 MONEY,
@mon4 MONEY,
@num1 DECIMAL(19,4),
@num2 DECIMAL(19,4),
@num3 DECIMAL(19,4),
@num4 DECIMAL(19,4)

SELECT
@mon1 = 100,
@num1 = 100, @num2 = 339, @num3 = 10000

SET @mon4 = @mon1/@num2*@num3
SET @num4 = @num1/@num2*@num3

SELECT @mon4 AS moneyresult,
@num4 AS numericresult

Результаты в корректном результате:

moneyresult           numericresult
--------------------- ---------------------------------------
2949.8525             2949.8525

money хорошо, пока Вам не нужны больше чем 4 десятичных цифры, и Вы удостоверяетесь свои скаляры - которые не представляют деньги - decimal с.

261
ответ дан configurator 22 July 2018 в 02:14
поделиться
  • 1
    Кажется, что Dbq действительно поддерживает путь. – Mike Causer 29 January 2014 в 14:13

Я только что видел эту запись в блоге: Деньги против десятичных в SQL Server .

В основном это говорит о том, что у денег есть проблема с точностью ...

declare @m money
declare @d decimal(9,2)

set @m = 19.34
set @d = 19.34

select (@m/1000)*1000
select (@d/1000)*1000

Для денег ], вы получите 19.30 вместо 19.34. Я не уверен, существует ли сценарий приложения, в котором деньги делятся на 1000 частей для расчета, но этот пример действительно демонстрирует некоторые ограничения.

1
ответ дан 22 November 2019 в 23:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: