删除十进制但保留值-SQL

删除十进制但保留值-SQL,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个数据请求-SQL Server 2014(第四列)。应用程序不处理小数。所以我必须提供没有小数的数据。例如:如果员工工作8小时,我发送8.00。上游应用程序希望数据为800。或者,如果少于8小时,则050(.50)为半小时 我对两周工作的计算是: CONVERT(decimal(10, 2), dur) / 60 AS HOURS 我的问题是:如何去除小数点,同时保持正确的小时数,使8.00变为800?您可以简单地将小时数转换为字符串,然后将小数点替换为零。如有必要,将不带小数的字符

我有一个数据请求-SQL Server 2014(第四列)。应用程序不处理小数。所以我必须提供没有小数的数据。例如:如果员工工作8小时,我发送8.00。上游应用程序希望数据为800。或者,如果少于8小时,则050(.50)为半小时

我对两周工作的计算是:

CONVERT(decimal(10, 2), dur) / 60 AS HOURS


我的问题是:如何去除小数点,同时保持正确的小时数,使8.00变为800?

您可以简单地将小时数转换为字符串,然后将小数点替换为零。如有必要,将不带小数的字符串转换为整数

DECLARE @Hours DECIMAL(10, 2)

SET @Hours = 8.50

SELECT
  @Hours AS [Hours]
, REPLACE(CONVERT(VARCHAR(13), @Hours), '.', '') AS [Hours as String]
, CONVERT(INT, REPLACE(CONVERT(VARCHAR(13), @Hours), '.', '')) AS [Hours as Integer]

由于您的应用程序预期值的前导零不超过一个小时,因此必须将其填充掉。但是,由于可能有超过10个小时的值,我们需要稍微不同地处理这些值,以考虑最终结果中的额外字符

这似乎给了你想要的价值

设置:

create table t
    (tm decimal(18,5));

insert t values (8.05999),(11.00000),(0.34111);
查询:

select 
    case 
        when t.tm > 10 
            then cast(cast(t.tm*100 as integer) as varchar(5)) --<-Handles longer shifts
        else right(concat('000',cast(t.tm*100 as integer)),3)  --<-Handles shorter shifts
    end as appVal
from t;

替换了@isaac和@eric brandt建议的小数点符号。然后只填充上游应用程序所需的值的数量

LEFT(REPLACE((CONVERT(decimal(10, 2), dur) / 60),'.',''),3) AS HOURS,

这里的大多数人希望样本表数据和预期结果是格式化文本,而不是图像。如果员工在一天或一个工资期内工作30分钟,那么少于8小时怎么会变成050?谢谢@isaac。这确实指引了我正确的方向。我能够添加REPLACE函数来消除小数。{REPLACE((CONVERT(decimal(10,2),dur)/60),'.','')AS HOURS}我将尝试接下来只选择前三个字符。那将符合我的目的。
LEFT(REPLACE((CONVERT(decimal(10, 2), dur) / 60),'.',''),3) AS HOURS,