Pertanyaan Bagaimana cara menghitung digit setelah titik desimal dalam kolom float dalam ms sql?


Saya harus menghitung digit setelah titik desimal dalam database yang di-host oleh MS Sql Server (2005 atau 2008 tidak masalah), untuk memperbaiki beberapa kesalahan yang dibuat oleh pengguna. Saya memiliki masalah yang sama pada database Oracle, tetapi ada hal-hal yang kurang rumit. Intinya adalah pada Oracle yang dipilih adalah:

select length( substr(to_char(MY_FIELD), instr(to_char(MY_FILED),'.',1,1)+1, length(to_char(MY_FILED)))) as digits_length
from MY_TABLE

di mana file yang disimpan My_filed adalah float (38).

Pada server Ms Sql saya mencoba menggunakan:

select LEN(SUBSTRING(CAST(MY_FIELD AS VARCHAR), CHARINDEX('.',CAST(MY_FILED AS VARCHAR),1)+1, LEN(CAST(MY_FIELD AS VARCHAR)))) as digits_length
from MY_TABLE

Masalahnya adalah bahwa pada MS Sql Server, ketika saya melemparkan MY_FIELD sebagai varchar nomor float dipotong oleh hanya 2 desimal dan hitungan digit salah. Bisakah seseorang memberi saya petunjuk?

Salam Hormat.


5
2017-12-19 13:08


asal


Jawaban:


SELECT 
LEN(CAST(REVERSE(SUBSTRING(STR(MY_FIELD, 13, 11), CHARINDEX('.', STR(MY_FIELD, 13, 11)) + 1, 20)) AS decimal)) 
from TABLE

6
2017-07-04 09:17



Saya telah menerima dari teman saya solusi yang sangat sederhana yang luar biasa. Jadi saya akan posting solusi untuk membantu orang lain di posisi yang sama dengan saya.

Pertama, buat fungsi:

create FUNCTION dbo.countDigits(@A float) RETURNS tinyint AS
BEGIN
declare @R tinyint
IF @A IS NULL 
   RETURN NULL
set @R = 0
while @A - str(@A, 18 + @R, @r) <> 0
begin
   SET @R = @R + 1
end
RETURN @R
END
GO

Kedua:

select MY_FIELD,
dbo.countDigits(MY_FIELD) 
from MY_TABLE

Dengan menggunakan fungsi ini, Anda akan mendapatkan jumlah digit yang tepat setelah titik desimal.


5
2017-12-20 09:31



Hal pertama adalah beralih menggunakan CONVERT daripada CAST. Perbedaannya adalah, dengan CONVERT, Anda dapat menentukan kode format. CAST menggunakan kode format default apa pun adalah:

Ketika ekspresi mengambang atau nyata, gaya dapat menjadi salah satu nilai yang ditampilkan dalam tabel berikut. Nilai lainnya diproses sebagai 0.

Tidak ada satupun format yang sangat menarik, tetapi saya pikir yang terbaik untuk Anda gunakan adalah 2. Jadi itu akan menjadi:

CONVERT(varchar(25),MY_FIELD,2)

Sayangnya, ini akan memberi Anda nilai dalam notasi ilmiah dan selalu dengan 16 digit misalnya. 1.234567890123456e+000. Untuk mendapatkan angka "nyata", Anda perlu memisahkan nomor ini, menghitung jumlah digit dalam bagian desimal, dan mengimbanginya dengan jumlah yang disediakan dalam eksponen.


Dan, tentu saja, masukkan peringatan / peringatan biasa tentang mencoba berbicara tentang digit ketika berhadapan dengan angka yang telah ditentukan biner perwakilan. Jumlah "digit" tertentu float dapat bervariasi tergantung pada bagaimana perhitungannya.


0
2017-12-19 13:22



Saya tidak yakin tentang kecepatan. dll atau keanggunan kode ini. itu untuk beberapa pengujian ad-hoc untuk menemukan nilai desimal pertama. tetapi kode ini dapat diubah menjadi loop melalui semua desimal dan menemukan waktu terakhir nilai lebih besar dari nol dengan mudah.

DECLARE @NoOfDecimals       int             = 0 
Declare @ROUNDINGPRECISION  numeric(32,16)  = -.00001000

select @ROUNDINGPRECISION = ABS(@ROUNDINGPRECISION)
select @ROUNDINGPRECISION = @ROUNDINGPRECISION - floor(@ROUNDINGPRECISION)


while @ROUNDINGPRECISION < 1
Begin
    select @NoOfDecimals = @NoOfDecimals +1
    select @ROUNDINGPRECISION =  @ROUNDINGPRECISION * 10

end;

select @NoOfDecimals

0
2017-10-07 16:05