mssql sqlserver 获取指定汉字的笔画数的方法分享

by admin on 2019年9月8日

转自:http://www.maomao365.com/?p=6771

转自:http://www.maomao365.com/?p=6410

转自:http://www.maomao365.com/?p=6421

思路:

获取内定日期月份的第一天,你能够动用DATEADD函数,减去钦赐日期的月度过去了的气数,就可以。

摘要:

摘要:

摘要:

1、获取到查询年份内所有工作日数据数组
2、获取到查询开始日期在工作日的索引
3、计算需查询日期索引
4、获得查询日期

1 /*创建日期类型记录表格*/2 CREATE TABLE `tb_workday` (3 `did` int(11) NOT NULL AUTO_INCREMENT,4 `exact_date` varchar(32) NOT NULL COMMENT '具体日期:格式date;',5 `date_year` varchar(32) NOT NULL COMMENT '具体日期:格式date;',6 `date_type` tinyint(2) NOT NULL COMMENT '日期类型:0、工作日;1、特殊工作日;2、法定节假日',7 PRIMARY KEY 8 ) ENGINE=InnoDB AUTO_INCREMENT=829 DEFAULT CHARSET=utf8 COMMENT='各年工作日&法定节假日数据'

  1 <?php  2   3 class work_days  4 {  5   /**  6    * 获取星期  7    * @param $date  8    * @return mixed  9    */ 10   function get_week($date) 11   { 12     //强制转换日期格式 13     $date_str = date('Y-m-d', strtotime($date)); 14     //封装成数组 15     $arr = explode("-", $date_str); 16     //参数赋值 17     //年 18     $year = $arr[0]; 19     //月,输出2位整型,不够2位右对齐 20     $month = sprintf('%02d', $arr[1]); 21     //日,输出2位整型,不够2位右对齐 22     $day = sprintf('%02d', $arr[2]); 23     //时分秒默认赋值为0; 24     $hour = $minute = $second = 0; 25     //转换成时间戳 26     $strap = mktime($hour, $minute, $second, $month, $day, $year); 27     //获取数字型星期几 28     $number_wk = date("w", $strap); 29  30     //获取数字对应的星期 31     return $number_wk; 32  33     //自定义星期数组 34     //$weekArr = array("星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"); 35  36     //获取数字对应的星期 37     //return $weekArr[$number_wk]; 38   } 39  40  41   /** 42    * 获取指定日期段内每一天的日期 43    * @param  string $startdate 开始日期 44    * @param  string $enddate   结束日期 45    * @return array 46    */ 47   function getDateFromRange($startdate, $enddate) 48   { 49     $stimestamp = strtotime($startdate); 50     $etimestamp = strtotime($enddate); 51  52     // 计算日期段内有多少天 53     $days = ($etimestamp - $stimestamp) / 86400 + 1; 54  55     // 保存每天日期 56     $_list_date = array(); 57     for ($i = 0; $i < $days; $i++) { 58       $_list_date[] = date('Y-m-d', $stimestamp + (86400 * $i)); 59     } 60     return $_list_date; 61   } 62  63   function curl_post($url, $data = null) 64   { 65     $curl = curl_init(); 66     curl_setopt($curl, CURLOPT_URL, $url); 67     curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); 68     curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); 69     if (!empty($data)) { 70       curl_setopt($curl, CURLOPT_POST, 1); 71       curl_setopt($curl, CURLOPT_POSTFIELDS, $data); 72     } 73     curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 74     $output = curl_exec($curl); 75     curl_close($curl); 76     return $output; 77   } 78  79   /** 80    * 更新数据库指定年份日期数据 81    * @param $year 82    * @return int 83    */ 84   function updateDate($year) 85   { 86     $startDate = date('Y-m-d', strtotime($year . '-01-01')); 87     $endDate = date('Y-m-d', strtotime('+1 year', strtotime($startDate)) - 86400); 88     $_list_date = self::getDateFromRange($startDate, $endDate); 89  90     $url = 'http://api.goseek.cn/Tools/holiday';//自行查找的免费API 91  92     $m = M('tb_workday'); 93     $count = 0; 94  95     foreach ($_list_date as $k => $_date) { 96       $_ret = 0; 97       $_date = date('Ymd', strtotime($_date)); 98       $_post_data = array('date' => $_date); 99       $_ret_curl = curl_post($url, $_post_data);100       $_ret_curl = json_decode($_ret_curl, true);101 102       //工作日103       if ($_ret_curl['data'] == 0) {104         $dateData['exact_date'] = $_date;105         $dateData['date_year'] = $year;106         $dateData['date_type'] = 0;107         $_ret = $m->add($dateData) ? 1 : 0;108         unset($dateData);109 110 111         //工作日 判断是否为周末112         if (in_array(self::get_week($_date), array(0, 1))) {113           //特殊工作日114           $dateData['exact_date'] = $_date;115           $dateData['date_year'] = $year;116           $dateData['date_type'] = 1;117           $_ret = $m->add($dateData) ? 1 : 0;118           unset($dateData);119         }120       }121 122       //法定节假日123       if ($_ret_curl['data'] == 2) {124         $dateData['exact_date'] = $_date;125         $dateData['date_year'] = $year;126         $dateData['date_type'] = 2;127         $_ret = $m->add($dateData) ? 1 : 0;128         unset($dateData);129       }130 131       //休息日 暂不处理132       /*if ($_ret_curl['data'] == 1) {133 134       }*/135       $_ret && $count++;136       unset($_date, $_post_data, $_ret_curl, $_ret);137     }138     return $count;139   }140 141   /**142    * 获取当年所有工作日 (从数据库获取,数据库无数据则先更新数据)143    * @param string $year 当年年份144    * @return array145    */146   private function getWorkDays($year)147   {148     $m = M('tb_workday');149     $map['date_year'] = $year;150     $map['date_type'] = 0;151     $DateArray = $m->field('exact_date')->where($map)->select();152     if (!empty($DateArray)) {153       $DateArray = array_column($DateArray, 'exact_date');154       return $DateArray;155     } else {156       //更新数据库工作日数据157       $ret = self::updateDate($year);158       if ($ret > 0) {159         return self::getWorkDays($year);160       } else {161         return false;162       }163     }164   }165 166   /**167    * 获取开始日期后第N个工作日具体日期168    * @param $startdate string 计算开始日期  需包含年月日信息169    * @param $days      int 间隔天数170    * @return mixed 成功返回 对应日期,失败返回false171    */172   public function getNextWorkDate($startdate, $days)173   {174     $year = date('Y', strtotime($startdate));175     $startdate = date('Y-m-d', strtotime($startdate));176 177     $workDays = $this->getWorkDays($year);178 179     $search_key = array_search(date('Ymd', strtotime($startdate)), $workDays);180 181     if ($search_key === false) {//查询日期为非工作182       //获取查询日期前最近工作日183       $m = M('tb_workday');184       $map['date_year'] = $year;185       $map['date_type'] = 0;186       $map['DATE_FORMAT(`exact_date`,\'%Y-%m-%d\')'] = array('LT', $startdate);187       $_search_date = $m->where($map)->order('`exact_date` DESC')->getField('exact_date');188       $search_key = array_search($_search_date, $workDays);189       unset($m, $map, $_search_date);190     }191 192     $t_key = $search_key + $days;193 194     if ($t_key <= count($workDays) - 1) {195       return date('Y-m-d', strtotime($workDays[$t_key]));196     } else {197       //查询日期已跨年198       $n_days = $days - (count($workDays) - 1 - $search_key);199       $next_year = $year + 1;200       return $this->getNextWorkDate($next_year . '-01-01', $n_days - 1);201     }202   }203 }204 205 206 $startdate = '2018-09-28';207 $days = 5;208 209 $class = new work_days();210 $_date_workday = $class->getNextWorkDate($startdate, $days);211 echo $_date_workday;//2018-10-10

图片 1图片 2udf_FirstDayOfMonth

下文陈诉专业中,须求获得钦赐日期在上个月的工作日

下文首要分享从钦定字符串或列中取得数字消息,如下所示:
实验景况:sql server 3000

下文呈报总结汉字笔画数的sql函数分享,如下所示:

CREATE FUNCTION [dbo].[udf_FirstDayOfMonth]
(
    @Date DATE
)
RETURNS DATETIME
AS
BEGIN    
    RETURN CAST(DATEADD(day,1 – DAY(@Date), @Date) AS DATETIME)
END


----编写sql函数
    create function getShuZi(@tmp nvarchar(800))
    returns nvarchar(800)
    as 
    begin
          while PATINDEX('%[^0-9]%', @tmp) > 0  
           begin  
             set @tmp = STUFF(@tmp, PATINDEX('%[^0-9]%', @tmp), 1, '');  
           end;  
           return @tmp;   
    end
    go
   ----测试sql函数
   SELECT dbo.getShuZi('猫猫小屋maomao365.com-sql教程专用网站')   
   go
   drop function dbo.getShuZi
   go

 

下文陈说常规的钦赐工作日所在月的气数剖析,
兑现思路:
1 生成一个国度法定假日表(A),非周末,周日
2 生成二个国度官方补办表(B),涉及周天周天调班
3 生成钦点月份的日子流水表(C)
4 获取钦赐日期的职业日音信,如下所示:

 

例:构建汉字笔画数sql函数 

要么,用DATEDIFF总结钦赐日期与日期最早之时,相隔多少个月,然后再DATEADD加上那一个相隔月份数,从零开始。

--例: 获取 2018-4-10 为2018年4月的第几个工作日
declare @d datetime
set @d ='2018-4-10' --可通过下面的方法计算出 为本月第6个工作日

---1:获取4月指定日期的所在月工作日数
create table A(A datetime)
create table B(B datetime)
----4.5.4.6 4.7 4.30为法定假日
insert into A (A)values('2018-4-5'),
('2018-4-6'),('2018-4-7'),('2018-4-30')
----补班日 4月8 4月28 4月30 日
insert into B (B)values('2018-4-8'),
('2018-4-28'),('2018-4-30')

---生成指定月份(4月)所有天数流水
set datefirst 1 --设置星期一为第一个工作日

select * from 
(

select row_number() over(order by d asc ) as [本月第*个工作日],d,datepart(w,d) as [weekInfo] from (
select dateadd(day,number,'2018-4-1') as d from master..spt_values 
where type='p' 
and number >=0 
and dateadd(day,number,'2018-4-1') between '2018-4-1' and dateadd(day,-1,'2018-5-1')
) as a 
where a.d not in (select A from A)
and (a.d in (select b from B ) 
or datepart(w,a.d) not in (6,7) 
)
) as extend 
where d =@d 

go
drop table A 
drop table B
create function [dbo].[fn_hanZiBiHuaShu](@char nchar(2)) 
returns int 
as 
begin 
return( 
case when unicode(@char) between 19968 and 40869 then( 
select top 1 id from( 
select id=1,ch=N'亅' 
union all select 2,N'阝' 
union all select 3,N'马' 
union all select 4,N'风' 
union all select 5,N'龙' 
union all select 6,N'齐' 
union all select 7,N'龟' 
union all select 8,N'齿' 
union all select 9,N'鸩' 
union all select 10,N'龀' 
union all select 11,N'龛' 
union all select 12,N'龂' 
union all select 13,N'龆' 
union all select 14,N'龈' 
union all select 15,N'龊' 
union all select 16,N'龍' 
union all select 17,N'龠' 
union all select 18,N'龎' 
union all select 19,N'龐' 
union all select 20,N'龑' 
union all select 21,N'龡' 
union all select 22,N'龢' 
union all select 23,N'龝' 
union all select 24,N'齹' 
union all select 25,N'龣' 
union all select 26,N'龥' 
union all select 27,N'齈' 
union all select 28,N'龞' 
union all select 29,N'麷' 
union all select 30,N'鸞' 
union all select 31,N'麣' 
union all select 32,N'龖' 
union all select 33,N'龗' 
union all select 35,N'齾' 
union all select 36,N'齉' 
union all select 39,N'靐' 
union all select 64,N'龘' 
)a where ch>=@char collate Chinese_PRC_Stroke_CS_AS_KS_WS 
order by id ASC) 
else 0 end) 
end

go

--测试获取汉字笔画数的sql函数 
select dbo.[fn_hanZiBiHuaShu]('猫')

drop function dbo.[fn_hanZiBiHuaShu]
go

图片 3图片 4udf_FirstDayOfMonth

图片 5

 

CREATE FUNCTION [dbo].[udf_FirstDayOfMonth] 
(
    @Date DATE
)
RETURNS DATETIME
AS
BEGIN    
    RETURN DATEADD(MONTH,DATEDIFF(MONTH,0,@Date),0) 
END

 

也许,从钦命的日子抽出年或月,然后与01组成为日期,即拿到钦命日期前一个月天率后天。

图片 6图片 7udf_FirstDayOfMonth

CREATE FUNCTION [dbo].[udf_FirstDayOfMonth]
(
    @Date DATE
)
RETURNS DATETIME
AS
BEGIN    
    DECLARE @y NVARCHAR(4) = CAST(YEAR(@Date) AS NVARCHAR(4))
    DECLARE @m NVARCHAR(2) = CAST(MONTH(@Date) AS NVARCHAR(2))    
    RETURN CAST((@y + N’-‘ + @m + N’-01′) AS DATETIME)
END

 

抑或,仿效那篇: 使用CONVERT函数,钦命日期格式来转变,那样也得以得到钦定日期所在月份的第一天。

图片 8图片 9udf_FirstDayOfMonth

CREATE FUNCTION [dbo].[udf_FirstDayOfMonth]
(
    @Date DATE
)
RETURNS DATETIME
AS
BEGIN    
    DECLARE @ym NVARCHAR(10) = CONVERT(varchar(8),GETDATE(),23)     
    RETURN CAST((@ym + N’01’) AS DATETIME)
END

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图