在案子當中,
客戶的某個需求就是動態前六個月的資料,
但前六個月不包含當月,
也就是要減一個月在往前推六個月,
接著在撰寫SQL語法時,
我一開始的寫法如下:
substring(CONVERT(char(8),DATEADD(month, 0, CONVERT(datetime, CAST(V_Sales_Invoice_Body.IssuedDate AS varchar(8)))) ,112),1,6)
>= substring(CONVERT(char(8),DATEADD(month, -6, GETDATE()),112 ),1,6)
AND
substring(CONVERT(char(8),DATEADD(month, 0, CONVERT(datetime, CAST(V_Sales_Invoice_Body.IssuedDate AS varchar(8)))) ,112),1,6)
<= substring(CONVERT(char(8),DATEADD(month, -1, GETDATE()),112 ),1,6)
因該日期欄位原本為numeric,
所以必須先轉成文字,再轉成日期,
看似做了很多轉換並用AND串成兩個條件,
但執行時間卻比以下語法還要快。
CONVERT(datetime, CAST(ProcessMonth * 100 + 1 AS varchar(8)),112)
BETWEEN DATEADD(month, - 7, GETDATE()) AND DATEADD(month, - 1,GETDATE())
此語法是利用另一個欄位ProcessMonth (ex. 201308)做運算再做轉換,
並用Between 串連。
2013年12月31日 星期二
2013年12月18日 星期三
SharePoint 2013 安裝後序號取得
在安裝完SP2013 後,
假使忘記當初的產品序號,
該如何得知呢?
請執行以下程式
假使忘記當初的產品序號,
該如何得知呢?
請執行以下程式
using System; using System.Collections; using Microsoft.Win32; namespace GetInstalledSharePointSku { class Program { internal static Hashtable _products; public static Hashtable SharePointProducts { get { if (_products == null) { _products = new Hashtable(); _products.Add("35466B1A-B17B-4DFB-A703-F74E2A1F5F5E", "Project Server 2013"); _products.Add("BC7BAF08-4D97-462C-8411-341052402E71", " Project Server 2013 Preview"); _products.Add("C5D855EE-F32B-4A1C-97A8-F0A28CE02F9C", "SharePoint Server 2013"); _products.Add("CBF97833-C73A-4BAF-9ED3-D47B3CFF51BE", "SharePoint Server 2013 Preview"); _products.Add("B7D84C2B-0754-49E4-B7BE-7EE321DCE0A9", "SharePoint Server 2013 Enterprise"); _products.Add("298A586A-E3C1-42F0-AFE0-4BCFDC2E7CD0", "SharePoint Server 2013 Enterprise Preview"); _products.Add("D6B57A0D-AE69-4A3E-B031-1F993EE52EDC ", "Microsoft Office Web Apps Server 2013"); _products.Add("9FF54EBC-8C12-47D7-854F-3865D4BE8118", "SharePoint Foundation 2013"); } return _products; } } private const String SharePointProductsRegistryPath = @"SOFTWARE\Microsoft\Shared Tools\Web Server Extensions\15.0\WSS\InstalledProducts\"; static void Main(string[] args) { try { //Open the registry key in read-only mode. using (RegistryKey key = Registry.LocalMachine.OpenSubKey(SharePointProductsRegistryPath, false)) { //Get all of the installed product code/SKUId pairs. foreach (String value in key.GetValueNames()) { try { //Get the SKUId and see whether it is a known product. String SKUId = key.GetValue(value) as String; if (SharePointProducts[SKUId] != null) { Console.WriteLine("Product Installed: {0}", SharePointProducts[SKUId]); } else { Console.WriteLine("Unknown Product: {0}", SKUId); } } catch (Exception e) { Console.WriteLine("Could not read key exception was {0}", e.Message); } } } } catch (Exception e) { Console.WriteLine("Could not open key exception was {0}", e.Message); } Console.Read(); } } }
2013年11月19日 星期二
[Excel] 圖片動態範圍選擇
1. 試著將圖表中資料的儲存格位址以動態方式呈現!藉由命名名稱來操作。如果你點選圖表中的曲線,可以看到曲線中的公式如下:
=SERIES(工作表1!$B$1,工作表1!$A$2:$A$20,工作表1!$B$2:$B$20,1)
由於其位址採用絶對位址表示,所以當在資料最後增加一筆資料時,並不在圖表的位址範圍內,所以圖表無法跟著變動。所以,採用以下的方式來改良:
新增一個名稱DATA1,定義為:
DATA1:=OFFSET(工作表1!$A$2,0,0,COUNTA(工作表1!$A:$A)-1,1)
此公式的作用是要將原本的絶對位址,改以OFFSET函數求得,而在OFFSET函數中以工作表1!$A$2為頭,而以COUNTA(工作表1!$A:$A)-1為尾,形成一個動態的位址範圍。
新增一個名稱DATA2,定義為:
DATA2:=OFFSET(工作表1!$B$2,0,0,COUNTA(工作表1!$B:$B)-1,1)
特別注意範圍要選取這個圖表所在的工作表名稱,例如:工作表1。
然後,點選圖表中的曲線,在資料編輯列,將原公式更改如下:
=SERIES(工作表1!$B$1,工作表1!DATA1,工作表1!DATA2,1)
即將原公式中的工作表1! $A$2:$A$20 改以DATA1取代,特別注意要寫成:工作表1!DATA1。
即將原公式中的 工作表1!$B$2:$B$20 改以DATA2取代,特別注意要寫成:工作表1!DATA1。
如此,只要在A欄和B欄中新增一筆資料時,圖表就會跟著改變。
說明:
OFFSET 函數:傳回根據所指定的儲存格位址、列距及欄距而算出的參照位址。傳回的參照位址可以是單一個儲存格或一個儲存格範圍。可以指定要傳回來的列數和欄數。
語法:OFFSET(reference, rows, cols, [height], [width])
Reference:必要參數。用以計算位移的起始參照位址。
Rows:必要參數。左上角儲存格要往上或往下參照的列數。Rows 可以是正數 (表示在起始參照位址下方) 或負數 (表示在起始參照位址上方)。
Cols:必要參數。這是結果的左上角儲存格要往左或往右參照的欄數。Cols 可以是正數 (表示在起始參照位址右方) 或負數 (表示在起始參照位址左方)。
Cols 可以是正數 (表示在起始參照位址右方) 或負數 (表示在起始參照位址左方)。
Height:選用參數。這是所傳回參照位址的高度 (以列數為單位)。Height 必須是正數。
Width:選用參數。這是所傳回參照位址的寬度 (以欄數為單位)。Width 必須是正數。
Reference: http://isvincent.blogspot.tw/2010/07/excel_4587.html
=SERIES(工作表1!$B$1,工作表1!$A$2:$A$20,工作表1!$B$2:$B$20,1)
由於其位址採用絶對位址表示,所以當在資料最後增加一筆資料時,並不在圖表的位址範圍內,所以圖表無法跟著變動。所以,採用以下的方式來改良:
新增一個名稱DATA1,定義為:
DATA1:=OFFSET(工作表1!$A$2,0,0,COUNTA(工作表1!$A:$A)-1,1)
此公式的作用是要將原本的絶對位址,改以OFFSET函數求得,而在OFFSET函數中以工作表1!$A$2為頭,而以COUNTA(工作表1!$A:$A)-1為尾,形成一個動態的位址範圍。
新增一個名稱DATA2,定義為:
DATA2:=OFFSET(工作表1!$B$2,0,0,COUNTA(工作表1!$B:$B)-1,1)
特別注意範圍要選取這個圖表所在的工作表名稱,例如:工作表1。
然後,點選圖表中的曲線,在資料編輯列,將原公式更改如下:
=SERIES(工作表1!$B$1,工作表1!DATA1,工作表1!DATA2,1)
即將原公式中的工作表1! $A$2:$A$20 改以DATA1取代,特別注意要寫成:工作表1!DATA1。
即將原公式中的 工作表1!$B$2:$B$20 改以DATA2取代,特別注意要寫成:工作表1!DATA1。
如此,只要在A欄和B欄中新增一筆資料時,圖表就會跟著改變。
說明:
OFFSET 函數:傳回根據所指定的儲存格位址、列距及欄距而算出的參照位址。傳回的參照位址可以是單一個儲存格或一個儲存格範圍。可以指定要傳回來的列數和欄數。
語法:OFFSET(reference, rows, cols, [height], [width])
Reference:必要參數。用以計算位移的起始參照位址。
Rows:必要參數。左上角儲存格要往上或往下參照的列數。Rows 可以是正數 (表示在起始參照位址下方) 或負數 (表示在起始參照位址上方)。
Cols:必要參數。這是結果的左上角儲存格要往左或往右參照的欄數。Cols 可以是正數 (表示在起始參照位址右方) 或負數 (表示在起始參照位址左方)。
Cols 可以是正數 (表示在起始參照位址右方) 或負數 (表示在起始參照位址左方)。
Height:選用參數。這是所傳回參照位址的高度 (以列數為單位)。Height 必須是正數。
Width:選用參數。這是所傳回參照位址的寬度 (以欄數為單位)。Width 必須是正數。
Reference: http://isvincent.blogspot.tw/2010/07/excel_4587.html
訂閱:
文章 (Atom)