一. SQL中的cast()函数
CAST函数用于将某种数据类型的表达式显式转换为另一种数据类型。CAST()函数的参数是一个表达式,它包括用AS关键字分隔的源值和目标数据类型。
1. 语法:
CAST (expression AS data_type)
参数说明:
expression:任何有效的SQServer表达式。
AS:用于分隔两个参数,在AS之前的是要处理的数据,在AS之后是要转换的数据类型。
data_type:目标系统所提供的数据类型,包括bigint和sql_variant,不能使用用户定义的数据类型。
用CAST函数进行数据类型转换时,在下列情况下能够被接受:
(1)两个表达式的数据类型完全相同。
(2)两个表达式可隐性转换。
(3)必须显式转换数据类型。
如果试图进行不可能的转换(例如,将含有字母的 char 表达式转换为 int 类型),SQServer 将显示一条错误信息。
如果转换时没有指定数据类型的长度,则SQServer自动提供长度为30。
2. 注意事项:
(1)、CAST()函数的参数是一个表达式,它包括用AS关键字分隔的源值和目标数据类型。以下例子用于将文本字符串'12'转换为整型:
SELECT CAST('12' AS int)
(2)、返回值是整型值12。如果试图将一个代表小数的字符串转换为整型值,又会出现什么情况呢?
SELECT CAST('12.5' AS int)
(3)、CAST()函数和CONVERT()函数都不能执行四舍五入或截断操作。由于12.5不能用int数据类型来表示,所以对这个函数调用将产生一个错误:
Server: Msg 245, Level 16, State 1, Line 1
Syntax error converting the varchar value
'12.5' to a column of data type int.
(4)、要返回一个合法的数值,就必须使用能处理这个值的数据类型。对于这个例子,存在多个可用的数据类型。如果通过CAST()函数将这个值转换为decimal类型,需要首先定义decimal值的精度与小数位数。在本例中,精度与小数位数分别为9 与2。精度是总的数字位数,包括小数点左边和右边位数的总和。而小数位数是小数点右边的位数。这表示本例能够支持的最大的整数值是9999999,而最小的小数是0.01。
SELECT CAST('12.5' AS decimal(9,2))
decimal数据类型在结果网格中将显示有效小数位: 12.50
(5)、精度和小数位数的默认值分别是18与0。如果在decimal类型中不提供这两个值,SQL Server将截断数字的小数部分,而不会产生错误。
SELECT CAST('12.5' AS decimal)
结果是一个整数值:12
1. 实例1:
SELECT
t1.normal,
t1.testSum,
CAST ( ( t1.normal * 1.0 / t1.testSum * 1.0 ) * 100 AS DECIMAL ( 9, 1 ) ) || '%'
FROM
(
SELECT COUNT
( 1 ) testSum,
( SELECT "count" ( 1 ) FROM health_patient_device_result hpdr WHERE is_normal = '2' AND hpdr.create_date :: DATE >= to_date( '2021-08-30 10:33:50', 'YYYY-MM-DD HH24:mi:ss' ) ) normal
FROM
health_patient_device_result hpdr
WHERE
hpdr.patient_device_code = '2c42b699-993b-4189-a1d9-36f6f3e0e92a'
AND hpdr.create_date :: DATE >= to_date( '2021-08-30 10:33:50', 'YYYY-MM-DD HH24:mi:ss' )
) t1;
2. 示例2:
select * from vrv_paw_genuineManagementStatic where softId=8 ORDER BY cast(version AS decimal(9,2)) desc limit 0,1
select max(CAST(version AS DECIMAL(9,2))) from vrv_paw_genuineManagementStatic where softId=8
3. 总结:
cast()主要用于类型转换;在sql中转换用于比较大小排序比较多;对于小数,注意使用cast(n as decimal(9,2))。
二. git pull遇到错误
error: Your local changes to the following files would be overwritten by merge:
意思是我台式机上新修改的代码的文件,将会被git服务器上的代码覆盖;我当然不想刚刚写的代码被覆盖掉,看了git的手册,发现可以这样解决:
方法1:如果你想保留刚才本地修改的代码,并把git服务器上的代码pull到本地(本地刚才修改的代码将会被暂时封存起来)
git stash
git pull origin master
git stash pop
如此一来,服务器上的代码更新到了本地,而且你本地修改的代码也没有被覆盖,之后使用add,commit,push 命令即可更新本地代码到服务器了。
方法2、如果你想完全地覆盖本地的代码,只保留服务器端代码,则直接回退到上一个版本,再进行pull:
git reset --hard
git pull origin master
注:其中origin master表示git的主分支。
三. Java对时间处理的常用
1. 比较两个时间的大小
/**
* 比较两个时间 时分秒 大小
* @param s1
* @param s2
* @return
*/
public static boolean compTime(String s1,String s2){
Date date1 = DateUtils.stringToDate(s1, DateUtils.DATE_TIME_PATTERN);
Date date2 = DateUtils.stringToDate(s2, DateUtils.DATE_TIME_PATTERN);
if (date1.getTime()>date2.getTime()){
return true;
}else {
return false;
}
}
2. 判断时间是否处于某个时间段内
/**MaNongXF
* 判断时间是否处于某个时间段内
*
* @param time 需要比较的时间
* @param from 起始时间
* @param to 结束时间
* @return
*/
public static boolean belongCalendar(String time, String from, String to) {
Calendar date = Calendar.getInstance();
date.setTime(DateUtils.stringToDate(time,DateUtils.DATE_TIME_PATTERN));
Calendar after = Calendar.getInstance();
after.setTime(DateUtils.stringToDate(from,DateUtils.DATE_TIME_PATTERN));
Calendar before = Calendar.getInstance();
before.setTime(DateUtils.stringToDate(to,DateUtils.DATE_TIME_PATTERN));
if (date.after(after) && date.before(before)) {
return true;
} else {
return false;
}
}
3. 给日期的+1天
/**
* 给日期的日+1天
* @param dateStr
* @return
*/
private String getNextDay(String dateStr) {
Date date = DateUtils.stringToDate(dateStr, DateUtils.DATE_TIME_PATTERN);
Calendar rightNow = Calendar.getInstance();
rightNow.setTime(date);
rightNow.add(Calendar.DAY_OF_YEAR, 1);
return DateUtils.dateToString(rightNow.getTime(), DateUtils.DATE_TIME_PATTERN);
}
4. 获取过去第几天的日期
/**
* 给日期的日+1天
* @param dateStr
* @return
*/
private String getNextDay(String dateStr) {
Date date = DateUtils.stringToDate(dateStr, DateUtils.DATE_TIME_PATTERN);
Calendar rightNow = Calendar.getInstance();
rightNow.setTime(date);
rightNow.add(Calendar.DAY_OF_YEAR, 1);
return DateUtils.dateToString(rightNow.getTime(), DateUtils.DATE_TIME_PATTERN);
}
四. 数字格式异常: For input string: "0.5"
原因:
Integer.parseInt("12.1");
12.1为浮点型,需要用Double.parseDouble("12.1")
转换
数字转换异常:
//字符串转换成int类型,因为是浮点型的问题,出现转换错误:
System.out.println(Integer.parseInt("1.5"));
//此为修改后的,1无论是整型还是浮点型都可以通过
System.out.println(Double.parseDouble("1.5"));
五. BigDecimal判断大小
非整型数,运算由于精度问题,可能会有误差,建议使用BigDecimal类型!
double a = 0.001;
double b = 0.0011;
BigDecimal data1 = new BigDecimal(a);
BigDecimal data2 = new BigDecimal(b);
data1.compareTo(data2)
public int compareTo([BigDecimal]
将此 BigDecimal 与指定的BigDecimal 比较。根据此方法,值相等但具有不同标度的两个BigDecimal 对象(如,2.0 和 2.00)被认为是相等的。相对六个 boolean 比较运算符 (<, ==, >, >=, !=, <=) 中每一个运算符的各个方法,优先提供此方法。建议使用以下语句执行上述比较:(x.compareTo(y) <op> 0),其中 <op> 是六个比较运算符之一。
**指定者:
接口 Comparable<BigDecimal>
中的 compareTo
参数:
val
- 将此 BigDecimal 与之比较的BigDecimal。
返回:当此 BigDecimal 在数字上小于、等于或大于val 时,返回 -1、0 或 1。
六. Java两个整数相除保留两位小数
第一种
import java.math.BigDecimal;
/**
* @author WGR
* @create 2020/3/17 -- 15:51
*/
public class DemoTest {
public static void main(String[] args) {
int a=100;
int b=33;
double f1 = new BigDecimal((float)a/b).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
System.out.println(f1);
}
}
第二种
import java.text.DecimalFormat;
/**
* @author WGR
* @create 2020/3/17 -- 15:51
*/
public class DemoTest {
public static void main(String[] args) {
int a=100;
int b=33;
DecimalFormat df = new DecimalFormat("0.00");//格式化小数
String num = df.format((float)a/b);//返回的是String类型
System.out.println(num);
}
}
网友评论