SqlServer 查询一段时间,没有数据自动补充0

前提介绍:最近在学习一个图表的前端框架 Echarts ,用着感觉还不错、数据封装也简单、功能强大、各个方面都比较满意。

业务需求:查询一段时间的数据、前端生成折线或柱状图。时间不限、有可能是一个季度的,也有可能是一个月的。需要将每一天的数据都显示。数据是从定时任务中抽取回来的。

问题:假如查询时间为一个月、这一个月假如有服务器罄机的时候或定时任务不执行的时候,将没有这天的数据,用 BETWEEN……AND…… 的话时间时间日期会跳开这一天。例如封装好后横坐标就会:1、2、5、6、7这个样子,跟业务需求有些不符合。也想过用SQL直接封装好 data 数据格式返回、选用 for xml 封装成想要的数据格式了、准备直接返回前端、后来发现 MyBatis 不识别、解析不出来数据。也不能一天一天的查询然后封装数据,查阅了 API 在查询出一段时间内、数据为空的时候自动补充 0 ,返回一个 list 的集合,在业务层中 for 循环封装数据。
SELECT
a.dt AS 'CreateTime',
cast(SUM( ISNULL(b.Score, '0')) as numeric(10,1)) AS 'Score'
FROM
(
SELECT
CONVERT(varchar(100), dateadd(d, number, '2019-09-01'), 23) dt
FROM
master..spt_values
WHERE
type = 'p'
AND dateadd(d, number, '2019-09-01') <= '2019-09-30'
) a
LEFT JOIN MScores b ON a.dt = CONVERT(varchar(100), b.CreateTime, 23)
group by a.dt

这是返回的数据,自此问题解决。

解析:DATEADD() 函数在日期中添加或减去指定的时间间隔。利用master数据库下的spt_values表生成一个连续的日期。master存储了一些存储过程运行所需要的数据取值范围到2047。这个表有名称,值,类型,最小,最大,状态等。

这是 master..spt_values 查询出来的数据,上图可以看到它又很多的类型,这里只运用到了自然数。自然数序列0~2047的 name 为 NULL ,类型为 p。所以利用 master..spt_values 来从生成连续的日期值。最后用关联去查询你所需要日期与数据,数据又做了一个 为 NULL 替换成 0 。

 所有问题全部解决,根据你最后的需要去更改 SQL 语句。 

c# url接收时间格式

public AResult<List<ACompany>> GetCompanies(string date = "19700101000000")
{
DateTime dt = new DateTime();
try
{
IFormatProvider ifp = new CultureInfo("zh-CN", true);
dt = DateTime.ParseExact(date, "yyyyMMddhhmmss", ifp);
}
catch
{
return new AResult<List<ACompany>> { Success = false, Msg = "时间格式不正确" };
}
return new AResult<List<ACompany>>() { Data= CompanyService.Instance.GetCompanies(dt) };
}

sql 循环更新每一条添加自增id

declare @id varchar(100)
declare @j int
set @j=0
declare mycur cursor for select f_id from Sys_Picture
open mycur
fetch next from mycur into @id
while @@fetch_status=0
begin
set @j=@j+1;
update Sys_Picture set f_iid=@j where f_id=@id
--自己处理的过程
fetch next from mycur into @id;
end
close mycur
DEALLOCATE mycur --释放游标

C# Global.asax文件里实现通用防SQL注入漏洞程序(适应于post/get请求)

可使用Global.asax中的Application_BeginRequest(object sender, EventArgs e)事件来实现表单或者URL提交数据的获取,获取后传给SQLInjectionHelper类ValidUrlData方法来完成检查。

