在DECLAREd变量

时间:2015-11-06 18:14:46

标签: sql-server

我需要在声明的变量中包含3个小数位,以反映一个月内的精确(非整数)周数。

但是,SET变量会使用我尝试过的任何内容返回INT值:CONVERT,CAST或各种数据类型。

我在下面粘贴脚本。我只能想出一个解决方法:在SET中乘以1000只能在select语句中进行除法。

但我想避免在SELECT中计算(" Calc8d"以下)值,而是将它们设置为变量。所以我想知道:

(1)是我的数据类型'或者' SELECT'在' SET'内错误? (2)或者变量是否永远不会返回小数位但只返回整数?直接计算DECALREd为DECIMAL为31/7仍然返回4而不是4.428571或类似。 (但是DATE和DATETIME是非整数,还是它们?)。

令人遗憾的是,月份和年份不是公制,十进制甚至是十四进制,因此在开始或EOM拆分周的分周数始终是每月喜欢或其他"每月&#34的问题; KPI类型的报告...>: - P

    DECLARE @ExactNoOfWeeks_LastMowCONV DECIMAL SET @ExactNoOfWeeks_LastMowCONV = ROUND(CONVERT(DECIMAL(5,2),DATEPART(d,EOMONTH(GETDATE(), -1)))/7,3)
DECLARE @ExactNoOfWeeks_LastMowCAST DECIMAL SET @ExactNoOfWeeks_LastMowCAST = ROUND(CAST(DATEPART(d,EOMONTH(GETDATE(), -1)) AS FLOAT)/7,3)
DECLARE @ExactNoOfWeeks_LastMonth3K DECIMAL SET @ExactNoOfWeeks_LastMonth3K = ROUND(CONVERT(DECIMAL(5,2),DATEPART(d,EOMONTH(GETDATE(), -1)))/7,3) * 1000
DECLARE @StraightCalc DECIMAL SET @StraightCalc = 31/7

SELECT
DATEPART(d,EOMONTH(GETDATE(), -1)) 'Days Prev Mo' -- number of days in pervious month
,DATEPART(d,EOMONTH(GETDATE(), -1))/7 'Calc8d (w/o CAST)' -- same as above devided by nr of days in a week
,ROUND(CONVERT(DECIMAL(5,2),DATEPART(d,EOMONTH(GETDATE(), -1)))/7,8) 'Calc8d (w/CONVERT)' -- calculated with CONVERT
,ROUND(CAST(DATEPART(d,EOMONTH(GETDATE(), -1)) AS FLOAT)/7,3) 'Calc8d (w/CAST)' -- calculated with CAST
,@ExactNoOfWeeks_LastMowCONV 'Var(w/CONVERT)' -- SELECTed Variable SET with same calculation as above returns an integer
,@ExactNoOfWeeks_LastMowCAST 'Var(w/CAST)' -- idem
,@ExactNoOfWeeks_LastMonth3K/1000 'Var/1K' -- idem
,@StraightCalc 'Var Straight Calc' -- idem
,CONVERT(NVARCHAR,GETDATE(),103) 'Today'
,CONVERT(NVARCHAR,EOMONTH(GETDATE(),-1),103) 'Last EOM'


Days Prev Mo       31
Calc8d (w/o CAST)   4
Calc8d (w/CONVERT)  4.428571
Calc8d (w/CAST)    4.429
Var(w/CONVERT)     4
Var(w/CAST)        4
Var/1K              4.429
Var Straight Calc   4
Today                06/11/15
Last EOM              31/10/15

Result

1 个答案:

答案 0 :(得分:0)

您需要指定精度和比例。 The default scale is zero.

这有效:

DECLARE @ExactNoOfWeeks_LastMowCONV DECIMAL(4,3)
SET @ExactNoOfWeeks_LastMowCONV = 1.145
select @ExactNoOfWeeks_LastMowCONV

输出: 1.145

这不是:

DECLARE @ExactNoOfWeeks_LastMowCONV DECIMAL
SET @ExactNoOfWeeks_LastMowCONV = 1.145
select @ExactNoOfWeeks_LastMowCONV

输出: 1