-
2020-12-19 18:28:39
在实际的处理中,还有一种比较另类的日期加减处理,就是在指定的日期中,加上(或者减去)多个日期部分,比如将2005年3月11日,加上1年3个月11天2小时。对于这种日期的加减处理,DATEADD函数的力量就显得有点不够。
要实现多个日期部分的加减处理,最主要的就是把要加减的日期字符分解,然后根据分解的结果在指定日期的对应日期部分加上相应的值,其难点在于如何分解日期字符,以及判断分解后的日期字符属于哪个日期部分。要顺利地分解出日期字符的话,首先要规定日期加减的日期字符的格式,可以这样定义:
y-m-d h:m:s.m | -y-m-d h:m:s.m
说明:要加减的日期字符输入方式与日期字符串相同。日期与时间部分用空格分隔,最前面一个字符如果是减号(-)的话,表示做减法处理,否则做加法处理。如果日期字符只包含数字,则视为日期字符中,仅包含天的信息。
确定了日期字符格式后,处理方法就可以这样确定:获取日期字符的第一个字符,判断处理方式,然后将要加减的日期字符按空格分拆为日期和时间两部分,对于日期部分从低位到高位逐个截取日期数据进行处理,对于时间从高位到低位逐个处理。
以下是实现日期的多个部分同时加减处理的用户定义函数代码:
CREATE FUNCTION f_DateADD(
@Date datetime,
@DateStr varchar(23)
)RETURNS datetime
AS
BEGIN
DECLARE @bz int,@s varchar(12),@i int
IF @DateStr IS NULL OR @Date IS NULL
OR(CHARINDEX('.',@DateStr)>0
AND @DateStr NOT LIKE '%[:]%[:]%.%')
RETURN(NULL)
IF @DateStr='' RETURN(@Date)
SELECT @bz=CASE
WHEN LEFT(@DateStr,1)='-' THEN -1
ELSE 1 END,
@DateStr=CASE
WHEN LEFT(@Date,1)='-'
THEN STUFF(RTRIM(LTRIM(@DateStr)),1,1,'')
ELSE RTRIM(LTRIM(@DateStr)) END
IF CHARINDEX(' ',@DateStr)>1
OR CHARINDEX('-',@DateStr)>1
OR(CHARINDEX('.',@DateStr)=0
AND CHARINDEX(':',@DateStr)=0)
BEGIN
SELECT @i=CHARINDEX(' ',@DateStr+' ')
,@s=REVERSE(LEFT(@DateStr,@i-1))+'-'
,@DateStr=STUFF(@DateStr,1,@i,'')
,@i=0
WHILE @s>'' and @i<3
SELECT @Date=CASE @i
WHEN 0 THEN DATEADD(Day,@bz*REVERSE(LEFT(@s,CHARINDEX('-',@s)-1)),@Date)
WHEN 1 THEN DATEADD(Month,@bz*REVERSE(LEFT(@s,CHARINDEX('-',@s)-1)),@Date)
WHEN 2 THEN DATEADD(Year,@bz*REVERSE(LEFT(@s,CHARINDEX('-',@s)-1)),@Date)
END,
@s=STUFF(@s,1,CHARINDEX('-',@s),''),
@i=@i+1
END
IF @DateStr>''
BEGIN
IF CHARINDEX('.',@DateStr)>0
SELECT @Date=DATEADD(Millisecond
,@bz*STUFF(@DateStr,1,CHARINDEX('.',@DateStr),''),
@Date),
@DateStr=LEFT(@DateStr,CHARINDEX('.',@DateStr)-1)+':',
@i=0
ELSE
SELECT @DateStr=@DateStr+':',@i=0
WHILE @DateStr>'' and @i<3
SELECT @Date=CASE @i
WHEN 0 THEN DATEADD(Hour,@bz*LEFT(@DateStr,CHARINDEX(':',@DateStr)-1),@Date)
WHEN 1 THEN DATEADD(Minute,@bz*LEFT(@DateStr,CHARINDEX(':',@DateStr)-1),@Date)
WHEN 2 THEN DATEADD(Second,@bz*LEFT(@DateStr,CHARINDEX(':',@DateStr)-1),@Date)
END,
@DateStr=STUFF(@DateStr,1,CHARINDEX(':',@DateStr),''),
@i=@i+1
END
RETURN(@Date)
END
更多相关内容 -
解决excel(日期变数字)导入数据库(数字变日期)
2021-12-29 13:21:18由excel 表格传入数据到SQL Server 数据时,我们的日期数据很有可能会被转成一串...那么,可以使用 dateadd 进行数字转换,转换为日期类型。如: DATEADD(day,cast(数值asint)-2,cast('1900-1-1'asdate)) ...1.SQL Server 数值 转日期
由excel 表格传入数据到SQL Server 数据时,我们的日期数据很有可能会被转成一串数据:
如:
那么,可以使用 dateadd 进行数字转换,转换为日期类型。如:
DATEADD(day, cast( 数值 as int) -2 ,cast('1900-1-1' as date))
2.C#方式
//原数值 44504 //错 Convert.ToDateTime("1900-1-1").AddDays(44504).ToString("yyyy/MM/dd"); //正确 Convert.ToDateTime("1900-1-1").AddDays(44504-2).ToString("yyyy/MM/dd");
string redate = dt16_1.Rows[3]["F6"].ToString();//工厂回复项目交期 if (redate.Contains("/")) { redate = redate.Replace("0:00:00", "").ToString(); } else { redate = Convert.ToDateTime("1900-1-1").AddDays(Convert.ToInt32(redate)-2).ToString("yyyy/MM/dd"); }
-
数据库日期操作
2021-12-03 14:46:41数据库日期操作使用mysql概述:主要是对数据分析统计比对最常用:把date/datetime转化为从0-0-0到现在的天数:to_days('data/datetime')获取特定的时间要素直接算date/datetime的差如何插入一段漂亮的代码片改变时间...数据库日期操作
使用mysql
概述:主要是对数据分析统计比对
最常用:把date/datetime转化为从0-0-0到现在的天数:to_days(‘data/datetime’)
意义:可以把日期都化为一个基准用于比较
比如2020-2-2到2000-1-1有多少天
获取特定的时间要素
year(),month(),day(),quater()(季度)都类似
直接算date/datetime的差
timestampdiff([你想要的差的类系(如月份)],date,date)
datetime也是可以的如何插入一段漂亮的代码片
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的
代码片
.// An highlighted block var foo = 'bar';
改变时间类型
date_add (加)和 date_sub(减)
date_add(‘date/datetime’ , interval [数字] [类型])
-
数据库Oracle 数字,字符,日期之间的相互转换
2019-07-31 16:36:02TO_CHAR(arg1,’fmt’):将一个日期或者数字转换为字符类型。带格式化样式 fmt。 arg1: 数字或者日期类型 。需要转换的数据。 fmt: 转换格式 。 SQL> select to_char(sysdate,'month') from ...数据类型转换分为俩种 。
隐式数据类型转换:当源数据的类型和目标数据的类型不同的时候,如果没有转换函数,就会发生隐式转换,也称自动转换。
对于直接赋值转换:
对于表达式赋值:
隐式转换的问题:
性能影响:
隐式转换的最大问题就是转换时会导致索引的无效,进而可能导致全表扫描。当表的数据量很大的时候,产生会很大的性能问题。比如说,VARCHAR2 和 NVARCHAR2 隐式数据类型转换导致的性能问题。
不便于阅读:
由于隐式转换使得数据库编程人员和 DBA 难以了解到究竟发生了怎样的类型转换,而且如果代码很多很长的话要查出错误就需要费很大的劲。
显示数据类型转换:通过数据库中的转换函数完成数据类型的转换。
数字,日期转换成字符:
TO_CHAR(arg1,’fmt’):将一个日期或者数字转换为字符类型。带格式化样式 fmt。
arg1:数字或者日期类型。需要转换的数据。
fmt:转换格式。SQL> select to_char(sysdate,'month') from dual; TO_CHAR(SYSDATE,'MONTH') ------------------------ 7月 SQL> select to_char(sysdate,'dd') from dual; TO_CHAR(SYSDATE,'DD') --------------------- 31 SQL> select to_char(sysdate,'day') from dual; TO_CHAR(SYSDATE,'DAY') ---------------------- 星期三 SQL> select to_char(sysdate,'dy') from dual; TO_CHAR(SYSDATE,'DY') --------------------- 星期三 SQL> select to_char(sysdate,'yyyy') from dual; TO_CHAR(SYSDATE,'YYYY') ----------------------- 2019 SQL> select to_char(sysdate,'year') from dual; TO_CHAR(SYSDATE,'YEAR') ------------------------------------------ twenty nineteen SQL> select to_char(sysdate,'mm') from dual; TO_CHAR(SYSDATE,'MM') --------------------- 07 SQL> select to_char(sysdate,'cc') from dual; TO_CHAR(SYSDATE,'CC') --------------------- 21 SQL> select to_char(sysdate,'scc') from dual; TO_CHAR(SYSDATE,'SCC') ---------------------- 21 SQL> select to_char(sysdate,'iyyyy') from dual; TO_CHAR(SYSDATE,'IYYYY') ------------------------ 20199 SQL> select to_char(sysdate,'iyy') from dual; TO_CHAR(SYSDATE,'IYY') ---------------------- 019 SQL> select to_char(sysdate,'bc') from dual; TO_CHAR(SYSDATE,'BC') --------------------- 公元 SQL> select to_char(sysdate,'q') from dual; TO_CHAR(SYSDATE,'Q') -------------------- 3 SQL> select to_char(sysdate,'am') from dual; TO_CHAR(SYSDATE,'AM') --------------------- 下午 SQL> select to_char(sysdate,'hh') from dual; TO_CHAR(SYSDATE,'HH') --------------------- 02 SQL> select to_char(sysdate,'hh12') from dual; TO_CHAR(SYSDATE,'HH12') ----------------------- 02 SQL> select to_char(sysdate,'hh24') from dual; TO_CHAR(SYSDATE,'HH24') ----------------------- 14 SQL> select to_char(sysdate,'mi') from dual; TO_CHAR(SYSDATE,'MI') --------------------- 32 SQL> select to_char(sysdate,'mi:ss') from dual; TO_CHAR(SYSDATE,'MI:SS') ------------------------ 32:39
SQL> select to_char(sysdate,'ddspth') from dual; TO_CHAR(SYSDATE,'DDSPTH') ------------------------- thirty-first
示例:显示所有雇员的名字和受雇日期,受雇日期以 2007 年 8 月 10 日 12:00:00AM 显示。
SQL> select last_name,salary,to_char(hire_date,'yyyy"年 "mm"月 "dd"日" hh:mi:ss am') from employees where salary<5000; LAST_NAME SALARY TO_CHAR(HIRE_DATE,'YYYY"年"MM" ------------------------- ---------- ------------------------------ Austin 4800.00 2005年 06月 25日 12:00:00 上午 Pataballa 4800.00 2006年 02月 05日 12:00:00 上午 Lorentz 4200.00 2007年 02月 07日 12:00:00 上午 Khoo 3100.00 2003年 05月 18日 12:00:00 上午 Baida 2900.00 2005年 12月 24日 12:00:00 上午 Tobias 2800.00 2005年 07月 24日 12:00:00 上午 Himuro 2600.00 2006年 11月 15日 12:00:00 上午 Colmenares 2500.00 2007年 08月 10日 12:00:00 上午
数字转换:
FM:代表去掉返回结果中的前后空格。
SQL> select to_char(123687.146,'999,999.999') from dual; TO_CHAR(123687.146,'999,999.99 ------------------------------ 123,687.146 SQL> select to_char(123687.1464,'999,999.999') from dual; TO_CHAR(123687.1464,'999,999.9 ------------------------------ 123,687.146 SQL> select to_char(123646487.1464,'999,999.999') from dual; TO_CHAR(123646487.1464,'999,99 ------------------------------ ############ SQL> select to_char(646487.1464,'$999,999.999') from dual; TO_CHAR(646487.1464,'$999,999. ------------------------------ $646,487.146 SQL> select to_char(646487.1464,'L999,999.999') from dual; TO_CHAR(646487.1464,'L999,999. ------------------------------ ¥646,487.146 SQL> select to_char(646487.1464,'l999,999.999') from dual; TO_CHAR(646487.1464,'L999,999. ------------------------------ ¥646,487.146 SQL> select to_char(646487.1464,'fml999,999.999') from dual; TO_CHAR(646487.1464,'FML999,99 ------------------------------ ¥646,487.146 SQL> select to_char(646487.1464,'fm$999,999.999') from dual; TO_CHAR(646487.1464,'FM$999,99 ------------------------------ $646,487.146
示例:查询雇员 Whalen,显示他的薪水,在薪水前添加美元符号与千位符。
SQL> select last_name,salary,to_char(salary,'fm$999,999.999') from employees where lower(last_name)='whalen'; LAST_NAME SALARY TO_CHAR(SALARY,'FM$999,999.999 ------------------------- ---------- ------------------------------ Whalen 4400.00 $4,400.
to_number 字符串到数字转换
TO_NUMBER(‘arg1’,fmt’):将字符串转换为数值型的格式。带格式化样式 fmt。
arg1:字符串类型。需要转换的数据。
fmt:转换格式。SQL> select to_number('¥440.00','l999,999.999') from dual; select to_number('¥4400.00','l999,999.999') from dual ORA-01722: 无效数字 SQL> select to_number('¥440.00','l999,999.999') from dual; TO_NUMBER('¥440.00','L999,999 ----------------------------- 440 SQL> SQL> select to_number('¥464,400.00','l999,999.999') from dual; TO_NUMBER('¥464,400.00','L999 ----------------------------- 464400
TO_DATE(‘arg1’,’fmt’):将字符串转换为日期格式。带格式化样式 fmt。
arg1:字符串类型。需要转换的数据。
fmt:转换格式。SQL> select to_date('2019/02/16','yyyy-mm-dd') from dual; TO_DATE('2019/02/16','YYYY-MM- ------------------------------ 2019/2/16 SQL> select to_date('20190216','yyyy-mm-dd') from dual; TO_DATE('20190216','YYYY-MM-DD ------------------------------ 2019/2/16
示例:将 2019 年 3 月 9 日 11 点 30 分转换为 Date 类型
SQL> select to_date('2019年 3月 9日 11点 30分','yyyy"年" mm"月" dd"日" hh12"点" mi"分"') from dual; TO_DATE('2019年3月9日11点30分' ------------------------- 2019/3/9 11:30:00
注意:空格也是格式,一定要看清楚:
SQL> select to_date('2019年3月9日11点30分','yyyy"年" mm"月" dd"日" hh12"点" mi"分"') from dual; select to_date('2019年3月9日11点30分','yyyy"年" mm"月" dd"日" hh12"点" mi"分"') from dual ORA-01861: 文字与格式字符串不匹配
-
数据库日期转换数字转换日期方式:
2018-12-10 19:40:46数据库日期转换数字转换日期方式: SELECT TO_CHAR(44202 -2 + TO_DATE(‘1900-01-01’, ‘YYYY-MM-DD’), ‘YYYY-MM-DD’) AS CDATE FROM DUAL; -
数据库10位秒时间戳数字转日期处理
2020-06-05 10:44:07处理数据库十位时间戳说明SQLSEREVER中转换ORACLE中转换java代码中转换 说明 项目需求需要查询一条sql语句,发现其中时间格式为10位时间戳(1464686734)不是传统意义上的yyyymmdd格式,10位类似这种一般是秒为单位,... -
数据库查询,修改日期 数字格式
2018-07-31 15:56:48改为年-月-日输出 select DATE_FORMAT(brokerage_date,'%Y-%m-%d') as brokerageDate from table1 改为年-月-日 时:分:秒输出 select date_format(pay_end_time,'%Y-%m-%d %H:%i:%s') from table1 ... -
数据库日期格式化函数
2020-07-27 16:30:06把字符串转换为日期格式: SELECT DATE_FORMAT('2020-07-27 16:23:35', '%Y-%m-%d %H:%i:%S'); 把日期转换字符串格式: SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%S'); %M 月名字(January……December)... -
数据库日期函数
2017-06-23 08:25:121. ADD_MONTHS(日期,数字):在指定的日期上加入指定月数,求出新的日期; 2. MONTHS_BETWEEN(日期1,日期2):求出两个日期间的雇拥月数; 3. NEXT_DAY(日期,星期数):求出下个日期的最后一天日期; 4. -
postgresql数据库中判断是否是数字和日期时间格式函数
2017-07-08 11:19:55判断字符串是否是数字create or REPLACE function isnumeric(txtStr VARCHAR) RETURNS BOOLEAN AS $$ BEGIN RETURN txtStr ~ '^([0-9]+[.]?[0-9]*|[.][0-9]+)$'; END; $$ language 'plpgsql'; create or ... -
达梦数据库-日期类型常用函数汇总
2022-05-14 12:09:13日期时间函数的参数至少有一个是日期时间类型(TIME,DATE,TIMESTAMP),返回值一般为日期时间类型和数值类型。由于 DM 支持儒略历,并考虑了历史上从儒略历转换至格里高利日期时的异常,不计算’1582-10-05’到’... -
数据库日期格式转化为中文的年月日格式
2020-02-28 11:22:49写数据库代码的时候,我们正常转换日期格式,大都是:yyyy-mm-dd的格式,或者是:yyyymmdd等,但如果转为中文样式的:yyyy年mm月dd日的格式呢,看起来挺简单,不过一时之间,真能让人发懵。其实也简单,代码如下: ... -
后端数据库中返回date日期时 前端显示为一串数字
2020-12-05 21:27:40解决方法:加上JsonFormat注解 出参时自动转换为设定格式 问题解决 ! (也可以把数据库的格式变成字符串存入数据库) -
解决PHPExcle导入日期变数字
2020-03-03 11:33:41excel为日期格式读取该数据后变为数字,框架是tp3.2,解决的关键代码如下: //引入日期处理的date类 import(“Org.Util.PHPExcel.Shared.Date”); $PHPExcel_Shared_Date = new \PHPExcel_Shared_Date(); //读取日期... -
数据库日期格式转换函数
2017-07-26 21:27:18把日期格式转换to_char(FZRQ,’yyyy-mm-dd hh:mi:ss’)select YSZBH, CYDW, QYD, TJD1, TJD2, TJD3, DDD, FZJG, FZR, to_char(FZRQ,'yyyy-mm-dd hh:mi:ss') as FZRQ, to_char(yxrq,'yyyy-mm-dd hh:mi:ss') as yxrq,... -
数据库date格式返回前端为一串数字
2022-02-06 14:52:27但是不经操作直接set到对象中返回前端显示不是yy-mm-dd格式的日期,而是一串长数字。 修改操作: 1. 改变日期格式 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); String format = sdf.format... -
数据库日期格式化
2019-05-15 16:22:08select DATE_FORMAT(CURDATE(),'%Y-%m-%d %H:%I:%S'), from table format字符串: ...%D 有英语前缀的月份的日期(1st, 2nd, 3rd, 等等。) %Y 年, 数字, 4 位 %y 年, 数字, 2 位 %a 缩写的星期名... -
三分钟学会数据库, date 日期 及格式转换 (开发比较常用YYYYMMDD)
2019-09-06 15:50:13使用下列数据类型在数据库中存储日期或日期/时间值: DATE - 格式:YYYY-MM-DD DATETIME - 格式:YYYY-MM-DD HH:MM:SS TIMESTAMP - 格式:YYYY-MM-DD HH:MM:SS YEAR - 格式:YYYY 或 YY SQL Server ... -
使用excel导入功能时日期数据变成数字的解决
2020-11-20 11:02:14使用excel导入功能时日期数据变成数字的解决 在使用excel导入功能的时候,难免会导入日期类型的数据,这个时候无论使用easyexcel还是poi的导入方式,都有可能出现纯数字的日期。 1、如果输入的日期是1900年之前的,... -
从数据库中查出的时间是一串数字
2017-10-19 09:36:00这其实没有错,这串数字是 时间戳(timestamp) ,通常是一个字符序列,唯一地标识某一刻的时间。 例如:1305687917表示的是,从1970年到现在的时间总共是1305687917秒 要想显示正确的时间格式,你需要给... -
postgresql中判断是否为数字和是否为时间日期格式的相关函数
2016-09-13 18:00:55postgresql中判断是否为数字和是否为时间日期格式的相关函数,类似于sqlserver中的isDate和isnumeric函数 -
oracle数据库日期显示格式及字段拼接
2019-08-20 17:10:541、使用to_date函数将字符串RKRQ字段装换成日期。 select to_date(RKRQ,‘yyyyMMdd’) from tmp 注:to_date后显示的结果与系统时间一致,无法按要求输出相应格式。 2、使用to_char函数将日期RKRQ以我们需要的格式..... -
Oracle-日期转化数字的方法
2018-05-10 15:28:411. 首先你需要先把日期转化为字符 to_char(sysdate,'yyyymmdd') 2. to_number(to_char(sysdate,'yyyymmdd')) -
mysql 日期转换和数字格式转换
2021-01-30 01:42:50在mysql中,没有类似oracle的to_char(num,format)函数,所以涉及到数字前面补0的情况需要特殊处理。 如select left(concat('00'),@num),3)就会显示三位数字的字符串, @num=1时显示001,为123是显示123。 CONCAT... -
从MYSQL数据库查出指定格式的日期
2021-01-27 08:51:13%W 星期名字(Sunday……Saturday) %D 有英语前缀的月份的日期(1st, 2nd, 3rd, 等等。) %Y 年, 数字, 4 位 %y 年, 数字, 2 位 %a 缩写的星期名字(Sun……Sat) %d 月份中的天数, 数字(00……31) %e 月份中的天数, ... -
springboot 前端显示和数据库保存的时间日期相差8小时
2021-12-07 10:40:40springboot 前端显示和数据库保存的时间日期往前显示8小时,即数据库保存20点,但是前端显示的是12点; 打断点发现返回给前端的日期是没有错的;那么: 解决方式: 原: import org.springframework.format.... -
数据库报“ORA-01722: 无效数字”错误的解决办法
2021-05-08 19:10:18数据库报“ORA-01722: 无效数字”错误的解决办法2020-09-30报错信息:ORA-01722: 无效数字问题SQL:?1234567891011SELECT A.*,B.FUND_CODE AS FUND_CODE,B.FUND_FULLNAME AS Fund_FullnameFROM BSP_SYS_ATTACH A,BSP_... -
数据库中字符串和日期的相互转换?
2021-01-11 09:54:01ss’) 字符串转时间 from dual select to_date(‘2019-10-25 17:15:20’,‘yyyy-MM-dd HH24:mi:ss’) 字符串 转时间 from dual MySQL MySQL 内置函数,在 MySQL 里面利用 str_to_date() 把字符串转换为日期 示例:... -
mysql数据库----时间和日期类型
2020-05-18 12:25:20为了方便在数据库中存储日期和时间,MySQL提供了表示日期和时间的数据类型,分别是YEAR. DATE、TIME、DATETIME和TIMESTAMP。表3-4列举了这些MySQL中日期和时间数据类型所对应的字节数、取值范围、日期格式以及零值。... -
日期插入数据库和前端页面正常显示日期
2018-11-30 19:45:29问题一、数据库查询出时间,传给前端变为一串数字怎么办 // 在属性或者get方法上加此注解 @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8") //xml层: <select id=&...