首先,创建一个SQLInjectionHelper类完成恶意代码的检查 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Text.RegularExpressions;
/// <summary> 
///SQLInjectionHelper 的摘要说明 
/// </summary> 
public class SQLInjectionHelper
{
    /// <summary> 
    /// 获取Get或Post的数据 
    /// </summary> 
    /// <param name="request"></param> 
    /// <returns></returns> 
    public static bool ValidUrlData(string request)
    {
        bool result = false;
        if (request == "POST")
        {
            for (int i = 0; i < HttpContext.Current.Request.Form.Count; i++)
            {
                result = ValidData(HttpContext.Current.Request.Form[i].ToString());
                if (result)
                {
                    break;
                }
            }
        }
        else
        {
            for (int i = 0; i < HttpContext.Current.Request.QueryString.Count; i++)
            {
                result = ValidData(HttpContext.Current.Request.QueryString[i].ToString());
                if (result)
                {
                    break;
                }
            }
        }
        return result;
    }
    /// <summary> 
    /// 验证是否存在注入代码 
    /// </summary> 
    /// <param name="inputData"></param> 
    /// <returns></returns> 
    private static bool ValidData(string inputData)
    {
        //验证inputData是否包含恶意集合 
        if (Regex.IsMatch(inputData, GetRegexString()))
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    /// <summary> 
    /// 获取正则表达式 
    /// </summary> 
    /// <returns></returns> 
    private static string GetRegexString()
    {
        //构造SQL的注入关键字符,可根据情况自行增减
        string[] strChar = { "and", "exec", "insert", "select", "update", "delete", "count", "from", "drop", "asc", "or", "char", "%", ";", ":", "\'", "\"", "-", "chr", "master", "mid", "truncate", "declare", "char", "SiteName", "/add", "xp_cmdshell", "net user", "net localgroup administrators", "exec master.dbo.xp_cmdshell" };
        string str_Regex = ".*(";
        for (int i = 0; i < strChar.Length - 1; i++)
        {
            str_Regex += strChar[i] + "|";
        }
        str_Regex += strChar[strChar.Length - 1] + ").*";
        return str_Regex;
    }
}

有此类后即可使用Global.asax中的Application_BeginRequest(object sender, EventArgs e)事件来实现表单或者URL提交数据的获取,获取后传给SQLInjectionHelper类ValidUrlData方法来完成检查 。

protected void Application_BeginRequest(object sender, EventArgs e)
{
    bool result = false;
    result = SQLInjectionHelper.ValidUrlData(Request.RequestType.ToUpper());
    if (result)
    {
        Response.Write("您提交的数据有恶意字符");
        Response.End();
    }
} 

git

shamoyu12345

https://www.cnblogs.com/smuxiaolei/p/7484678.html

https://blog.csdn.net/xiaomengzi_16/article/details/78911302

$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
$ mkdir learngit
$ cd learngit
$ pwd
$ git init
$ git add readme.txt
git remote add origin git@gitee.com:liaoxuefeng/learngit.git
git push
git push --set-upstream origin master
yes
ssh-keygen -t rsa -C "272671377@qq.com"
git pull
git pull origin master --allow-unrelated-histories

git clone ...

GIT 强制更新
git fetch --all
git reset --hard origin/master

git push提交完数据后后悔了怎么办?

 

git reset --hard HEAD^
git push origin master -f

git不小心删除文件后,如何获取?
  1. git checkout master
  2.  git reset --hard

下载mongodb

https://www.mongodb.com/download-center/community?jmp=nav

详细图解mongodb下载、安装、配置与使用

https://www.cnblogs.com/minily/p/9431609.html

c#时间操作

/// <summary>
/// 时间间隔
/// </summary>
/// <param name="dateBegin">开始时间</param>
/// <param name="dateEnd">结束时间</param>
/// <returns>返回(秒)单位,比如: 0.00239秒</returns>
public static int ExecDateDiff(DateTime dateBegin, DateTime dateEnd)
{
TimeSpan ts1 = new TimeSpan(dateBegin.Ticks);
TimeSpan ts2 = new TimeSpan(dateEnd.Ticks);
TimeSpan ts3 = ts1.Subtract(ts2).Duration();
//你想转的格式
return (int)ts3.TotalMilliseconds/1000;
}

/// <summary>
/// 判断某个日期是否在某段日期范围内,返回布尔值
/// </summary>
/// <param name="dt">要判断的日期</param>
/// <param name="dt1">开始日期</param>
/// <param name="dt2">结束日期</param>
/// <returns></returns>
public static bool IsInDate(DateTime dt, DateTime dt1, DateTime dt2)
{
return dt.CompareTo(dt1) >= 0 && dt.CompareTo(dt2) <= 0;
}

c# 锁的使用

1 互斥锁lock(基于Monitor实现)

定义:

private static readonly object Lock = new object();

 

使用:

lock (Lock)
{
  //todo
}

作用:将会锁住代码块的内容,并阻止其他线程进入该代码块,直到该代码块运行完成,释放该锁。

注意:定义的锁对象应该是 私有的,静态的,只读的,引用类型的对象,这样可以防止外部改变锁对象

2 互斥锁Monitor

定义:

private static readonly object Lock = new object();

使用:

Monitor.Enter(Lock);
//todo
Monitor.Exit(Lock);

作用:将会锁住代码块的内容,并阻止其他线程进入该代码块,直到该代码块运行完成,释放该锁。

注意:定义的锁对象应该是 私有的,静态的,只读的,引用类型的对象,这样可以防止外部改变锁对象

Monitor有TryEnter的功能,可以防止出现死锁的问题,lock没有

3 互斥锁Mutex

定义:

private static readonly Mutex mutex = new Mutex();

使用:

mutex.WaitOne();
//todo
mutex.ReleaseMutex();

作用:将会锁住代码块的内容,并阻止其他线程进入该代码块,直到该代码块运行完成,释放该锁。

注意:定义的锁对象应该是 私有的,静态的,只读的,引用类型的对象,这样可以防止外部改变锁对象

Mutex本身是可以系统级别的,所以是可以跨越进程的

4 读写锁ReaderWriterLockSlim 

定义:

private static readonly ReaderWriterLockSlim LockSlim = new ReaderWriterLockSlim();

使用:

写锁

try
{
LockSlim.EnterWriteLock();

//todo

}
catch (Exception ex)
{
}
finally
{
LockSlim.ExitWriteLock();
}

 

读锁

try
{
LockSlim.EnterReadLock();

}
catch (Exception ex)
{
}
finally
{
LockSlim.ExitReadLock();
}

基本规则:  读读不互斥 读写互斥 写写互斥

作用:当同一个资源被多个线程读,少个线程写的时候,使用读写锁

引用:https://blog.csdn.net/weixin_40839342/article/details/81189596 

问题: 既然读读不互斥,为何还要加读锁

答:     如果只是读,是不需要加锁的,加锁本身就有性能上的损耗

