1. GitHub 是什么?
GitHub是一個非常流行的全球代碼托管平台,基於Git版本控制技術實現,同時GitHub也是一個活躍的開發者交流社區。許多的開源項目都在GitHub上發布。例如著名的Linux操作系統內核的源代碼。
2. Git是什么?
Git是目前世界上最先進的分布式版本控制系統(沒有之一)。
它由Linux系統之父Linus Torvalds在2005年用C語言開發。
Git是一個分布式版本控制系統,沒有中央服務器,不同於svn等需要中央服務器的集中式版本控制系統。
Git的功能:版本控制(版本管理,遠程倉庫,分支協作)
人工版本管理:
Git版本管理:
3. Git功能原理
- git版本控制系統由工作區,緩存區,版本庫組成。
- git跟蹤的是文件的修改而不是全部文件。
- git擅長管理代碼等文本文件,不擅長管理圖片等二進制文件。
4. 快速上手
1,安裝Git
下載位置: Git下載鏈接—— https://git-scm.com/downloads
可以在bash中執行git命令,也可以在Jupyter Notebook中執行.
2,配置用戶信息
git config --global user.name "XX"git config --global user.email "XX@XX"
3,新建文件夾並切入
mkdir git-learncd git-learn
4,創建倉庫
git init
5,新建readme.txt
echo "hello world" >>readme.txt
6,查看當前狀態:
git status
7,添加全部修改到暫存區並提交
git add -Agit commit -m"comment"
8,添加github遠程庫並推送倉庫
git remote add origin https://github.com/XX/XXgit push -u origin master
9,在github上的項目clone到本地文件
git clone https://github.com/XX/XX ../XX
5. 安裝配置
命令列表:
- config(配置信息)
- init(創建倉庫)
- help(幫助信息)
- status(當前狀態)
特殊文件:
- .gitignore過濾文件(配置git無需管理的目錄和文件)
示范1:基本配置
#設置用戶名:git config --global user.name "XXX"#設置用戶郵箱:git config --global user.email "XXX@XX"#初始化倉庫git init
示范2:獲取幫助
#獲取常用git命令列表:git help#查看當前狀態,獲取提示:git status
示范3:建立.gitignore過濾配置文件
#過濾掉.DS_store文件echo ".DS_store" >.gitignore#過濾掉.ipynb_checkpoints目錄echo ".ipynb_checkpoints/" >> .gitignore#過濾掉所有zip文件echo "*.zip" >>.gitignore
6. 版本管理
命令列表:
- add(修改暫存)
- commit(提交修改)
- reset(版本回退)
- checkout(撤銷修改)
- rm(刪除文件)
- diff(比較文件)
- log(版本列表)
- reflog(版本歷史)
git reset的說明:
git reset HEAD^ #可以回退到上一個版本。git reset HEAD^^ #可以回退到上上個版本。git reset a234b3 #可以回退到版本號為 a234b3的版本。git reset --hard head^ #修改版本庫,保留暫存區,保留工作區git reset --mixed head^ #修改版本庫,修改暫存區,保留工作區git reset --soft head^ #修改版本庫,保留暫存區,保留工作區
示范1:版本提交
echo "hello world" >>readme.txtgit add readme.txtgit add -Agit commit -m"add readme.txt"#修改覆蓋上一次commit:git commit --amend#先暫存再提交:git commit -a -m"modify readme.txt"
示范2:版本回退
git reset --hard head^git reset head a23b5#撤銷修改:git checkout -- readme.txt#圖形顯示倉庫版本及分支狀態:git log --oneline --graph --all#查看head指向過的版本歷史:git reflog
示范3:日志壓縮
git reset --soft a23b5 #版本庫回退到某個版本,工作區保留修改git commit -m 'add feature' #將工作區的修改寫到版本庫中,a23b5到當前的日志被刪除
示范4:撤銷修改
echo "hello Haidian">>readme.txtgit checkout -- readme.txt #使用暫存區內容覆蓋文件
示范5:版本對比
#查看工作區文件與暫存區文件區別:git diff readme.txt#查看工作區文件和head文件區別:git diff --head readme.txt#查看暫存區文件與head文件區別:git diff --cached readme.txt#查看兩個版本某一文件的區別:git diff a458b d23e5 -- readme.txt
7. 遠程倉庫
命令列表:
- remote(設置遠程)
- push(推送遠程)
- clone(克隆遠程)
- pull(合並遠程)
- fetch(拉取遠程)
遠程倉庫說明:
#通常可以用SSH協議和遠程庫通信或使用http協議和遠程庫通信。#http協議較為方便,但SSH協議方式速度較快。#運行下面命令,並一路回車,在用戶主目錄里找到.ssh目錄。ssh-keygen -t rsa -C "your_emial@xxx.com"#目錄下的id_rsa有私鑰,不能泄露出去。里面的id_rsa.pub是公鑰,可分享給別人。#在GitHub——> settings ——> SSH Keys 頁面添加SSH公鑰。#將公鑰綁定github后嘗試建立SSH連接:ssh -T git@github.com
示范1:添加遠程
#使用ssh地址添加github遠程庫連接並命名為github,ssh方式更穩定快速,但稍麻煩:git remote add github git@github.com:lyhue1991/ai.git:#使用url地址添加遠程庫,url方式更簡單:git remote add origin https://github.com/lyhue1991/GitHub.git
示范2:推送到遠程
#推送本地至遠程庫origin的master分支:git push -u origin master#查看遠程庫信息:git remote -v#移除和遠程庫的連接:git remote remove orgin
示范3:拉取遠程
#建立當前master分支與遠程庫develop分支的追蹤關系:git branch --set-upstream master origin/develop#將遠程倉庫克隆到本地父目錄的ML文件夾:git clone https://github.com/lyhue1991/machine-learning.git ../ML#取回origin的develop分支與當前master分支合並(或會沖突):git pull orgin/develop:master#獲取origin的develop分支到本地並用merge合並(pull≈fetch+merge):git fetch origin developgit merge origin/develop
8. 分支協作
命令列表:
- branch(設置分支)
- checkout(切換分支)
- merge(合並分支)
- cherry-pick(采集提交)
- rebase(重演分支)
- stash(儲藏管理)
- tag(標簽管理)
示范1:切換分支
#查看分支信息:git branch#當前head位置新建develop分支:git branch develop#創建並切換到名稱為feature的新分支:git checkout -b feature#切換至master分支:git checkout master
示范2:分支整合
#head處於develop分支,合並feature分支(或會沖突):git merge --no-ff -m"merge feature" feature#采集其它分支中版本號為a458b的commit提交至當前分支(或會沖突):git cherry-pick a458b#使用當前所在分支作為base重演develop分支(或會沖突):git rebase develop
示范3:儲藏和標簽
git stash;git stash pop;git stash list;git stash save "message"git stash apply @2git tag;git tag v1.0;git tag v0.9 a2543d;#推送標簽到遠程(標簽不會自動推送)git push origin v1.0#刪除遠程標簽(先刪本地,再push):git tag -d v0.9git push origin :refs/tags/v0.9
git分支管理最佳實踐:
- master: 主分支,主要用來版本發布。
- develop:日常開發分支,該分支正常保存了開發的最新代碼。
- feature:具體的功能開發分支,只與 develop 分支交互。
- release:release 分支可以認為是 master 分支的未測試版。比如說某一期的功能全部開發完成,那么就將 develop 分支合並到 release 分支,測試沒有問題並且到了發布日期就合並到 master 分支,進行發布。
- hotfix:線上 bug 修復分支。
近期干貨
https://gitee.com/er_eggs/tor-plcprogram.git
public void OpenRemoteFile(string FileName)
{
object missing = System.Reflection.Missing.Value;
app = new Application();
wbs = app.Workbooks;
var token = IntPtr.Zero;
if (LogonUser("svcgzsdfh_par", "Jabil", "Jabidfl@201sdf!!", 2, 0, out token))
{
using (WindowsIdentity newId = new WindowsIdentity(token))
{
using (WindowsImpersonationContext impersonatedUser = newId.Impersonate())
{
var copyFile = AppDomain.CurrentDomain.BaseDirectory + "PackageListReport.xls";
File.Copy(FileName, copyFile, true);
wb = wbs.Open(copyFile, missing, false, missing, missing, missing, missing, missing, missing, true, missing, missing, missing, missing, missing);
mFilename = copyFile;
}
}
}
else
{
throw new Exception("模擬登錄失敗,請檢查用戶名密碼");
}
}
using (entry = new DirectoryEntry(ADHelper.ADPath, "jabil\\svcwsdfeh_par", "Jasdfbil@sdfk51!!", AuthenticationTypes.Secure))
{
entry.RefreshCache();
//DirectorySearcher search = new DirectorySearcher(entry);
//if (strNTID.IndexOf('@') != -1)
//{
// search.Filter = string.Format("Mail={0}", strNTID);
//}
//else
//{
// search.Filter = string.Format("SAMAccountName={0}", strNTID);
//}
//result = search.FindOne();
File.Copy(IdocFolder_BackUp + "\\" + Path.GetFileName(sFileName), IdocFolder + "\\" + Path.GetFileName(sFileName));
LogUtil.Info("Filename:" + Path.GetFileName(sFileName));
}
Process.Start("explorer.exe", "E:\\");
class Program
{
static void Main(string[] args)
{
//獲取當前運行程序的目錄
string fileDir = Environment.CurrentDirectory;
Console.WriteLine("當前程序目錄:"+fileDir);
//一個文件目錄
string filePath = "C:\\JiYF\\BenXH\\BenXHCMS.xml";
Console.WriteLine("該文件的目錄:"+filePath);
string str = "獲取文件的全路徑:" + Path.GetFullPath(filePath); //-->C:\JiYF\BenXH\BenXHCMS.xml
Console.WriteLine(str);
str = "獲取文件所在的目錄:" + Path.GetDirectoryName(filePath); //-->C:\JiYF\BenXH
Console.WriteLine(str);
str = "獲取文件的名稱含有后綴:" + Path.GetFileName(filePath); //-->BenXHCMS.xml
Console.WriteLine(str);
str = "獲取文件的名稱沒有后綴:" + Path.GetFileNameWithoutExtension(filePath); //-->BenXHCMS
Console.WriteLine(str);
str = "獲取路徑的后綴擴展名稱:" + Path.GetExtension(filePath); //-->.xml
Console.WriteLine(str);
str = "獲取路徑的根目錄:" + Path.GetPathRoot(filePath); //-->C:\
Console.WriteLine(str);
Console.ReadKey();
}
}
string str1 =Process.GetCurrentProcess().MainModule.FileName;//可獲得當前執行的exe的文件名。
string str2=Environment.CurrentDirectory;//獲取和設置當前目錄(即該進程從中啟動的目錄)的完全限定路徑。
//備注按照定義,如果該進程在本地或網絡驅動器的根目錄中啟動,則此屬性的值為驅動器名稱后跟一個尾部反斜杠(如“C:\”)。如果該進程在子目錄中啟動,則此屬性的值為不帶尾部反斜杠的驅動器和子目錄路徑(如“C:\mySubDirectory”)。
string str3=Directory.GetCurrentDirectory();//獲取應用程序的當前工作目錄。
string str4=AppDomain.CurrentDomain.BaseDirectory;//獲取基目錄,它由程序集沖突解決程序用來探測程序集。
string str5=Application.StartupPath;//獲取啟動了應用程序的可執行文件的路徑,不包括可執行文件的名稱。
string str6=Application.ExecutablePath;//獲取啟動了應用程序的可執行文件的路徑,包括可執行文件的名稱。
string str7=AppDomain.CurrentDomain.SetupInformation.ApplicationBase;//獲取或設置包含該應用程序的目錄的名稱。
1. System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName
獲取模塊的完整路徑。
2. System.Environment.CurrentDirectory
獲取和設置當前目錄(該進程從中啟動的目錄)的完全限定目錄。
3. System.IO.Directory.GetCurrentDirectory()
獲取應用程序的當前工作目錄。這個不一定是程序從中啟動的目錄啊,有可能程序放在C:\www里,這個函數有可能返回C:\ Documents and Settings\ZYB\,或者C:\Program Files\Adobe\,有時不一定返回什么東東,我也搞不懂了。
4. System.AppDomain.CurrentDomain.BaseDirectory
獲取程序的基目錄。
5. System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase
獲取和設置包括該應用程序的目錄的名稱。
6. System.Windows.Forms.Application.StartupPath
獲取啟動了應用程序的可執行文件的路徑。效果和、一樣。只是返回的字符串后面多了一個"\"而已
7. System.Windows.Forms.Application.ExecutablePath
獲取啟動了應用程序的可執行文件的路徑及文件名,效果和一樣。
From <http://blog.sina.com.cn/s/blog_591842240100tlhn.html>
方式一:通過委托發起線程(BeginInvoke):
Func<int, int> a = Test;
IAsyncResult ar = a.BeginInvoke(20, OnCallBack, a);//倒數第二個參數是一個委托類型的參數,表示回調函數,當線程結束時會調用這個委托指向的方法;倒數第一個參數用來給回調函數傳遞數據;通過ar獲取數據a
方式二:通過Thread發起線程,thread創建的線程都是前台線程,線程池創建的線程都是后台線程
1. thread參數為靜態方法
static void Downloadfile()
{
Console.WriteLine("開始下載" + Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(2000);
Console.WriteLine("下載完成");
}
static void Main(string[] args)
{
Thread t = new Thread(Downloadfile);
t.Start();
Console.WriteLine("main");
Console.ReadKey();
}
2. lamda表達式
1 Thread t = new Thread(() =>
2 {
3 Console.WriteLine("開始下載" + Thread.CurrentThread.ManagedThreadId);
4 Thread.Sleep(2000);
5 Console.WriteLine("下載完成");
6 });
7 t.Start();
3. Thread參數為普通方法
1 class Program
2 {
3 static void Downloadfile(object filename)
4 {
5 Console.WriteLine("開始下載" + filename+ Thread.CurrentThread.ManagedThreadId);
6 Thread.Sleep(2000);
7 Console.WriteLine("下載完成"+filename);
8 }
9
10 static void Main(string[] args)
11 {
12 //Thread t = new Thread(() =>
13 //{
14
15 // Console.WriteLine("開始下載" + Thread.CurrentThread.ManagedThreadId);
16 // Thread.Sleep(2000);
17 // Console.WriteLine("下載完成");
18 //});
19 //Thread t = new Thread(Downloadfile);
20 MyThread my = new MyThread("xxx.bt", "http://www.xxx.bbs");
21 Thread t = new Thread(my.DownFile);
22 t.Start();
23 Console.WriteLine("main");
24 Console.ReadKey();
25 }
26 }
1 class MyThread
2 {
3 private string filename;
4 private string filepath;
5 public MyThread(string fileName, string filePath)
6 {
7 this.filename = fileName;
8 this.filepath = filePath;
9 }
10
11 public void DownFile()
12 {
13 Console.WriteLine("開始下載" + filepath + filename);
14 Thread.Sleep(2000);
15 Console.WriteLine("下載完成");
16 }
17
18 }
19 }
方式三:線程池:適合用於小任務線程,
WaitCallback:將方法排入隊列以便執行,WaitCallback,表示要執行的方法。如果將方法成功排入隊列,則為 true;否則為 false。
1 class Program
2 {
3 static void ThreadMethod(object state)
4 {
5 Console.WriteLine("線程開始"+Thread.CurrentThread.ManagedThreadId);
6 Thread.Sleep(2000);
7 Console.WriteLine("線程結束");
8 }
9 static void Main(string[] args)
10 {
11 ThreadPool.QueueUserWorkItem(ThreadMethod);
12 ThreadPool.QueueUserWorkItem(ThreadMethod);
13 ThreadPool.QueueUserWorkItem(ThreadMethod);
14 ThreadPool.QueueUserWorkItem(ThreadMethod);
15 ThreadPool.QueueUserWorkItem(ThreadMethod);
16 Console.ReadKey();
17 }
18 }
方式四:任務線程
1. 通過Task創建
1 class Program
2 {
3 static void ThreadMethod()
4 {
5 Console.WriteLine("任務開始" + Thread.CurrentThread.ManagedThreadId);
6 Thread.Sleep(2000);
7 Console.WriteLine("任務結束");
8 }
9
10 static void Main(string[] args)
11 {
12 Task t = new Task(ThreadMethod);
13 t.Start();
14 Console.WriteLine("main");
15 Console.ReadKey();
16 }
17 }
2. 通過TaskFactory創建
TaskFactory tf = new TaskFactory();
tf.StartNew(ThreadMethod);
tf.StartNew(ThreadMethod);
tf.StartNew(ThreadMethod);
From <https://www.cnblogs.com/wxhao/p/13604924.html>
C# 委托(Delegate)
C# 中的委托(Delegate)類似於 C 或 C++ 中函數的指針。委托(Delegate) 是存有對某個方法的引用的一種引用類型變量。引用可在運行時被改變。
委托(Delegate)特別用於實現事件和回調方法。所有的委托(Delegate)都派生自 System.Delegate 類。
聲明委托(Delegate)
委托聲明決定了可由該委托引用的方法。委托可指向一個與其具有相同標簽的方法。
例如,假設有一個委托:
public delegate int MyDelegate (string s);
上面的委托可被用於引用任何一個帶有一個單一的 string 參數的方法,並返回一個 int 類型變量。
聲明委托的語法如下:
delegate <return type> <delegate-name> <parameter list>
實例化委托(Delegate)
一旦聲明了委托類型,委托對象必須使用 new 關鍵字來創建,且與一個特定的方法有關。當創建委托時,傳遞到 new 語句的參數就像方法調用一樣書寫,但是不帶有參數。例如:
public delegate void printString(string s);
...
printString ps1 = new printString(WriteToScreen);
printString ps2 = new printString(WriteToFile);
下面的實例演示了委托的聲明、實例化和使用,該委托可用於引用帶有一個整型參數的方法,並返回一個整型值。
實例
using System;
delegate int NumberChanger(int n);
namespace DelegateAppl
{
class TestDelegate
{
static int num = 10;
public static int AddNum(int p)
{
num += p;
return num;
}
public static int MultNum(int q)
{
num *= q;
return num;
}
public static int getNum()
{
return num;
}
static void Main(string[] args)
{
// 創建委托實例
NumberChanger nc1 = new NumberChanger(AddNum);
NumberChanger nc2 = new NumberChanger(MultNum);
// 使用委托對象調用方法
nc1(25);
Console.WriteLine("Value of Num: {0}", getNum());
nc2(5);
Console.WriteLine("Value of Num: {0}", getNum());
Console.ReadKey();
}
}
}
當上面的代碼被編譯和執行時,它會產生下列結果:
Value of Num: 35
Value of Num: 175
委托的多播(Multicasting of a Delegate)
委托對象可使用 "+" 運算符進行合並。一個合並委托調用它所合並的兩個委托。只有相同類型的委托可被合並。"-" 運算符可用於從合並的委托中移除組件委托。
使用委托的這個有用的特點,您可以創建一個委托被調用時要調用的方法的調用列表。這被稱為委托的 多播(multicasting),也叫組播。下面的程序演示了委托的多播:
實例
using System;
delegate int NumberChanger(int n);
namespace DelegateAppl
{
class TestDelegate
{
static int num = 10;
public static int AddNum(int p)
{
num += p;
return num;
}
public static int MultNum(int q)
{
num *= q;
return num;
}
public static int getNum()
{
return num;
}
static void Main(string[] args)
{
// 創建委托實例
NumberChanger nc;
NumberChanger nc1 = new NumberChanger(AddNum);
NumberChanger nc2 = new NumberChanger(MultNum);
nc = nc1;
nc += nc2;
// 調用多播
nc(5);
Console.WriteLine("Value of Num: {0}", getNum());
Console.ReadKey();
}
}
}
當上面的代碼被編譯和執行時,它會產生下列結果:
Value of Num: 75
委托(Delegate)的用途
下面的實例演示了委托的用法。委托 printString 可用於引用帶有一個字符串作為輸入的方法,並不返回任何東西。
我們使用這個委托來調用兩個方法,第一個把字符串打印到控制台,第二個把字符串打印到文件:
實例
using System;
using System.IO;
namespace DelegateAppl
{
class PrintString
{
static FileStream fs;
static StreamWriter sw;
// 委托聲明
public delegate void printString(string s);
// 該方法打印到控制台
public static void WriteToScreen(string str)
{
Console.WriteLine("The String is: {0}", str);
}
// 該方法打印到文件
public static void WriteToFile(string s)
{
fs = new FileStream("c:\\message.txt", FileMode.Append, FileAccess.Write);
sw = new StreamWriter(fs);
sw.WriteLine(s);
sw.Flush();
sw.Close();
fs.Close();
}
// 該方法把委托作為參數,並使用它調用方法
public static void sendString(printString ps)
{
ps("Hello World");
}
static void Main(string[] args)
{
printString ps1 = new printString(WriteToScreen);
printString ps2 = new printString(WriteToFile);
sendString(ps1);
sendString(ps2);
Console.ReadKey();
}
}
}
當上面的代碼被編譯和執行時,它會產生下列結果:
The String is: Hello Wor
From <https://www.runoob.com/csharp/csharp-delegate.html>
---14位日期
Select replace( replace(replace(CONVERT(varchar(100), GETDATE(), 20),'-',''),':',''),' ','') --20210428133051
Select replace( replace( replace(replace(CONVERT(varchar(100), GETDATE(), 121),'-',''),':',''),' ',''),'.','') --20210428133321540
----時間對比
select DATEDIFF ([second], '2004-09-19 00:00:18', '2004-09-18 00:00:19')
select DATEDIFF ([second], '2004-09-19 00:00:18', GetDate())
---字符串轉日期
select convert(datetime,substring(left('20210428133051',8)+' ' + substring('20210428133051',9,2)+':' + substring('20210428133051',11,2)+':' + substring('20210428133051',13,2),1,17))
DateTime dttttt = DateTime.ParseExact("20210625132750", "yyyyMMddHHmmss", System.Globalization.CultureInfo.CurrentCulture);
timeFrom = dttttt.ToString("yyyy-MM-dd HH:mm:ss");//sunjie -2021年6月28日15:37:49
DECLARE @start DATE,@end DATE ,@DateSpan int
set @DateSpan = -30
SET @start=dateadd(dd,@DateSpan, getdate())
SET @end=getdate()
select
DATEADD(DAY,number,@start) ymd
from master..spt_values
where type='p' AND
number<=DATEDIFF(day,@start,@end)
---14位日期
Select replace( replace(replace(CONVERT(varchar(100), GETDATE(), 20),'-',''),':',''),' ','') --20210428133051
Select replace( replace( replace(replace(CONVERT(varchar(100), GETDATE(), 121),'-',''),':',''),' ',''),'.','') --20210428133321540
----時間對比
select DATEDIFF ([second], '2004-09-19 00:00:18', '2004-09-18 00:00:19')
select DATEDIFF ([second], '2004-09-19 00:00:18', GetDate())
---字符串轉日期
select convert(datetime,substring(left('20210428133051',8)+' ' + substring('20210428133051',9,2)+':' + substring('20210428133051',11,2)+':' + substring('20210428133051',13,2),1,17))
DateTime dttttt = DateTime.ParseExact("20210625132750", "yyyyMMddHHmmss", System.Globalization.CultureInfo.CurrentCulture);
timeFrom = dttttt.ToString("yyyy-MM-dd HH:mm:ss");//sunjie -2021年6月28日15:37:49
DECLARE @start DATE,@end DATE ,@DateSpan int
set @DateSpan = -30
SET @start=dateadd(dd,@DateSpan, getdate())
SET @end=getdate()
select
DATEADD(DAY,number,@start) ymd
from master..spt_values
where type='p' AND
number<=DATEDIFF(day,@start,@end)
第一大類:整數數據
bit:bit數據類型代表0,1或NULL,就是表示true,false.占用1byte.
int:以4個字節來存儲正負數.可存儲范圍為:-2^31至2^31-1.
smallint:以2個字節來存儲正負數.存儲范圍為:-2^15至2^15-1
tinyint: 是最小的整數類型,僅用1字節,范圍:0至此^8-1
第二大類:近似浮點數值數據
float:用8個字節來存儲數據.最多可為53位.范圍為:-1.79E+308至1.79E+308.
real:位數為24,用4個字節,數字范圍:-3.04E+38至3.04E+38
第三大類:日期時間數據
datatime:表示時間范圍可以表示從1753/1/1至9999/12/31,時間可以表示到3.33/1000秒.使用8個字節.
smalldatetime:表示時間范圍可以表示從1900/1/1至2079/12/31.使用4個字節.
第四大類:字符串數據
char:非Unincode編碼,長度是固定的,最短為1字節,最長為8000個字節.不足的長度會用空白補上.
varchar: 非Unincode編碼,長度可變,最短為1字節,最長為8000個字節,尾部的空白會去掉.
text: 非Unincode編碼,長寬也是設定的,最長可以存放2G的數據.,存儲長文本信息
nchar: Unincode編碼,長度是固定的,最短為1字節,最長為4000個字節.不足的長度會用空白補上.儲存一個字符需2個字節.
nvarchar: Unincode編碼,長度是可變的,最短為1字節,最長為4000個字節.尾部的空白會去掉.儲存一個字符需要2個字.
ntext: Unincode編碼,長度是可變的,最短為1字節,最長為2G.尾部的空白會去掉,儲存一個字符需要2個字節.
第五大類:貨幣數據類型
money:記錄金額范圍為:-92233720368577.5808至92233720368577.5807.需要8 個字節.
smallmoney:記錄金額范圍為:-214748.3648至214748.36487.需要4個字節.
第六大類:二進制碼字符串數據
binary:固定長度的二進制碼字符串字段,最短為1,最長為8000.
varbinary:與binary差異為數據尾部是00時,varbinary會將其去掉
image:為可變長度的二進制碼字符串,最長2G.
drop table TBM_MC_UI
GO
CREATE TABLE TBM_MC_UI(
J_ID INT NOT NULL,
FCT_CODE VARCHAR (20) NOT NULL,
PLANT_CODE VARCHAR (20) NOT NULL,
UI_SCREEN_ID VARCHAR (20) NOT NULL,
UI_CTGR_CODE VARCHAR (20) ,
RESOL_CTGR_CODE VARCHAR (20) ,
SCREEN_NM VARCHAR (100) ,
SCREEN_DESC VARCHAR (100) ,
FILE_ID VARCHAR (100) ,
UI_URL VARCHAR (200) ,
FORM_ID VARCHAR (50) ,
MLANG_ID VARCHAR (50) ,
K_DESC VARCHAR (200) ,
REMARKS VARCHAR (200) ,
N1_EXTD_CULM_CONT VARCHAR (100) ,
N2_EXTD_CULM_CONT VARCHAR (100) ,
N3_EXTD_CULM_CONT VARCHAR (100) ,
N4_EXTD_CULM_CONT VARCHAR (100) ,
N5_EXTD_CULM_CONT VARCHAR (100) ,
DEL_YN VARCHAR (1) ,
USE_YN VARCHAR (1) ,
FST_REGER_ID VARCHAR (50) ,
FST_REG_DT date,
FST_REGER_IP VARCHAR (50) ,
FNL_UPDER_ID VARCHAR (50) ,
FNL_UPD_DT date,
FNL_UPDER_IP VARCHAR (50) -- ,
--PRIMARY KEY( J_ID,FCT_CODE,PLANT_CODE,UI_SCREEN_ID)
)
GO
ALTER TABLE TBM_MC_UI WITH NOCHECK ADD
CONSTRAINT [PK_TBM_MC_UI] PRIMARY KEY NONCLUSTERED
(
J_ID,FCT_CODE,PLANT_CODE,UI_SCREEN_ID
)
GO
SET ANSI_PADDING OFF
GO
SET ANSI_nulls on
go
set QUOTED_IDENTIFIER ON
GO
換一種:case when userName is null THEN '空' else '有值' end,這種寫法好使;
From <https://www.cnblogs.com/yanshaoxiong/p/11469006.html>
if exists(select * from table1 where ...)
select section2
else
select section3
From <https://zhidao.baidu.com/question/316975625.html>
select section1
if(@@rowcount > 0) //@@rowcount 返回上一次查詢結果所影響的行數。
select section2
else
select section3
From <https://zhidao.baidu.com/question/316975625.html>
sqlserver
Oracle
EXEC sp_GetProductionHourlyReport_Test
@Sector = 'WEH' ,
@CustomerGroup = 'HP-AIO',
@QMID = 0,
@CustomerID = 0,
@FactoryMARouteID = 0,
@Station = 'MI',
@Shift = 3,
@StartTime = '2021-07-01 07:00:00',
@EndTime = '2021-07-01 19:00:00' ,
@ShowEff = 0,
@Tester = NULL,
@CellLine = NULL
EXEC dbo.ProTest @OrderNO = N'單號001', @OrderName = N'名稱001', @RMDSC = N'備注'
(或不寫列名"EXEC dbo.ProTest N'單號001', N'名稱001', N'備注';",但不能混合使用,下同)
From <https://www.cnblogs.com/atlj/p/11184952.html>
存儲過程學習
一、定義變量
--簡單賦值
declare @a int
set @a=5
print @a
--使用select語句賦值
declare @user1 nvarchar(50)
select @user1='張三'
print @user1
declare @user2 nvarchar(50)
select @user2 = Name from ST_User where ID=1
print @user2
--使用update語句賦值
declare @user3 nvarchar(50)
update ST_User set @user3 = Name where ID=1
print @user3
二、表、臨時表、表變量
--創建臨時表1
create table #DU_User1
(
[ID] [int] NOT NULL,
[Oid] [int] NOT NULL,
[Login] [nvarchar](50) NOT NULL,
[Rtx] [nvarchar](4) NOT NULL,
[Name] [nvarchar](5) NOT NULL,
[Password] [nvarchar](max) NULL,
[State] [nvarchar](8) NOT NULL
);
--向臨時表1插入一條記錄
insert into #DU_User1 (ID,Oid,[Login],Rtx,Name,[Password],State) values (100,2,'LS','0000','臨時','321','特殊');
--從ST_User查詢數據,填充至新生成的臨時表
select * into #DU_User2 from ST_User where ID<8
--查詢並聯合兩臨時表
select * from #DU_User2 where ID<3 union select * from #DU_User1
--刪除兩臨時表
drop table #DU_User1
drop table #DU_User2
--創建臨時表
CREATE TABLE #t
(
[ID] [int] NOT NULL,
[Oid] [int] NOT NULL,
[Login] [nvarchar](50) NOT NULL,
[Rtx] [nvarchar](4) NOT NULL,
[Name] [nvarchar](5) NOT NULL,
[Password] [nvarchar](max) NULL,
[State] [nvarchar](8) NOT NULL,
)
--將查詢結果集(多條數據)插入臨時表
insert into #t select * from ST_User
--不能這樣插入
--select * into #t from dbo.ST_User
--添加一列,為int型自增長子段
alter table #t add [myid] int NOT NULL IDENTITY(1,1)
--添加一列,默認填充全球唯一標識
alter table #t add [myid1] uniqueidentifier NOT NULL default(newid())
select * from #t
drop table #t
--給查詢結果集增加自增長列
--無主鍵時:
select IDENTITY(int,1,1)as ID, Name,[Login],[Password] into #t from ST_User
select * from #t
--有主鍵時:
select (select SUM(1) from ST_User where ID<= a.ID) as myID,* from ST_User a order by myID
--定義表變量
declare @t table
(
id int not null,
msg nvarchar(50) null
)
insert into @t values(1,'1')
insert into @t values(2,'2')
select * from @t
三、循環
--while循環計算1到100的和
declare @a int
declare @sum int
set @a=1
set @sum=0
while @a<=100
begin
set @sum+=@a
set @a+=1
end
print @sum
四、條件語句
--if,else條件分支
if(1+1=2)
begin
print '對'
end
else
begin
print '錯'
end
--when then條件分支
declare @today int
declare @week nvarchar(3)
set @today=3
set @week=case
when @today=1 then '星期一'
when @today=2 then '星期二'
when @today=3 then '星期三'
when @today=4 then '星期四'
when @today=5 then '星期五'
when @today=6 then '星期六'
when @today=7 then '星期日'
else '值錯誤'
end
print @week
五、游標
declare @ID int
declare @Oid int
declare @Login varchar(50)
--定義一個游標
declare user_cur cursor for select ID,Oid,[Login] from ST_User
--打開游標
open user_cur
while @@fetch_status=0
begin
--讀取游標
fetch next from user_cur into @ID,@Oid,@Login
print @ID
--print @Login
end
close user_cur
--摧毀游標
deallocate user_cur
六、觸發器
觸發器中的臨時表:
Inserted
存放進行insert和update 操作后的數據
Deleted
存放進行delete 和update操作前的數據
--創建觸發器
Create trigger User_OnUpdate
On ST_User
for Update
As
declare @msg nvarchar(50)
--@msg記錄修改情況
select @msg = N'姓名從“' + Deleted.Name + N'”修改為“' + Inserted.Name + '”' from Inserted,Deleted
--插入日志表
insert into [LOG](MSG)values(@msg)
--刪除觸發器
drop trigger User_OnUpdate
七、存儲過程
--創建帶output參數的存儲過程
CREATE PROCEDURE PR_Sum
@a int,
@b int,
@sum int output
AS
BEGIN
set @sum=@a+@b
END
--創建Return返回值存儲過程
CREATE PROCEDURE PR_Sum2
@a int,
@b int
AS
BEGIN
Return @a+@b
END
--執行存儲過程獲取output型返回值
declare @mysum int
execute PR_Sum 1,2,@mysum output
print @mysum
--執行存儲過程獲取Return型返回值
declare @mysum2 int
execute @mysum2= PR_Sum2 1,2
print @mysum2
八、自定義函數
函數的分類:
1)標量值函數
2)表值函數
a:內聯表值函數
b:多語句表值函數
3)系統函數
--新建標量值函數
create function FUNC_Sum1
(
@a int,
@b int
)
returns int
as
begin
return @a+@b
end
--新建內聯表值函數
create function FUNC_UserTab_1
(
@myId int
)
returns table
as
return (select * from ST_User where ID<@myId)
--新建多語句表值函數
create function FUNC_UserTab_2
(
@myId int
)
returns @t table
(
[ID] [int] NOT NULL,
[Oid] [int] NOT NULL,
[Login] [nvarchar](50) NOT NULL,
[Rtx] [nvarchar](4) NOT NULL,
[Name] [nvarchar](5) NOT NULL,
[Password] [nvarchar](max) NULL,
[State] [nvarchar](8) NOT NULL
)
as
begin
insert into @t select * from ST_User where ID<@myId
return
end
--調用表值函數
select * from dbo.FUNC_UserTab_1(15)
--調用標量值函數
declare @s int
set @s=dbo.FUNC_Sum1(100,50)
print @s
--刪除標量值函數
drop function FUNC_Sum1
談談自定義函數與存儲過程的區別:
一、自定義函數:
1. 可以返回表變量
2. 限制頗多,包括
不能使用output參數;
不能用臨時表;
函數內部的操作不能影響到外部環境;
不能通過select返回結果集;
不能update,delete,數據庫表;
3. 必須return 一個標量值或表變量
自定義函數一般用在復用度高,功能簡單單一,爭對性強的地方。
二、存儲過程
1. 不能返回表變量
2. 限制少,可以執行對數據庫表的操作,可以返回數據集
3. 可以return一個標量值,也可以省略return
存儲過程一般用在實現復雜的功能,數據操縱方面。
From <https://www.cnblogs.com/lihuiqi/p/10471740.html>
SELECT substring(replace( replace(replace(CONVERT(varchar(100), GETDATE(), 120),' ',''),'-',''),':',''),1,8)
select cast(substring(replace( replace(replace(CONVERT(varchar(100), GETDATE(), 120),' ',''),'-',''),':',''),1,8)) as varchar
SELECT cast(datepart(week,cast(substring(replace( replace(replace(CONVERT(varchar(100), GETDATE(), 120),' ',''),'-',''),':',''),1,8) as varchar))as varchar) + 'W'
所有 周數據
declare @sDate datetime = '2022-01-01'
,@eDate datetime= '2022-12-31'
select d2.weekRange,d2.FirstDay,d2.EndDay from
(
select datepart(WEEK,d.dates) weekRange
,dateadd(Day,1-(DATEPART(Weekday,d.dates)+@@DATEFIRST-1)%7,d.dates) FirstDay
,dateadd(wk, datediff(wk,0,d.dates), 6) EndDay
from
(
select dateadd(dd,number,@sDate) AS dates from master..spt_values
where type='p' and dateadd(dd,number,@sDate)<=@eDate
) d
) d2 group by d2.weekRange,d2.FirstDay,d2.EndDay
周六周天 本月
select * from(
select convert(varchar(8),GETDATE(),120)+ltrim(number) as [date]
from master..spt_values
where type='P' and number between 1 and DAY(GETDATE())
)t
where DATEPART(W,[date])=7 or DATEPART(W,[date])=1
select * from AVL_AVLResult where datepart(weekday, sgd006) NOT IN(1,7)
select COUNT(1) as [不是星期六的天數] from(
select convert(varchar(8),GETDATE(),120)+ltrim(number) as [date]
from master..spt_values where type='P' and number between 1 and DAY(GETDATE()))t
where DATEPART(W,[date])<>7 and DATEPART(W,[date])<>6
/*不是星期六的天數11*/
select COUNT(1) as [不是星期六的天數] from(
select convert(varchar(8),GETDATE(),120)+ltrim(number) as [date]
from master..spt_values
where type='P' and number between 1 and DAY(GETDATE())
)t
where DATEPART(W,[date])<>7 and DATEPART(W,[date])<>6
select * from(
select convert(varchar(8),GETDATE(),120)+ltrim(number) as [date]
from master..spt_values
where type='P' and number between 1 and DAY(GETDATE())
)t
where DATEPART(W,[date])<>7 and DATEPART(W,[date])<>6
------- 周日期范圍
declare @sDate datetime = '2022-01-01'
,@eDate datetime= '2022-12-31'
select * from(
select convert(varchar(8),GETDATE(),120)+ltrim(number) as [date]
from master..spt_values
where type='P' and number between 1 and DAY(GETDATE())
)t
where DATEPART(W,[date])=7 or DATEPART(W,[date])=1
--- 一個月 日期
select convert(varchar(8),GETDATE(),120)+ltrim(number) as [date]
from master..spt_values
where type='P' and number between 1 and DAY(GETDATE())
------------- 周六 周天
SELECT convert(varchar(8),GETDATE(),120)+ltrim(number) as [date]
FROM MASTER..SPT_VALUES
WHERE TYPE = 'P'
AND DATEADD(DAY,NUMBER,'2022-01-01')<='2022-12-31'
AND DATEPART(WEEKDAY,DATEADD(DAY,NUMBER,'2022-12-31')) IN (1,2)
------------------------------------------------------------------查數據庫大小-----
SELECT database_id AS DataBaseId,DB_NAME(database_id) AS DataBaseName,
CAST(SUM(SIZE)*8.0/1024/1024 AS DECIMAL(9, 4)) AS [SizeGB]
FROM sys.master_files
GROUP BY database_id order by [SizeGB] desc
select * from sys.master_files where database_id = '8'
------------------------------------------------------------------查各表記錄數-----
select a.name as tab_name,max(b.rows) as row_num
from sysobjects a,sysindexes b
where a.id=b.id and a.xtype='u'
group by a.name
order by max(b.rows) desc
SELECT ('Wk'+cast(datepart(week,ACRS_YMD) as varchar)) WEEK_PASS ,sum(1) WEEK_PASS_SUM,cast('98.00' as decimal(10,1) ) Goal into #weekPass FROM [TBM_PM_PROD_PRGS]
where 1= 1 and OPERATE_PASS = 'Y' and FST_REG_DT > dateadd(MM,-1,getdate()) and QC_DECI_PASS_YN = 'Y' and PACK_QC_DECI_PASS_YN = 'Y' ---- 周別的不良個數 百分比目標
group by ('Wk'+cast(datepart(week,ACRS_YMD) as varchar)) ;
SELECT ('Wk'+cast(datepart(week,ACRS_YMD) as varchar)) WEEK_OK ,sum(1) WEEK_OK_SUM,cast('98.00' as decimal(10,1) ) Goal into #weekok FROM [TBM_PM_PROD_PRGS]
where 1= 1 and FST_REG_DT > dateadd(MM,-1,getdate()) and QC_DECI_PASS_YN = 'Y' and PACK_QC_DECI_PASS_YN = 'Y' ---- 周別的不良個數 百分比目標
group by ('Wk'+cast(datepart(week,ACRS_YMD) as varchar)) ;
select A.*, case when D.WEEK_PASS_SUM is null then 0 else D.WEEK_PASS_SUM end as weekdefect,
round(
(
(case when D.WEEK_PASS_SUM is NULL then '0' else D.WEEK_PASS_SUM end ) /
cast(A.WEEK_OK_SUM as decimal(10,1) )
) * 100
,2) as weekpersent
from #weekok A
left join #weekPass D
on A.WEEK_OK = D.WEEK_PASS order by A.WEEK_OK ;
drop table #weekPass;
drop table #weekok;
SELECT (cast(substring(ACRS_YMD,5,2)as varchar)+'Month') MONTH_PROD,sum(1) MONTH_PROD_SUM FROM TBM_PM_PROD_PRGS
where 1= 1 and FST_REG_DT > dateadd(MM,-1,getdate()) and QC_DECI_PASS_YN = 'Y' and PACK_QC_DECI_PASS_YN = 'Y' ---- 月別總數據
group by (cast(substring(ACRS_YMD,5,2)as varchar)+'Month') ;
SELECT (cast(substring(ACRS_YMD,5,2)as varchar)+'Month') MONTH_PROD_Y ,sum(1) MONTH_PROD_YSUM FROM TBM_PM_PROD_PRGS
where 1= 1 and FST_REG_DT > dateadd(MM,-1,getdate()) and QC_DECI_PASS_YN = 'Y' and PACK_QC_DECI_PASS_YN = 'Y' ---- 月別 Y 數據
and OPERATE_PASS = 'Y' group by (cast(substring(ACRS_YMD,5,2)as varchar)+'Month');
SELECT (cast(substring(ACRS_YMD,5,2)as varchar)+'Month') MONTH_PROD_N ,sum(1) MONTH_PROD_NSUM FROM TBM_PM_PROD_PRGS
where 1= 1 and FST_REG_DT > dateadd(MM,-1,getdate()) and QC_DECI_PASS_YN = 'Y' and PACK_QC_DECI_PASS_YN = 'Y' ---- 月別 N 數據
and OPERATE_PASS = 'N' group by (cast(substring(ACRS_YMD,5,2)as varchar)+'Month') ;
SELECT top 6 substring( PRODC_CHK_TYPE,1,16) as PRODC_CHK_TYPE ,sum(1) DEFT_TYPE_SUM FROM [TBD_PM_PROD_PRGS]
where 1 =1 and FST_REG_DT > dateadd(MM,-1,getdate()) and N1_EXTD_CULM_CONT = 'Y' and DEL_YN = 'N' and USE_YN = 'Y' ----不良區分 餅狀圖 month
group by substring( PRODC_CHK_TYPE,1,16) order by DEFT_TYPE_SUM desc;
SELECT BAY_CODE , ('Wk'+cast(datepart(week,ACRS_YMD) as varchar)) as weekdate,sum(1) BAY_PROD_SUM into #baysum FROM [TBM_PM_PROD_PRGS]
where 1 =1 and FST_REG_DT > dateadd(MM,-1,getdate()) and QC_DECI_PASS_YN = 'Y' and PACK_QC_DECI_PASS_YN = 'Y' ----產線別生產產品數量 month
group by BAY_CODE , ('Wk'+cast(datepart(week,ACRS_YMD) as varchar));
SELECT BAY_CODE , ('Wk'+cast(datepart(week,ACRS_YMD) as varchar)) as weekdate,sum(1) BAY_PROD_YSUM into #bayysum FROM [TBM_PM_PROD_PRGS]
where 1 =1 and FST_REG_DT > dateadd(MM,-1,getdate()) and OPERATE_PASS = 'Y' and QC_DECI_PASS_YN = 'Y' and PACK_QC_DECI_PASS_YN = 'Y' ----產線別生產產品數量 month
group by BAY_CODE , ('Wk'+cast(datepart(week,ACRS_YMD) as varchar));
SELECT BAY_CODE , ('Wk'+cast(datepart(week,ACRS_YMD) as varchar)) as weekdate,sum(1) BAY_PROD_NSUM into #baynsum FROM [TBM_PM_PROD_PRGS]
where 1 =1 and FST_REG_DT > dateadd(MM,-1,getdate()) and OPERATE_PASS = 'N' and QC_DECI_PASS_YN = 'Y' and PACK_QC_DECI_PASS_YN = 'Y' ----產線別生產產品數量 month
group by BAY_CODE , ('Wk'+cast(datepart(week,ACRS_YMD) as varchar));
select A.*,case when N.BAY_PROD_NSUM is NULL then '0' else N.BAY_PROD_NSUM end as BAY_PROD_NSUM , round(
(
(case when N.BAY_PROD_NSUM is NULL then '0' else N.BAY_PROD_NSUM end ) /
cast(A.BAY_PROD_SUM as decimal(10,1) )
) * 100
,2) as persent ,round((
(
(case when N.BAY_PROD_NSUM is NULL then '0' else N.BAY_PROD_NSUM end ) /
cast(A.BAY_PROD_SUM as decimal(10,1) )
) * 1000000
) ,2) as DPPM from #baysum A
left join #baynsum N
on A.BAY_CODE = N.BAY_CODE and A.weekdate = N.weekdate
order by BAY_CODE,weekdate;
SELECT ('Wk'+cast(datepart(week,ACRS_YMD) as varchar)) as weekdate,sum(1) BAY_PROD_NNN into #baytotalsumN FROM [TBM_PM_PROD_PRGS]
where 1 =1 and FST_REG_DT > dateadd(MM,-1,getdate()) and OPERATE_PASS = 'N' and QC_DECI_PASS_YN = 'Y' and PACK_QC_DECI_PASS_YN = 'Y' ----產線別生產產品數量 month
group by ('Wk'+cast(datepart(week,ACRS_YMD) as varchar));
SELECT ('Wk'+cast(datepart(week,ACRS_YMD) as varchar)) as weekdate,sum(1) BAY_PROD_YYY into #baytotalsumY FROM [TBM_PM_PROD_PRGS]
where 1 =1 and FST_REG_DT > dateadd(MM,-1,getdate()) and OPERATE_PASS = 'Y' and QC_DECI_PASS_YN = 'Y' and PACK_QC_DECI_PASS_YN = 'Y' ----產線別生產產品數量 month
group by ('Wk'+cast(datepart(week,ACRS_YMD) as varchar));
SELECT ('Wk'+cast(datepart(week,ACRS_YMD) as varchar)) as weekdate,sum(1) BAY_PROD_SSS into #baytotalsum FROM [TBM_PM_PROD_PRGS]
where 1 =1 and FST_REG_DT > dateadd(MM,-1,getdate()) and QC_DECI_PASS_YN = 'Y' and PACK_QC_DECI_PASS_YN = 'Y' ----產線別生產產品數量 month
group by ('Wk'+cast(datepart(week,ACRS_YMD) as varchar));
SELECT top 6 Model_code,sum(1) BAY_PROD_WeekN into #ModelWeeksumN FROM [TBM_PM_PROD_PRGS]
where 1 =1 and FST_REG_DT > dateadd(dd,-7,getdate()) and OPERATE_PASS = 'N' and QC_DECI_PASS_YN = 'Y' and PACK_QC_DECI_PASS_YN = 'Y' ----產線別生產產品數量 month
group by Model_code order by BAY_PROD_WeekN desc;
select AA.*,case when NN.BAY_PROD_NNN is NULL then '0' else NN.BAY_PROD_NNN end as BAY_PROD_NNN ,round((
(
(case when NN.BAY_PROD_NNN is NULL then '0' else NN.BAY_PROD_NNN end ) /
cast(AA.BAY_PROD_SSS as decimal(10,1) )
) * 1000000
) ,2) as DPPMSum ,1800 as DPPM_Goal from #baytotalsum AA
left join #baytotalsumN NN
on AA.weekdate = NN.weekdate
order by weekdate;
-- drop table #baytotalsumN ;
-- drop table #baytotalsumY ;
-- drop table #baytotalsum ;
select *from #bayysum;
select *from #baynsum;
select *from #baysum;
select *from #baytotalsumN;
select *from #baytotalsumY;
select * from #ModelWeeksumN ;
drop table #ModelWeeksumN;
drop table #baysum;
drop table #bayysum;
drop table #baynsum;
drop table #baytotalsumN;
drop table #baytotalsumY;
drop table #baytotalsum ;
DECLARE @start DATE,@end DATE ,@DateSpan int ,@DateSpancount int ,@allcount int ,@NGcount int ,@OKcount int ,@MAxcount int ,@MINcount int ,@Linecount int ,@averagep float,@sump float
set @DateSpan = -29
set @DateSpancount = (-@DateSpan) + 1
SET @start=dateadd(dd,@DateSpan, getdate())
SET @end=getdate()
select
replace(cast( DATEADD(DAY,number,@start) as varchar),'-','') ymd into #monthdays
from master..spt_values
where type='p' AND
number<=DATEDIFF(day,@start,@end);
--;with NGlist as
--(
select a.ymd,b.PRODC_MAGT_NO,b.operate_pass into #NGlist from #monthdays a inner join TBM_PM_PROD_PRGS b on a.ymd=b.acrs_ymd where operate_pass='N' and QC_DECI_PASS_YN = 'Y' and PACK_QC_DECI_PASS_YN = 'Y' ;
--)
--, OKlist as
--(
select a.ymd,b.PRODC_MAGT_NO,b.operate_pass into #OKlist from #monthdays a inner join TBM_PM_PROD_PRGS b on a.ymd=b.acrs_ymd where operate_pass='Y' and QC_DECI_PASS_YN = 'Y' and PACK_QC_DECI_PASS_YN = 'Y' ;
--select * from #NGlist
--1027
--)
--select a.ymd,b.PRODC_MAGT_NO,b.operate_pass from #monthdays a left join TBM_PM_PROD_PRGS b on a.ymd=b.acrs_ymd ;
--update TBM_PM_PROD_PRGS set PACK_QC_DECI_PASS_YN = 'Y',QC_DECI_PASS_YN = 'Y'
select ymd,sum(1) as Ngnumber into #NGlist2 from #NGlist group by ymd ;
select ymd,sum(1) as OKnumber into #OKlist2 from #OKlist group by ymd ;
select ymd,sum(1) as Allnumber into #monthdays2 from #monthdays group by ymd ;
select
aa.ymd ,
(case when ab.Ngnumber is null then 0 else ab.Ngnumber end) as Ngnumber,
(case when ac.OKnumber is null then 0 else ac.OKnumber end) as OKnumber,
(case when ad.Allnumber is null then 0 else ad.Allnumber end) as Allnumber
into #resultdata from #monthdays aa left join #NGlist2 ab on aa.ymd =ab.ymd
left join #OKlist2 ac on aa.ymd =ac.ymd
left join #monthdays2 ad on aa.ymd =ad.ymd ;
select @MAxcount = max(Ngnumber +OKnumber ) from #resultdata where (Ngnumber +OKnumber) <> 0 ;
select @MINcount = min(Ngnumber +OKnumber ) from #resultdata where (Ngnumber +OKnumber) <> 0 ;
select ymd,Ngnumber,OKnumber,(Ngnumber +OKnumber ) as nowdata ,
round
(((cast((case when Ngnumber is null then 0 else Ngnumber end) as decimal(10,5)))/
(cast((case when (Ngnumber +OKnumber ) = 0 then 1 else (Ngnumber +OKnumber ) end )as decimal(10,5)))) --* 100
, 2)as ppp ,
round
(((cast((case when Ngnumber is null then 0 else Ngnumber end) as decimal(10,5)))/
(cast((case when (Ngnumber +OKnumber ) = 0 then 1 else (Ngnumber +OKnumber ) end )as decimal(10,5)))) * 100
, 2)as ppp100 into #pchartdata
from #resultdata;
select @NGcount = count(1) from #NGlist;
select @OKcount = count(1) from #OKlist;
select @Linecount = count(1) from #pchartdata where nowdata <> 0 ;
select @averagep = round((cast( @NGcount as decimal(10,5))/cast( (@OKcount+ @NGcount)as decimal(10,5))) , 10) from #pchartdata ;
select *,@averagep as aver,@averagep * 100 as aver100,@DateSpancount childgroupcount,(@NGcount + @OKcount) as allcount ,@NGcount as NGcount,@OKcount as OKcount,
@MAxcount as MAXcount ,@MINcount as MINcount,@Linecount as Linecount ,((cast( @MINcount as decimal(10,5))/ cast( @MAxcount as decimal(10,5))) ) as MinMaxPersent ,
case
--select cast( 38 as decimal(10,5))/1036
/*
=IF(當前組個數=",",
IF(最小組個數/最大組個數>=0.75,
組數+3*SQRT(ABS(組數*(1-組數)/平均個數)),
組數+3*SQRT(ABS(組數*(1-組數)/當前組個數))
)
)
*/
when ((cast( @MINcount as decimal(10,5))/ cast( @MAxcount as decimal(10,5))) >= 0.75)
then
(@averagep + 3*SQRT(ABS(@averagep*(1-(@averagep))/((@NGcount +@OKcount)/ @Linecount))))
else
(@averagep + 3*SQRT(ABS(@averagep*(1-(@averagep))/( nowdata))))
end as UCL_P ,
case
when ((cast( @MINcount as decimal(10,5))/ cast( @MAxcount as decimal(10,5))) >= 0.75)
then
case when ((@averagep - 3*SQRT(ABS(@averagep*(1-(@averagep))/((@NGcount +@OKcount)/ @Linecount)))) < 0)
then
0
else
(@averagep - 3*SQRT(ABS(@averagep*(1-(@averagep))/((@NGcount +@OKcount)/ @Linecount))))
end
else
case when (@averagep - 3*SQRT(ABS(@averagep*(1-(@averagep))/(nowdata))) < 0)
then
0
else
(@averagep - 3*SQRT(ABS(@Linecount*(1-(@averagep/100))/(nowdata))))
end
end as LCL_P
/*
=IF(當前組個數=",",
IF(最小組個數/最大組個數>=0.75,
IF((組數-3*SQRT(ABS(組數*(1-組數)/平均個數)))<0,
0,
(組數-3*SQRT(ABS(組數*(1-組數)/平均個數)))),
IF((K31-3*SQRT(ABS(組數*(1-組數)/當前組個數)))<0,
0,
(組數-3*SQRT(ABS(組數*(1-組數)/當前組個數))))
)
)
*/
into #result from #pchartdata where nowdata <> 0 order by ymd ;
select * from #result;
select ROW_NUMBER() Over(ORDER BY ymd) as rowId ,convert(varchar(100), convert(date,ymd),23) as DateYmd --,*
, round(ppp100,3) as ppp100
, round(aver100,3) as aver100
, round(UCL_P*100,3) as UCL_P100
, round(LCL_P*100,3) as LCL_P100
,CONVERT(varchar(100),@start, 120) as startdate
,CONVERT(varchar(100),@end, 120) as enddate
from #result;
drop table #result;
drop table #monthdays;
drop table #resultdata;
drop table #NGlist;
drop table #OKlist;
drop table #monthdays2;
drop table #NGlist2;
drop table #OKlist2;
drop table #pchartdata;
---------------------------------------------------------------------------------------------------------------------------------------------------------
;with
maxseq
as
(
SELECT SerialNumber, RunNumber FROM [InfoRun] B where datetimestarted > dateadd(dd,-1,getdate()) and RunNumber = 1 and ( B.SerialNumber like '%0620' or B.SerialNumber like '%0622' )
),
datalist
as
(
select B.SerialNumber , B.RunNumber ,[ProjectVersion] ,
( 'Wk' +cast(datepart(week,cast(substring(replace( replace(replace(CONVERT(varchar(100),DateTimeStarted, 120),' ',''),'-',''),':',''),1,8) as varchar))as varchar) ) as weekly ,
[DateTimeStarted] ,[DateTimeCompleted] ,--[ElapsedTime] ,
[StationNumber] ,[StationName] ,[Status] ,[FailedTests] ,--[GroupRunNumber] ,
[FailedTestsDetails]
FROM [InfoRun] B inner join maxseq on B.SerialNumber = maxseq.SerialNumber and B.RunNumber = maxseq.RunNumber where B.datetimestarted > dateadd(dd,-1,getdate()) and ( B.SerialNumber like '%0620' or B.SerialNumber like '%0622' )
)
select * into #tempdatalist from datalist ;
with
nglist
as
(
select B.SerialNumber , B.RunNumber ,[ProjectVersion] ,
( 'Wk' +cast(datepart(week,cast(substring(replace( replace(replace(CONVERT(varchar(100),DateTimeStarted, 120),' ',''),'-',''),':',''),1,8) as varchar))as varchar) ) as week ,
[DateTimeStarted] ,[DateTimeCompleted] ,--[ElapsedTime] ,
[StationNumber] ,[StationName] ,[Status] ,[FailedTests] ,
substring([FailedTests],1,15) as failtype,
--[GroupRunNumber] ,
[FailedTestsDetails]
FROM [InfoRun] B where 1 =1 and ( B.SerialNumber like '%0620' or B.SerialNumber like '%0622' )
and B.RunNumber = 1
and B.Status='FAIL'
and B.datetimestarted > dateadd(dd,-1,getdate())
)
select top(5) failtype,count(1) as numberlist into #temptop5 from nglist group by failtype order by numberlist desc;
--select weekly,count(1) as summerynumber from datalist where 1 = 1 group by weekly order by weekly
select weekly,count(1) as Passnumber into #tempPassdatalist from #tempdatalist where Status='PASS' group by weekly order by weekly;
select weekly,count(1) as summerynumber into #tempAlldatalist from #tempdatalist where 1 = 1 group by weekly order by weekly;
select
(case when A.weekly is null then B.weekly else A.weekly end) as weekA,A.*,
(case when A.summerynumber is null then 0 else A.summerynumber end) as summery,
(case when B.weekly is null then A.weekly else B.weekly end) as weekB,B.*,
(case when B.Passnumber is null then 0 else B.Passnumber end) as pass,
round
(((case when B.Passnumber is null then 0 else B.Passnumber end)/(case when A.summerynumber is null then 0 else A.summerynumber end)) * 100, 2)as ppp,
round
(((cast((case when B.Passnumber is null then 0 else B.Passnumber end)
as decimal(10,5)))/(cast((case when A.summerynumber is null then 0 else A.summerynumber end )as decimal(10,5)))) * 100, 2) as FTT, 0 as FTT0 , 75 as FTTGoal
--B.weekly as weekB,B.*
from #tempAlldatalist A
full outer join #tempPassdatalist B
on A.weekly = B.weekly;
select * from #temptop5;
drop table #tempdatalist;
drop table #tempAlldatalist;
drop table #tempPassdatalist;
drop table #temptop5;
---------------------------------------------------------------------------------------------------------------------------------------------------------