            如果读可以不是最新数据,也不需要加锁

            如果读必须是最新数据,必须加读写锁

            读写锁相较于互斥锁的优点仅仅是允许读读的并发,除此之外并无其他。

注意:不要使用ReaderWriterLock,该类有问题

input 下拉模糊查询


(function ($) {
$.fn.quickfill = function (data) {
var _w = $(this).outerWidth();
var _h = $(this).outerHeight();
var curObject = this;
//$(curObject).focus(function () {
$("#curObject").remove();
var htmladd = "";
htmladd += '<div id="curObject" style=" height:auto ;max-height: 300px;overflow-y: auto;background: white;display: none;border: 1px solid darkgray;position: fixed">';
if (data != '' || data != undefined) {
for (i = 0; i < data.length; i++) {
htmladd += '<div class="x-l-1" style="text-indent: 0.5em">' + data[i] + '</div>';
}
}
htmladd += '</div>';
var htmladdObject = $(htmladd);
htmladdObject.css({
left: $(curObject).offset().left,
top: $(curObject).offset().top + _h
});
$(curObject).after(htmladdObject);
$(htmladdObject).slideDown(300);
$(".x-l-1").mouseover(function () {
$(this).css("background-color", "#E9E9E4");
});
$(".x-l-1").mouseout(function () {
$(this).css("background-color", "white");
});
var cc = _w - 2;
$(".x-l-1").css("width", cc + "px");
$(".x-l-1").css("height", _h + "px");
htmladdObject.children().click(function () {

$(curObject).val($(this).text());
$(htmladdObject).hide();

});
$(document).on("click", function (event) {
event.stopPropagation();
if ($(event.target).find(htmladdObject).length !== 0) {
$(htmladdObject).hide();
}
});
//});
};
})(jQuery);

JS获取当前时间戳的方法

JavaScript 获取当前时间戳:
第一种方法:(这种方法只精确到秒)

1 var timestamp = Date.parse(new Date());

结果:1280977330000

第二种方法:

 

var timestamp = (new Date()).valueOf();

 

结果:1280977330748

第三种方法:

 

1 var timestamp=new Date().getTime();

 

结果:1280977330748

 

第一种:获取的时间戳是把毫秒改成000显示,因为这种方式只精确到秒

 

第二种和第三种是获取了当前毫秒的时间戳。

 

添加一个遇到的问题

1 var a=(new Date()).toLocaleDateString()//获取当前日期
2     a =a.replace(/\//g,'-');//替换2017/05/03 为    2017-05-03
3 var nowdate= (new Date(a))/1000;//把当前日期变成时间戳
4 var wdate=(new Date(v.wdate))/1000;//把数据库日期变成时间

 js时间戳怎么转成日期格式

 

复制代码
 1 //第一种
 2 function getLocalTime(nS) {     
 3    return new Date(parseInt(nS) * 1000).toLocaleString().replace(/:\d{1,2}$/,' ');     
 4 }     
 5 alert(getLocalTime(1293072805));
 6 //结果是2010年12月23日 10:53
 7 //第二种    
 8 function getLocalTime(nS) {     
 9     return new Date(parseInt(nS) * 1000).toLocaleString().substr(0,17)
10 }     
11 alert(getLocalTime(1293072805));
12 //第三种  格式为:2010-10-20 10:00:00
13     function getLocalTime(nS) {     
14        return new Date(parseInt(nS) * 1000).toLocaleString().replace(/年|月/g, "-").replace(/日/g, " ");      
15     }     
16     alert(getLocalTime(1177824835));  

JS获取HTML video标签视频第一帧

 

输入图片说明

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>capture screen</title>
</head>
<body>
<video id="video" controls="controls">
<source src="1.mp4">
</video>
<div id="output"></div>
<script type="text/javascript">
(function(){
var video, output;
var scale = 0.8;
var initialize = function() {
output = document.getElementById("output");
video = document.getElementById("video");
video.addEventListener('loadeddata',captureImage);
};
 
var captureImage = function() {
            var canvas = document.createElement("canvas");
            canvas.width = video.videoWidth * scale;
            canvas.height = video.videoHeight * scale;
            canvas.getContext('2d').drawImage(video, 0, 0, canvas.width, canvas.height);
 
            var img = document.createElement("img");
            img.src = canvas.toDataURL("image/png");
            output.appendChild(img);
};
 
initialize();
})();
</script>
</body>
</html>

如果加载不了的话 使用

var video=document.getElementById("video");
video.setAttribute("src",ret.data);
video.load();