2006年10月24日
我個人憑借自己的眼光和技術,創作了一個有潛在商業價值的網站,中國IDC資源導航,當然名稱雖然是導 航,但我的想法是作成國內IDC行業的資源整合,主要內容包括IDC導航站、商務站、資訊站、論壇四個版 塊。
導航站:是收集互聯網資源,為客戶導航; 商務站:是整合國內現有運營商,讓運營商在此建立自己的信息平臺。目標是形成國際IDC商務站; 資訊站:是國內外有關IDC的新聞資訊、技術信息;
我現在是一個人在作,目前版本是1。0只有導航站。2。0正在全面開發之中,增加商務站。生成Html頁,利 于搜索引擎的收錄。目前使用技術是asp+sql2000,但準備在4。0時有可能全面改版,使用技術Jsp+MySql。
目前的問題,個人精力有限,開發速度慢,思維有限,希望業界精英提供好的建議,歡迎懂技術的精英加 入。現在純屬開發階段,但可以承諾,如果項目有發展,可以分得相應股份。
QQ:316156915 Msn:yan65919@hotmail.com E-mail:yan65919@gmail.com
目前可以看到的痕跡:www.idcdh.com
2006年7月12日
今天“百年不遇”的停電了,看了一天書。晚上搞了一下全文索引,決定把心得貼出來,我盡量寫的詳細,大家共同學習,歡迎指正! 1、啟動 Microsoft Search 服務 開疾說?->SQL程序組-->服務管理器-->下拉筐-->Microsoft Search 服務-->啟動它 2、 ..\Microsoft SQL Server\MSSQL\FTDATA\SQLServer\Config\目錄里建一個非空noise.chs文件 非空noise.chs文件,也有人說是空的noise.chs文件,但我每次都往里寫幾個沒用的字母。 3、建立環境 打開查詢分析器-->執行下列腳本: -------------------------------------------- create database test ---創建test數據庫 use test ---選擇test數據庫 create table dali (ID int not null primary key,MyImage image,FileType varchar(255),FileNmae varchar(255)) ---創建dali表 --dali表中 Id,MyImage,FileType 三列是必須的,因為要對image列索引的話,必須要有一個主鍵列,一個image列,一個存放文件類型的列 --我們知道在windows系統中文件類型是靠擴展名來區分的所以FileType列也就是用來放 文件的擴展名 -------------------------------------------- sp_fulltext_database 'enable' --為全文索引啟用數據庫 sp_fulltext_catalog 'My_FullDir', 'create' ---創建一個叫My_FullDif的全文目錄 declare @Key sysname ; select @Key=c.name from syscolumns a,sysconstraints b,sysobjects c where a.id=object_id('a') and a.name='a' and a.id=b.id and b.constid=c.id and c.name like 'PK%' exec sp_fulltext_table 'dali','create','My_FullDir',@Key ----這兩句是為全文索引,對表進行標記 sp_fulltext_column 'dali','MyImage','add',0x0804,'FileType' ---這句是指定MyImage列為全文索引列,FileType是類型列 ------------------------------------------------ 4、在c盤下放一個擴展名為doc的word文件,一個擴展名為xls的excel文件,一個擴展名為htm的網頁文件,個擴展名為bmp的圖片共4個,大家可根據實際情況放入! 5、插入數據 建立下面這個存儲過程 -------------------------------------------------- CREATE PROCEDURE sp_textcopy @srvname varchar (30), @login varchar (30), @password varchar (30), @dbname varchar (30), @tbname varchar (30), @colname varchar (30), @filename varchar (30), @whereclause varchar (40), @direction char(1) AS /* 這是使用textcopy工具將文件插入到數據庫中,如果有前臺工具可以用前臺開發工具將文件插入,這里為了演示 */ DECLARE @exec_str varchar (255) SELECT @exec_str='textcopy /S ' @srvname ' /U ' @login ' /P ' @password ' /D ' @dbname ' /T' @tbname ' /C ' @colname ' /W"' @whereclause '" /F"' @filename '" /' @direction EXEC master..xp_cmdshell @exec_str ---------------------------------------------------- insert dali values(1,0x,'doc','大力的doc') ---其中第二列是 0x 它是一個16進制數對應image列,是必須的,不要寫null,第三列是文件類型,既擴展名 sp_textcopy '你的服務器名','sa','你的密碼','test','dali','MyImage','c:\大力的doc.doc','where ID=1','I' -------依次參數是:實例名,用戶名,密碼,數據庫名,表名,image列名,路徑及文件名,條件(你必須保證它只選擇一行),I --------------------------------------------------------------------------------------------------------------------- insert dali values(2,0x,'bmp','圖片') sp_textcopy '你的服務器名','sa','你的密碼','test','dali','MyImage','c:\圖片.bmp','where ID=2','I' --注意條件是 ID=2 insert dali values(3,0x,'xls','Excel文件') sp_textcopy '你的服務器名','sa','你的密碼','test','dali','MyImage','c:\Excel文件.xls','where ID=3','I' --注意條件是 ID=3 insert dali values(4,0x,'htm','網頁') sp_textcopy '你的服務器名','sa','你的密碼','test','dali','MyImage','c:\網頁.htm','where ID=4','I' --注意條件是 ID=4 ----------上面的語句,要保證類型一樣,路徑正確,條件唯一正確應該就可以了 6、填充全文索引 sp_fulltext_table 'dali','start_full' ---第一個參數是表名,第二個參數是啟動表的全文索引的完全填充 7、可以開始你的實驗了 select * from dali where contains(MyImage,'J老師') select * from dali where contains(MyImage,'海老師') ------END---------- --調試環境:SQLServer2K、Windows2Kas
在SQL 企業管理器上操作步驟:
一:進入企業管理器,打開支持服務,選取全文檢索,點擊啟動。
二:對相關的數據表建立全文索引。
三:全文索引建立向導
然后確定提交后,建立向導就基本完成。
到這里在SQL上建立全文索引已經完成!
四:補充:由于全文填充是按照調度里設定周期進行的,所以不會馬上生效,如果需要的話可以點擊全目錄,運行填充。通常數據量大的話不建議在訪問量大的時候進行。
解決在全文搜索中搜索中文字符出錯補丁:點擊下載
解決中文字符出錯問題:
方法一: 把下載解壓的文件復制到...\Microsoft SQL Server\MSSQL\FTDATA\SQLServer\Config\ 目錄下(該路徑為全文目錄路徑,可以全文目錄屬性中查看)
方法二: 編輯...\Microsoft SQL Server\MSSQL\FTDATA\SQLServer\Config\目錄下的 noise.chs文件,清空文檔,輸入‘@’(其他的偏僻符號也可以)
最后,重新進行全文完全填充!
引言
微軟的SQL Server數據庫是一個在中低端企業應用中占有廣泛市場的關系型數據庫系統,它以簡單、方便、易用等特性深得眾多軟件開發人員和數據庫管理人員的鐘愛。但SQL Server 7.0以前的數據庫系統由于沒有全文檢索功能,致使無法提供像文本內容查找此類的服務,成為一個小小的遺憾。從SQL Server 7.0起,到如今的SQL Server 2000終于具備了全文檢索功能,使用戶可以高效地檢索存儲在數據庫char、varchar、text、ntext、nchar、nvarchar等數據類型列中的文本數據。
建立全文索引
在進行全文檢索之前,必須先建立和填充數據庫全文索引。為了支持全文索引操作,SQL Server 7.0新增了一些存儲過程和Transact-SQL語句。使用這些存儲過程創建全文索引的具體步驟如下(括號內為調用的存儲過程名稱):
1. 啟動數據庫的全文處理功能(sp_fulltext_
database);;
2. 建立全文檢索目錄(sp_fulltext_catalog);
3.在全文檢索目錄中注冊需要全文索引的表(sp_fulltext_table);
4. 指出表中需要全文檢索的列名(sp_fulltext_
column);;
5. 為表創建全文索引(sp_fulltext_table);;
6. 填充全文檢索目錄(sp_fulltext_catalog)。
下面舉例說明如何創建全文索引,在本例中,對Test數據庫Book表中Title列和Notes列建立全文索引。
use test //打開數據庫
//打開全文索引支持,啟動SQL Server的全文搜索服務
execute sp_fulltext_database ‘enable’
//建立全文檢索目錄ft_test
execute sp_fulltext_catalog ‘ft_test’, ‘create’
為Title列建立全文索引數據元,pk_title為Book表中由主鍵所建立的唯一索引,這個參數是必需的。
execute sp_fulltext_table ‘book’,‘create’, ‘ft_test’,‘pk_title’
//設置全文索引列名
execute sp_fulltext_column ‘book’, ‘title’, ‘add’
execute sp_fulltext_column ‘book’,‘notes’, ‘add’
//建立全文索引
execute sp_fulltext_table ‘book’, ‘activate’
//填充全文索引目錄
execute sp_fulltext_catalog ‘ft_test’, ‘start_full’
至此,全文索引建立完畢。
進行全文檢索
SQL Server 2000提供的全文檢索語句主要有CONTAINS和FREETEXT。CONTAINS語句的功能是在表的所有列或指定列中搜索:一個字或短語;一個字或短語的前綴;與一個字相近的另一個字;一個字的派生字;一個重復出現的字。
CONTAINS語句的語法格式為:
CONTAINS({column | *}), <contains_search
_condition>)
其中,column是搜索列,使用“*”時說明對表中所有全文索引列進行搜索。Contains_search_
condition 說明CONTAINS語句的搜索內容,其語法格式為:
{<simple_term>|<prefix_term>|<proximity_term>|<generation_term>|<weighted_term>}[{{AND|AND NOT|OR}<contains_search_condition>}] [...n]
下面就simple_term和prefix_term參數做簡要說明:
simple_term是CONTAINS語句所搜索的單字或短語,當搜索的是一個短語時,必須使用雙引號作為定界符。其格式為:
{‘word’|“ phrase”}
prefix_term說明CONTAINS語句所搜索的字或短語前綴,其格式為:
{“word*” | “phrase*”}
例如,下面語句檢索Book表的Title列和Notes列中包含“database”或“computer”字符串的圖書名稱及其注釋信息:
select title, notes
from book
where contains(tilte, ‘database’) or contains(notes,‘database’)
or contains(title,‘computer’) or contains(notes,‘computer’)
FREETEXT語句的功能是在一個表的所有列或指定列中搜索一個自由文本格式的字符串,并返回與該字符串匹配的數據行。所以,FREETEXT語句所執行的功能又稱做自由式全文查詢。
FREETEXT語句的語法格式為:FREETEXT({column | * },‘freetext_string’)
其中,column是被搜索列,使用“*”時說明對表中的所有全文索引列進行搜索。Freetext_string參數指出所搜索的自由文本格式字符串。
例如,下面語句使用FREETEXT語句搜索Book表中包含“Successful Life”字符串的數據行:
select title, notes
from book
where freetext(*,‘Successful Life’)
使用SQL?SERVER?2000的全文檢索功能? ? 步驟: 1、??打開NorthWind數據庫,右鍵Products表,選擇“全文索引表”,“在表上定義全文索引”,為其創建全文目錄。在“全文索引向導”中,選擇你需要全文查詢條件的列(可以是文本或圖像),我們選擇Productname和QuantityPerUnit列。然后下一步,輸入一個新的目錄proCatalog,點擊下一步。在填充調度一項里,我們暫時不建立填充調度。接著“下一步”,全成全文索引向導。完成后,我們可以看到在“全文目錄”里,多了一個全文目錄proCatalog。右鍵proCatalog屬性,可以看到其狀態、表、調度情況。 2、??右鍵全文目錄proCatalog,?“啟動完全填充”,系統會出現“全文目錄填充成功啟動”。 3、??這時,我們可以使用Transact-SQL進行全文檢索了,我們使用CONTAINS、FREETEXT等謂詞。如: 檢索ProductName中,即包含b又包含c的所有列 SELECT?* FROM?Products WHERE?CONTAINS(ProductName,?'"c*"?and?"b*"?') ? 檢索ProductName中,即包含chai?chang?tofu之一的所有列 SELECT?* FROM?Products WHERE?FREETEXT(ProductName,?'chai?chang?tofu?') ? 我們還可以使用CONTAINSTABLE、FREETEXTTABLE等 ? 4、??我們可以用.NET創建WEB或Form客戶端,提供一個良好的全文檢索界面,使自己的應用程序得到擴展 ? ? ? 參考: 全文查詢有關的系統存儲過程 (1)啟動數據庫的全文處理功能(sp_fulltext_datebase);? (2)建立全文目錄(sp_fulltext_catalog);? (3)在全文目錄中注冊需要全文索引的表(sp_fulltext_table);? (4)指出表中需要全文檢索的列名(sp_fulltext_column)? (5)為表創建全文索引(sp_fulltext_table);? (6)填充全文索引(sp_fulltext_catalog)。 ? ? ? 全文查詢支持 Microsoft®?SQL?Server™?2000?在接收帶全文構造的?Transact-SQL?語句時,使用全文提供程序從?Microsoft?搜索服務檢索所需信息。全文構造是?CONTAINS?或?FREETEXT?謂詞,或者是?CONTAINSTABLE?或?FREETEXTTABLE?行集函數。如果不知道包含搜索條件的列,全文構造可以在全文索引中引用多列。該進程的流程如下圖所示。 ? 這一進程涉及的步驟包括:? 應用程序給?SQL?Server?實例發送帶全文構造的?Transact-SQL?語句。 SQL?Server?關系引擎通過查詢系統表驗證全文構造,確定全文索引是否覆蓋列引用。關系引擎將每個?SQL?語句簡化為一系列行集操作,并使用?OLE?DB?將這些操作傳遞給基礎組件,通常是存儲引擎。關系引擎通過全文提供程序而不是存儲引擎,將任何全文構造轉換成對行集的請求。請求的行集是滿足搜索條件和等級的鍵集,而這個等級表示每個鍵的數據滿足搜索條件的程度。向全文提供程序發送的行集請求命令包括全文檢索條件。 全文提供程序驗證請求并將搜索條件更改為由Microsoft?搜索服務的查詢支持組件使用的形式。將請求發送到搜索服務。 查詢支持組件使用搜索引擎組件從全文索引析取所請求的數據。然后以行集的形式將這些數據傳遞回全文提供程序。 全文提供程序將這個行集返回給關系引擎。 關系引擎將它從存儲引擎和全文提供程序收到的所有行集進行組合,以生成發送回客戶端的最終結果集。? ? 全文目錄和索引 Microsoft®?SQL?Server™?2000?全文索引為在字符串數據中進行復雜的詞搜索提供有效支持。全文索引存儲關于重要詞和這些詞在特定列中的位置的信息。全文查詢利用這些信息,可快速搜索包含具體某個詞或一組詞的行。 全文索引包含在全文目錄中。每個數據庫可以包含一個或多個全文目錄。一個目錄不能屬于多個數據庫,而每個目錄可以包含一個或多個表的全文索引。一個表只能有一個全文索引,因此每個有全文索引的表只屬于一個全文目錄。 全文目錄和索引不存儲在它們所屬的數據庫中。目錄和索引由?Microsoft?搜索服務分開管理。 全文索引必須在基表上定義,而不能在視圖、系統表或臨時表上定義。?全文索引的定義包括:? 能唯一標識表中各行的列(主鍵或候選鍵),而且不允許?NULL?值。 索引所覆蓋的一個或多個字符串列。? 全文索引由鍵值填充。每個鍵的項提供與該鍵相關聯的重要詞(干擾詞或終止詞除外)、它們所在的列和它們在列中的位置等有關信息。 格式化文本字符串(如?Microsoft®?Word™?文檔文件或?HTML?文件)不能存儲在字符串或?Unicode?列中,因為這些文件中的許多字節包含不構成有效字符的數據結構。數據庫應用程序可能仍需要訪問這些數據并對其應用全文檢索。因為?image?列并不要求每一字節都構成一個有效字符,所以許多站點將這類數據存儲在?image?列中。SQL?Server?2000?引入了對存儲在?image?列中的這些類型的數據執行全文檢索的能力。SQL?Server?2000?提供篩選,可從?Microsoft?Office™?文件(.doc、.xls?和?.ppt?文件)、文本文件(.txt?文件)及?HTML?文件(.htm?文件)中析取文本化數據。設計表時除包括保存數據的?image?列外,還需包括綁定列來保存存儲在?image?列中的數據格式的文件擴展名。可以創建引用?image?列和綁定列的全文索引,以便在存儲于?image?列中的文本化信息上啟用全文檢索。SQL?Server?2000?全文檢索引擎使用綁定列中的文件擴展名信息,選擇從列中析取文本化數據的合適的篩選。 全文索引是用于執行兩個?Transact-SQL?謂詞的組件,以便根據全文檢索條件對行進行測試:? CONTAINS FREETEXT? Transact-SQL?還包含兩個返回符合全文檢索條件的行集的函數:? CONTAINSTABLE FREETEXTTABLE? SQL?Server?在內部將搜索條件發送給?Microsoft?搜索服務。Microsoft?搜索服務查找所有符合全文檢索條件的鍵并將它們返回給?SQL?Server。SQL?Server?隨后使用鍵的列表來確定表中要處理的行。 全文索引 對?Microsoft®?SQL?Server™?2000?數據的全文支持涉及兩個功能:對字符數據發出查詢的能力和創建及維護基礎索引以簡化這些查詢的能力。 全文索引在許多地方與普通的?SQL?索引不同。 普通?SQL?索引 ?全文索引 ? 存儲時受定義它們所在的數據庫的控制。 ?存儲在文件系統中,但通過數據庫管理。 ? 每個表允許有若干個普通索引。 ?每個表只允許有一個全文索引。 ? 當對作為其基礎的數據進行插入、更新或刪除時,它們自動更新。 ?將數據添加到全文索引稱為填充,全文索引可通過調度或特定請求來請求,也可以在添加新數據時自動發生。 ? 不分組。 ?在同一個數據庫內分組為一個或多個全文目錄。 ? 使用?SQL?Server?企業管理器、向導或?Transact-SQL?語句創建和除去。 ?使用?SQL?Server?企業管理器、向導或存儲過程創建、管理和除去。 ? ? 這些差異使大量管理任務變得不可缺少。全文管理是在幾個層次上實施的:? 服務器? 可以對服務器范圍的某些屬性(如?resource_usage)加以設置,以便增加或減少全文服務所使用的系統資源數量。 說明??全文引擎作為名為?Microsoft?搜索的服務在?Microsoft?Windows?NT®?Server?和?Microsoft?Windows®?2000?Server?上運行。對于?Microsoft?SQL?Server?個人版,Microsoft?搜索服務不可用。盡管這意味著?Microsoft?搜索服務既未安裝在?Microsoft?Windows?95/98?上,也未安裝在?Windows?NT?工作站或?Windows?2000?Professional?客戶端上,但這些客戶端在連接到?SQL?Server?標準版安裝或企業版實例時可以使用這項服務。 數據庫? 必須啟用數據庫才能使用全文服務。可以在已啟用的數據庫中創建和除去一個或多個全文目錄的元數據。 全文目錄? 全文目錄包含數據庫中的全文索引。每個目錄可以用于數據庫內的一個或多個表的索引需求。該目錄中的索引是使用這里介紹的管理功能來填充的。(全文目錄必須駐留在與?SQL?Server?實例相關聯的本地硬盤驅動器上。不支持可移動的驅動器、軟盤和網絡驅動器)。在每個服務器上最多可創建?256?個全文目錄。 說明??Windows?NT?故障轉移群集環境完全支持全文索引。有關更多信息,請參見在故障轉移群集中運行全文查詢。 表? 首先,必須為全文支持啟用表。然后,為與該表相關聯的全文索引創建元數據(如表名及其全文目錄)。表啟用后,可以用為全文支持而啟用的列中的數據填充它。如果表的全文定義被更改(例如,添加一個也將為全文檢索而索引的新列),則必須重新填充相關的全文目錄以使全文索引與新的全文定義同步。 列? 可以從非活動的注冊表中添加或除去支持全文查詢的列。 在所有這些級別上,可使用工具檢索元數據和狀態信息。 和常規?SQL?索引一樣,當在相關表中修改數據時,可自動更新全文索引。或者,也可以適當的間隔手工重新填充全文索引。這種重寫可能既耗時又大量占用資源,因此,在數據庫活動較少時,這通常是在后臺運行的異步進程。 應將具有相同更新特性的表(如更改少的與更改多的,或在一天的特定時段內頻繁更改的表)組合在一起,并分配給相同的全文目錄。通過以此方法設置全文目錄填充調度,使得全文索引和表保持同步,且在數據庫活動較多時不對數據庫服務器的資源使用產生負面影響。 為全文目錄中的表安排全文索引的位置是非常重要的。在為全文目錄指定表時,應該注意下列基本原則:? 始終選擇可用于全文唯一鍵的最小唯一索引。(4?個字節且基于整數的索引是最佳的。)這將顯著減少文件系統中?Microsoft?搜索服務所需要的資源。如果主鍵很大(超過?100?字節),可以考慮選擇表中其它唯一索引(或創建另一個唯一索引)作為全文唯一鍵。否則,如果全文唯一鍵的大小達到允許的上限(450?字節),全文填充將無法繼續進行。 如果進行索引的表有成千上萬行,請將該表指定給其自己的全文目錄。 應該考慮對其進行全文索引的表中發生的更改數以及表的行數。如果要更改的總行數,加上上次全文填充期間表中出現的行數達到成千上萬行,請將該表指定給其自己的全文目錄。? 請參見 sp_fulltext_table CONTAINS 一個謂詞,用于搜索包含基于字符的數據類型的列,該列與單個詞和短語,以及與另一個詞一定范圍之內的近似詞精確或模糊(不太精確的)匹配或者加權匹配。CONTAINS?可以搜索:? 詞或短語。 詞或短語的前綴。 另一個詞附近的詞。 由另一個詞的詞尾變化生成的詞(例如,詞?drive?是?drives、drove、driving?和?driven?詞尾變化的詞干)。 比另一個詞具有更高加權的詞。? 語法 CONTAINS ????(?{?column?|?*?}?,?'<?contains_search_condition?>'?????  ? ? FREETEXT 是個謂詞,用于搜索含有基于字符的數據類型的列,其中的值符合在搜索條件中所指定文本的含義,但不符合表達方式。使用?FREETEXT?時,全文查詢引擎內部將?freetext_string?拆分為若干個搜索詞,并賦予每個詞以不同的加權,然后查找匹配。 語法 FREETEXT?(?{?column?|?*?}?,?'freetext_string'?  ? CONTAINSTABLE?和?FREETEXTTABLE?函數用來指定返回每行的相對排名的全文查詢。這兩個函數與全文謂詞?CONTAINS?和?FREETEXT?很相似,但是用法不同。 (此文部分資料來自MSDN)
2006年6月6日
JavaScript實際應用:innerHTMl和確認提示的使用
作者:Hmily 日期:2006-05-26
今天開發中涉及到對一個層的信息控制,就是控制一個層中顯示什么信息,查找資料才知道使用innerHTML屬性來控制層的值,這個innerHTML跟表單里面的value屬性有點類似,能夠控制層的顯示值。 比如說我一個div層里本來沒有值,我處罰一個事件后要顯示值,那么就能夠使用innerHTML屬性了,其實innerHTML屬性除了能控制層以外,還能控制窗口內容的所有元素,但是我沒有測試過。 (1)對div標簽的控制div標簽跟span標簽是不一樣的,div是一個層的塊,span是一行,我們下面看演示就知道區別了。先來看一段控制div的代碼。  程序代碼 <script language="javascript"> function chageDiv(number) { if (number == 1) { document.getElementById("div1").innerHTML = "值為1"; } if (number == 2) { document.getElementById("div1").innerHTML = "值為2"; } } </script>
DIV塊測試:<div id="div1">默認值</div>
<a href="#" onClick="chageDiv(1)">改變值為1</a> <a href="#" onClick="chageDiv(2)">改變值為2</a>
演示: 運行的時候,點擊“改變值為1”那么“默認值”這個內容將會被改變為“值為1”,但是注意其中的界面,就是會發現“DIV測試:”和“默認值”是兩行顯示的,因為DIV是按塊來顯示的。 (2)對span的控制與div類似,但是它是按照行來顯示的,看下面的代碼:  程序代碼 <script language="javascript"> function chageSpan(number) { if (number == 1) { document.getElementById("span1").innerHTML = "值為1"; } if (number == 2) { document.getElementById("span1").innerHTML = "值為2"; } } </script> Span行測試: <span id="span1">默認值</span><br> <a href="#" onClick="chageSpan(1)">改變值為1</a> <a href="#" onClick="chageSpan(2)">改變值為2</a> 當點擊“改變值為1”的時候,“默認值”將變為“值為1”,但是“Span行測試”和“默認值”是在同一行顯示的,跟DIV不一樣。 另外一個值得注意的就是,不管是div還是span,后面的名字都是以為id來定義的,不是象表單一樣是使用name來定義的。 (3)confirm確認提示框的制作當我們要執行一個危險操作的時候,比如刪除某個內容等,那么就應該給用戶相應的提示來用戶不容易犯錯誤。一般提示都是使用confirm()函數來處理的,給它提交一個參數作為顯示的信息提示,那么訪問的時候將彈出對話框,如果點擊了“確定”那么將改函數返回true,點擊了“取消”將放回false,我們針對這個特點來使用兩種方法來控制用戶是否執行某個操作。 看代碼:  程序代碼 <script language="javascript"> function accessNeteasy() { if(confirm('你真的要訪問網易新聞 ?')) { location=' http://calendar.eyou.eyou'; } } function accessSina() { if (confirm('你確定要訪問新浪新聞 ?')) { return true; } else { return false; } } </script> 訪問方式一: <a href="#" onClick="accessNeteasy()">網易新聞</a><br> 訪問方式二: <a href=" http://news.sina.com.cn" onClick="return accessSina()">新浪新聞</a> 我們這里建立了兩個函數,一個accessNeteay,一個accessSina,就是訪問網易和新浪,我們使用不同的方法,第一種就是當點了鏈接以后,判斷如果是true的話,那么就location到指定鏈接,這種方法比較不具有通用型,只能針對單個的鏈接。第二種方法是使用返回值的形式,當確定要訪問的時候返回true,不確定的時候返回false,那么這個可以針對任何鏈接來做,寫成一個通用的信息提示,方便頁面中的調用。 以上代碼都經過測試通過,可以自己再這個基礎上進行擴展,寫出自己需要的JavaScript代碼。 更多小技巧建議參考 藍色理想的鏈接: http://www.blueidea.com/tech/web/2004/2379.asp
2006年6月1日
mysql的日期和時間函數
|
這里是一個使用日期函數的例子。下面的查詢選擇所有 date_col 值在最后 30 天內的記錄。
mysql> SELECT something FROM tbl_name
WHERE TO_DAYS(NOW()) - TO_DAYS(date_col) <= 30;
-
DAYOFWEEK(date)
-
返回
date 的星期索引(1 = Sunday, 2 = Monday, ... 7 = Saturday)。索引值符合 ODBC 的標準。 mysql> SELECT DAYOFWEEK('1998-02-03');
-> 3
-
WEEKDAY(date)
- 返回
date 的星期索引(0 = Monday, 1 = Tuesday, ... 6 = Sunday): mysql> SELECT WEEKDAY('1998-02-03 22:23:00');
-> 1
mysql> SELECT WEEKDAY('1997-11-05');
-> 2
-
DAYOFMONTH(date)
- 返回
date 是一月中的第幾天,范圍為 1 到 31 : mysql> SELECT DAYOFMONTH('1998-02-03');
-> 3
-
DAYOFYEAR(date)
- 返回
date 是一年中的第幾天,范圍為 1 到 366 : mysql> SELECT DAYOFYEAR('1998-02-03');
-> 34
-
MONTH(date)
- 返回
date 中的月份,范圍為 1 到 12 : mysql> SELECT MONTH('1998-02-03');
-> 2
-
DAYNAME(date)
- 返回
date 的星期名: mysql> SELECT DAYNAME("1998-02-05");
-> 'Thursday'
-
MONTHNAME(date)
- 返回
date 的月份名: mysql> SELECT MONTHNAME("1998-02-05");
-> 'February'
-
QUARTER(date)
- 返回
date 在一年中的季度,范圍為 1 到 4 : mysql> SELECT QUARTER('98-04-01');
-> 2
-
WEEK(date)
-
-
WEEK(date,first)
- 對于星期日是一周中的第一天的場合,如果函數只有一個參數調用,返回
date 為一年的第幾周,返回值范圍為 0 到 53 (是的,可能有第 53 周的開始)。兩個參數形式的 WEEK() 允許你指定一周是否以星期日或星期一開始,以及返回值為 0-53 還是 1-52 。 這里的一個表顯示第二個參數是如何工作的:
值 | 含義 | 0 | 一周以星期日開始,返回值范圍為 0-53 | 1 | 一周以星期一開始,返回值范圍為 0-53 | 2 | 一周以星期日開始,返回值范圍為 1-53 | 3 | 一周以星期一開始,返回值范圍為 1-53 (ISO 8601) |
mysql> SELECT WEEK('1998-02-20');
-> 7
mysql> SELECT WEEK('1998-02-20',0);
-> 7
mysql> SELECT WEEK('1998-02-20',1);
-> 8
mysql> SELECT WEEK('1998-12-31',1);
-> 53
注意,在版本 4.0 中,WEEK(#,0) 被更改為匹配 USA 歷法。 注意,如果一周是上一年的最后一周,當你沒有使用 2 或 3 做為可選參數時,MySQL 將返回 0: mysql> SELECT YEAR('2000-01-01'), WEEK('2000-01-01',0);
-> 2000, 0
mysql> SELECT WEEK('2000-01-01',2);
-> 52
你可能會爭辯說,當給定的日期值實際上是 1999 年的第 52 周的一部分時,MySQL 對 WEEK() 函數應該返回 52 。我們決定返回 0 ,是因為我們希望該函數返回“在指定年份中是第幾周”。當與其它的提取日期值中的月日值的函數結合使用時,這使得 WEEK() 函數的用法可靠。 如果你更希望能得到恰當的年-周值,那么你應該使用參數 2 或 3 做為可選參數,或者使用函數 YEARWEEK() : mysql> SELECT YEARWEEK('2000-01-01');
-> 199952
mysql> SELECT MID(YEARWEEK('2000-01-01'),5,2);
-> 52
-
YEAR(date)
- 返回
date 的年份,范圍為 1000 到 9999 : mysql> SELECT YEAR('98-02-03');
-> 1998
-
YEARWEEK(date)
-
-
YEARWEEK(date,first)
- 返回一個日期值是的哪一年的哪一周。第二個參數的形式與作用完全與
WEEK() 的第二個參數一致。注意,對于給定的日期參數是一年的第一周或最后一周的,返回的年份值可能與日期參數給出的年份不一致: mysql> SELECT YEARWEEK('1987-01-01');
-> 198653
注意,對于可選參數 0 或 1,周值的返回值不同于 WEEK() 函數所返回值(0 ), WEEK() 根據給定的年語境返回周值。
-
HOUR(time)
- 返回
time 的小時值,范圍為 0 到 23 : mysql> SELECT HOUR('10:05:03');
-> 10
-
MINUTE(time)
- 返回
time 的分鐘值,范圍為 0 到 59 : mysql> SELECT MINUTE('98-02-03 10:05:03');
-> 5
-
SECOND(time)
- 返回
time 的秒值,范圍為 0 到 59 : mysql> SELECT SECOND('10:05:03');
-> 3
-
PERIOD_ADD(P,N)
- 增加
N 個月到時期 P (格式為 YYMM 或 YYYYMM )中。以 YYYYMM 格式返回值。 注意,期間參數 P 不是 一個日期值: mysql> SELECT PERIOD_ADD(9801,2);
-> 199803
-
PERIOD_DIFF(P1,P2)
- 返回時期
P1 和 P2 之間的月數。P1 和 P2 應該以 YYMM 或 YYYYMM 指定。 注意,時期參數 P1 和 P2 不是 日期值: mysql> SELECT PERIOD_DIFF(9802,199703);
-> 11
-
DATE_ADD(date,INTERVAL expr type)
-
-
DATE_SUB(date,INTERVAL expr type)
-
-
ADDDATE(date,INTERVAL expr type)
-
-
SUBDATE(date,INTERVAL expr type)
- 這些函數執行日期的算術運算。
ADDDATE() 和 SUBDATE() 分別是 DATE_ADD() 和 DATE_SUB() 的同義詞。 在 MySQL 3.23 中,如果表達式的右邊是一個日期值或一個日期時間型字段,你可以使用 + 和 - 代替 DATE_ADD() 和 DATE_SUB() (示例如下)。 參數 date 是一個 DATETIME 或 DATE 值,指定一個日期的開始。expr 是一個表達式,指定從開始日期上增加還是減去間隔值。expr 是一個字符串;它可以以一個 “-” 領頭表示一個負的間隔值。type 是一個關鍵詞,它標志著表達式以何格式被解釋。 下表顯示 type 和 expr 參數是如何關聯的:
type 值 | expr 期望的格式 | SECOND | SECONDS | MINUTE | MINUTES | HOUR | HOURS | DAY | DAYS | MONTH | MONTHS | YEAR | YEARS | MINUTE_SECOND | "MINUTES:SECONDS" | HOUR_MINUTE | "HOURS:MINUTES" | DAY_HOUR | "DAYS HOURS" | YEAR_MONTH | "YEARS-MONTHS" | HOUR_SECOND | "HOURS:MINUTES:SECONDS" | DAY_MINUTE | "DAYS HOURS:MINUTES" | DAY_SECOND | "DAYS HOURS:MINUTES:SECONDS" | 在 expr 的格式中,MySQL 允許任何字符作為定界符。表中所顯示的是建議的定界字符。如果 date 參數是一個 DATE 值,并且計算的間隔僅僅有 YEAR 、MONTH 和 DAY 部分(沒有時間部分),那么返回值也是一個 DATE 值。否則返回值是一個 DATETIME 值: mysql> SELECT "1997-12-31 23:59:59" + INTERVAL 1 SECOND;
-> 1998-01-01 00:00:00
mysql> SELECT INTERVAL 1 DAY + "1997-12-31";
-> 1998-01-01
mysql> SELECT "1998-01-01" - INTERVAL 1 SECOND;
-> 1997-12-31 23:59:59
mysql> SELECT DATE_ADD("1997-12-31 23:59:59",
-> INTERVAL 1 SECOND);
-> 1998-01-01 00:00:00
mysql> SELECT DATE_ADD("1997-12-31 23:59:59",
-> INTERVAL 1 DAY);
-> 1998-01-01 23:59:59
mysql> SELECT DATE_ADD("1997-12-31 23:59:59",
-> INTERVAL "1:1" MINUTE_SECOND);
-> 1998-01-01 00:01:00
mysql> SELECT DATE_SUB("1998-01-01 00:00:00",
-> INTERVAL "1 1:1:1" DAY_SECOND);
-> 1997-12-30 22:58:59
mysql> SELECT DATE_ADD("1998-01-01 00:00:00",
-> INTERVAL "-1 10" DAY_HOUR);
-> 1997-12-30 14:00:00
mysql> SELECT DATE_SUB("1998-01-02", INTERVAL 31 DAY);
-> 1997-12-02
如果你指定了一個太短的間隔值(沒有包括 type 關鍵詞所期望的所有間隔部分),MySQL 假設你遺漏了間隔值的最左邊部分。例如,如果指定一個 type 為 DAY_SECOND ,那么 expr 值被期望包含天、小時、分鐘和秒部分。如果你象 "1:10" 樣指定一個值,MySQL 假設天和小時部分被遺漏了,指定的值代表分鐘和秒。換句話說,"1:10" DAY_SECOND 被解釋為等價于 "1:10" MINUTE_SECOND 。這類似于 MySQL 解釋 TIME 值為經過的時間而不是一天的時刻。 注意,如果依著包含一個時間部分的間隔增加或減少一個日期值,該日期值將被自動地轉換到一個日期時間值: mysql> SELECT DATE_ADD("1999-01-01", INTERVAL 1 DAY);
-> 1999-01-02
mysql> SELECT DATE_ADD("1999-01-01", INTERVAL 1 HOUR);
-> 1999-01-01 01:00:00
如果你使用了確定不正確的日期,返回結果將是 NULL 。如果你增加 MONTH 、YEAR_MONTH 或 YEAR ,并且結果日期的天比新月份的最大天數還大,那么它將被調整到新月份的最大天數: mysql> SELECT DATE_ADD('1998-01-30', INTERVAL 1 MONTH);
-> 1998-02-28
注意,上面的例子中,單詞 INTERVAL 和關鍵詞 type 是不區分字母大小寫的。
-
EXTRACT(type FROM date)
-
EXTRACT()
函數使用與 DATE_ADD() 或 DATE_SUB() 一致的間隔類型,但是它用于指定從日期中提取的部分,而不是進行日期算術運算。 mysql> SELECT EXTRACT(YEAR FROM "1999-07-02");
-> 1999
mysql> SELECT EXTRACT(YEAR_MONTH FROM "1999-07-02 01:02:03");
-> 199907
mysql> SELECT EXTRACT(DAY_MINUTE FROM "1999-07-02 01:02:03");
-> 20102
-
TO_DAYS(date)
- 給出一個日期
date ,返回一個天數(從 0 年開始的天數): mysql> SELECT TO_DAYS(950501);
-> 728779
mysql> SELECT TO_DAYS('1997-10-07');
-> 729669
TO_DAYS() 無意于使用先于格里高里歷法(即現行的陽歷)(1582)出現的值,因為它不考慮當歷法改變時所遺失的天數。
-
FROM_DAYS(N)
- 給出一個天數
N ,返回一個 DATE 值: mysql> SELECT FROM_DAYS(729669);
-> '1997-10-07'
FROM_DAYS() 無意于使用先于格里高里歷法(1582)出現的值,因為它不考慮當歷法改變時所遺失的天數。
-
DATE_FORMAT(date,format)
- 依照
format 字符串格式化 date 值。下面的修飾符可被用于 format 字符串中:
修飾符 | 含義 | %M | 月的名字 (January ..December ) | %W | 星期的名字 (Sunday ..Saturday ) | %D | 有英文后綴的某月的第幾天 (0th , 1st , 2nd , 3rd , etc.) | %Y | 年份,數字的,4 位 | %y | 年份,數字的,2 位 | %X | 周值的年份,星期日是一個星期的第一天,數字的,4 位,與 '%V' 一同使用 | %x | 周值的年份,星期一是一個星期的第一天,數字的,4 位,與 '%v' 一同使用 | %a | 縮寫的星期名 (Sun ..Sat ) | %d | 月份中的天數,數字的 (00 ..31 ) | %e | 月份中的天數,數字的 (0 ..31 ) | %m | 月,數字的 (00 ..12 ) | %c | 月,數字的 (0 ..12 ) | %b | 縮寫的月份名 (Jan ..Dec ) | %j | 一年中的天數 (001 ..366 ) | %H | 小時 (00 ..23 ) | %k | 小時 (0 ..23 ) | %h | 小時 (01 ..12 ) | %I | 小時 (01 ..12 ) | %l | 小時 (1 ..12 ) | %i | 分鐘,數字的 (00 ..59 ) | %r | 時間,12 小時 (hh:mm:ss [AP]M ) | %T | 時間,24 小時 (hh:mm:ss ) | %S | 秒 (00 ..59 ) | %s | 秒 (00 ..59 ) | %p | AM 或 PM | %w | 一周中的天數 (0 =Sunday..6 =Saturday) | %U | 星期 (00 ..53 ),星期日是一個星期的第一天 | %u | 星期 (00 ..53 ),星期一是一個星期的第一天 | %V | 星期 (01 ..53 ),星期日是一個星期的第一天。與 '%X' 一起使用 | %v | 星期 (01 ..53 ),星期一是一個星期的第一天。與 '%x' 一起使用 | %% | 一個字母 “%” | 所有其它的字符不經過解釋,直接復制到結果中: mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y');
-> 'Saturday October 1997'
mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%H:%i:%s');
-> '22:23:00'
mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00',
'%D %y %a %d %m %b %j');
-> '4th 97 Sat 04 10 Oct 277'
mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00',
'%H %k %I %r %T %S %w');
-> '22 22 10 10:23:00 PM 22:23:00 00 6'
mysql> SELECT DATE_FORMAT('1999-01-01', '%X %V');
-> '1998 52'
在 MySQL 3.23 中,在格式修飾符前需要字符 `%'。在更早的 MySQL 版本中,`%' 是可選的。 月份與天修飾符的范圍從零開始的原因是,在 MySQL 3.23 中,它允許存儲不完善的日期值(例如 '2004-00-00' )。
-
TIME_FORMAT(time,format)
- 它的使用方法與上面的
DATE_FORMAT() 函數相似,但是 format 字符串只包含處理小時、分和秒的那些格式修飾符。使用其它的修飾符會產生一個 NULL 值或 0 。
-
CURDATE()
-
-
CURRENT_DATE
- 以
'YYYY-MM-DD' 或 YYYYMMDD 格式返回當前的日期值,返回的格式取決于該函數是用于字符串還是數字語境中: mysql> SELECT CURDATE();
-> '1997-12-15'
mysql> SELECT CURDATE() + 0;
-> 19971215
-
CURTIME()
-
-
CURRENT_TIME
- 以
'HH:MM:SS' 或 HHMMSS 格式返回當前的時間值,返回的格式取決于該函數是用于字符串還是數字語境中: mysql> SELECT CURTIME();
-> '23:50:26'
mysql> SELECT CURTIME() + 0;
-> 235026
-
NOW()
-
-
SYSDATE()
-
-
CURRENT_TIMESTAMP
- 以
'YYYY-MM-DD HH:MM:SS' 或 YYYYMMDDHHMMSS 格式返回當前的日期時間值,返回的格式取決于該函數是用于字符串還是數字語境中: mysql> SELECT NOW();
-> '1997-12-15 23:50:26'
mysql> SELECT NOW() + 0;
-> 19971215235026
注意,函數 NOW() 在每個查詢中只計算一次,也就是在查詢開始執行時。這就是說,如果在一個單獨的查詢中多次引用了 NOW() ,它只會給出值都是一個相同的時間。
-
UNIX_TIMESTAMP()
-
-
UNIX_TIMESTAMP(date)
- 如果調用時沒有參數,以無符號的整數形式返回一個 Unix 時間戳(從
'1970-01-01 00:00:00' GMT 開始的秒數)。如果以一個參數 date 調用 UNIX_TIMESTAMP() ,它將返回該參數值從 '1970-01-01 00:00:00' GMT 開始經過的秒數值。date 可以是一個 DATE 字符串,一個 DATETIME 字符串,一個 TIMESTAMP ,或者以一個 YYMMDD 或 YYYYMMDD 顯示的本地時間: mysql> SELECT UNIX_TIMESTAMP();
-> 882226357
mysql> SELECT UNIX_TIMESTAMP('1997-10-04 22:23:00');
-> 875996580
當 UNIX_TIMESTAMP 被用于一個 TIMESTAMP 列時,函數直接返回一個內部的時間戳值,而不進行一個隱含地 “string-to-unix-timestamp” 轉換。如果你傳遞一個超出范圍的日期參數給 UNIX_TIMESTAMP() ,它將返回 0,但是請注意,MySQL 對其僅僅進行基本的檢驗(年范圍 1970-2037,月份 01-12,日期 01-31)。 如果你希望減去 UNIX_TIMESTAMP() 列,你應該需要將結果強制轉換為一有符號整數。查看章節 6.3.5 Cast 函數。
-
FROM_UNIXTIME(unix_timestamp [,format])
- 以
'YYYY-MM-DD HH:MM:SS' 或 YYYYMMDDHHMMSS 格式返回一個 unix_timestamp 參數值,返回值的形式取決于該函數使用于字符串還是數字語境。 如果 format 給出,返回值依 format 字符串被格式。format 可以包含與 DATE_FORMAT() 函數同樣的修飾符。 mysql> SELECT FROM_UNIXTIME(875996580);
-> '1997-10-04 22:23:00'
mysql> SELECT FROM_UNIXTIME(875996580) + 0;
-> 19971004222300
mysql> SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(),
'%Y %D %M %h:%i:%s %x');
-> '1997 23rd December 03:43:30 1997'
-
SEC_TO_TIME(seconds)
- 以
'HH:MM:SS' 或 HHMMSS 格式返回參數 seconds 被轉換到時分秒后的值,返回值的形式取決于該函數使用于字符串還是數字語境: mysql> SELECT SEC_TO_TIME(2378);
-> '00:39:38'
mysql> SELECT SEC_TO_TIME(2378) + 0;
-> 3938
-
TIME_TO_SEC(time)
- 將參數
time 轉換為秒數后返回: mysql> SELECT TIME_TO_SEC('22:23:00');
-> 80580
mysql> SELECT TIME_TO_SEC('00:39:38');
-> 2378
|
2006年5月23日
54 改變瀏覽器狀態欄文字提示
- <script?language=”JavaScript”>
window.status?=?“A?new?status?message”; </script>
55 彈出確認提示框
- <script?language=”JavaScript”>
- var?
userChoice?=?window.confirm(“Click?OK?or?Cancel”);
- if?(
userChoice)?{? document.write(“You?chose?OK”);
- ?}?else?{?
document.write(“You?chose?Cancel”);
- ?}
</script>
56 提示輸入
- <script?language=”JavaScript”>
- var?
userName?=?window.prompt(“Please?Enter?Your?Name”,”Enter?Your?Name?Here”); document.write(“Your?Name?is?“?+?userName); </script>
57 打開一個新窗口
- //打開一個名稱為myNewWindow的瀏覽器新窗口
<script?language=”JavaScript”> window.open(“http://www.liu21st.com/”,”myNewWindow”); </script>
58 設置新窗口的大小
- <script?language=”JavaScript”>
window.open(“http://www.liu21st.com/”,”myNewWindow”,'height=300,width=300'); </script>
59 設置新窗口的位置
- <script?language=”JavaScript”>
window.open(“http://www.liu21st.com/”,”myNewWindow”,'height=300,width=300,left=200,screenX=200,top=100,screenY=100'); </script>
60 是否顯示工具欄和滾動欄
- <script?language=”JavaScript”>
window.open(“http:
61 是否可以縮放新窗口的大小
- <script?language=”JavaScript”>
window.open('http://www.liu21st.com/'?,?'myNewWindow',?'resizable=yes'?);</script>
62 加載一個新的文檔到當前窗口
- <a?href='#'?onClick='document.location?=?'125a.html';'?>Open?New?Document</a>
63 設置頁面的滾動位置
- <script?language=”JavaScript”>
- if?(
document.all)?{?//如果是IE瀏覽器則使用scrollTop屬性 document.body.scrollTop?=?200;
- ?}?else?{?
//如果是NetScape瀏覽器則使用pageYOffset屬性 window.pageYOffset?=?200;
- ?}
</script>
64 在IE中打開全屏窗口
- <a?href='#'??onClick=”window.open('http://www.juxta.com/','newWindow','fullScreen=yes');”>Open?a?full-screen?window</a>
65 新窗口和父窗口的操作
- <script?language=”JavaScript”>
//定義新窗口 var?newWindow?=?window.open(“128a.html”,”newWindow”); newWindow.close();?//在父窗口中關閉打開的新窗口 </script> 在新窗口中關閉父窗口
- window.opener.close()
66 往新窗口中寫內容
- <script?language=”JavaScript”>
- var?
newWindow?=?window.open(“”,”newWindow”); newWindow.document.open(); newWindow.document.write(“This?is?a?new?window”); newWIndow.document.close(); </script>
67 加載頁面到框架頁面
- <frameset?cols=”50%,*”>
- <
frame?name=”frame1”?src=”135a.html”>
- <
frame?name=”frame2”?src=”about:blank”>
- </
frameset> 在frame1中加載frame2中的頁面
- parent
.frame2.document.location?=?“135b.html”;
68 在框架頁面之間共享腳本 如果在frame1中html文件中有個腳本
- function?doAlert()?{?
window.alert(“Frame?1?is?loaded”);
- ?}
那么在frame2中可以如此調用該方法
- <body?onLoad=”parent.frame1.doAlert();”>
This?is?frame?2. </body>
69 數據公用 可以在框架頁面定義數據項,使得該數據可以被多個框架中的頁面公用
- <script?language=”JavaScript”>
- var?
persistentVariable?=?“This?is?a?persistent?value”; </script> <frameset?cols=”50%,*”>
- <frame?name=”frame1”?src=”138a.html”>
- <frame?name=”frame2”?src=”138b.html”>
- </frameset>
這樣在frame1和frame2中都可以使用變量persistentVariable 70 框架代碼庫 根據以上的一些思路,我們可以使用一個隱藏的框架頁面來作為整個框架集的代碼庫
- <frameset?cols=”0,50%,*”>
- <
frame?name=”codeFrame”?src=”140code.html”>
- <
frame?name=”frame1”?src=”140a.html”>
- <
frame?name=”frame2”?src=”140b.html”>
- </
frameset>
2006年4月10日
通常,你需要獲得當前日期和計算一些其他的日期,例如,你的程序可能需要判斷一個月的第一天或者最后一天。你們大部分人大概都知道怎樣把日期進行分割(年、月、日等),然后僅僅用分割出來的年、月、日等放在幾個函數中計算出自己所需要的日期!在這篇文?章里,我將告訴你如何使用DATEADD和DATEDIFF函數來計算出在你的程序中可能你要用到的一些不同日期。?
在使用本文中的例子之前,你必須注意以下的問題。大部分可能不是所有例子在不同的機器上執行的結果可能不一樣,這完全由哪一天是一個星期的第一天這個設置決定。第一天(DATEFIRST)設定決定了你的系統使用哪一天作為一周的第一天。所有以下的例?子都是以星期天作為一周的第一天來建立,也就是第一天設置為7。假如你的第一天設置不一樣,你可能需要調整這些例子,使它和不同的第一天設置相符合。你可以通過@@DATEFIRST函數來檢查第一天設置。? 為了理解這些例子,我們先復習一下DATEDIFF和DATEADD函數。DATEDIFF函數計算兩個日期之間的小時、天、周、月、年等時間間隔總數。DATEADD函數計算一個日期通過給時間間隔加減來獲得一個新的日期。要了解更多的DATEDI?FF和DATEADD函數以及時間間隔可以閱讀微軟聯機幫助。? 使用DATEDIFF和DATEADD函數來計算日期,和本來從當前日期轉換到你需要的日期的考慮方法有點不同。你必須從時間間隔這個方面來考慮。比如,從當前日期到你要得到的日期之間有多少時間間隔,或者,從今天到某一天(比如1900-1-1)之間有多少時間間隔,等等。理解怎樣著眼于時間間隔有助于你輕松的理解我的不同的日期計算例子。? 一個月的第一天? 第一個例子,我將告訴你如何從當前日期去這個月的最后一天。請注意:這個例子以及這篇文章中的其他例子都將只使用DATEDIFF和DATEADD函數來計算我們想要的日期。每一個例子都將通過計算但前的時間間隔,然后進行加減來得到想要計算的日期。? 這是計算一個月第一天的SQL?腳本:? SELECT?DATEADD(mm,?DATEDIFF(mm,0,getdate()),?0)? 我們把這個語句分開來看看它是如何工作的。最核心的函數是getdate(),大部分人都知道這個是返回當前的日期和時間的函數。下一個執行的函數 DATEDIFF(mm,0,getdate())是計算當前日期和“1900-01-01?00:00:00.000”這個日期之間的月數。記住:時期和時間變量和毫秒一樣是從“1900-01-01?00:00:00.000”開始計算的。這就是為什么你可以在DATEDIFF函數中指定第一個時間表達式為“0”。下一個函數是DATEADD,增加當前日期到“1900-01-01”的月數。通過增加預定義的日期“1900-01-01”和當前日期的月數,我們可以獲得這個月的第一天。另外,計算出來的日期的時間部分將會是“00:00:00.000”。? 這個計算的技巧是先計算當前日期到“1900-01-01”的時間間隔數,然后把它加到“1900-01-01”上來獲得特殊的日期,這個技巧可以用來計算很多不同的日期。下一個例子也是用這個技巧從當前日期來產生不同的日期。 本周的星期一? 這里我是用周(wk)的時間間隔來計算哪一天是本周的星期一。? SELECT?DATEADD(wk,?DATEDIFF(wk,0,getdate()),?0)? 一年的第一天? 現在用年(yy)的時間間隔來顯示這一年的第一天。? SELECT?DATEADD(yy,?DATEDIFF(yy,0,getdate()),?0)? 季度的第一天? 假如你要計算這個季度的第一天,這個例子告訴你該如何做。? SELECT?DATEADD(qq,?DATEDIFF(qq,0,getdate()),?0)? 當天的半夜? 曾經需要通過getdate()函數為了返回時間值截掉時間部分,就會考慮到當前日期是不是在半夜。假如這樣,這個例子使用DATEDIFF和DATEADD函數來獲得半夜的時間點。? SELECT?DATEADD(dd,?DATEDIFF(dd,0,getdate()),?0)? 深入DATEDIFF和DATEADD函數計算? 你可以明白,通過使用簡單的DATEDIFF和DATEADD函數計算,你可以發現很多不同的可能有意義的日期。? 目前為止的所有例子只是僅僅計算當前的時間和“1900-01-01”之間的時間間隔數量,然后把它加到“1900-01-01”的時間間隔上來計算出日期。假定你修改時間間隔的數量,或者使用不同的時間間隔來調用DATEADD函數,或者減去時間間隔而不是增加,那么通過這些小的調整你可以發現和多不同的日期。? 這里有四個例子使用另外一個DATEADD函數來計算最后一天來分別替換DATEADD函數前后兩個時間間隔。? 上個月的最后一天? 這是一個計算上個月最后一天的例子。它通過從一個月的最后一天這個例子上減去3毫秒來獲得。有一點要記住,在Sql?Server中時間是精確到3毫秒。這就是為什么我需要減去3毫秒來獲得我要的日期和時間。? SELECT?dateadd(ms,-3,DATEADD(mm,?DATEDIFF(mm,0,getdate()),?0))? 計算出來的日期的時間部分包含了一個Sql?Server可以記錄的一天的最后時刻(“23:59:59:997”)的時間。? 去年的最后一天? 連接上面的例子,為了要得到去年的最后一天,你需要在今年的第一天上減去3毫秒。? SELECT?dateadd(ms,-3,DATEADD(yy,?DATEDIFF(yy,0,getdate()),?0))? 本月的最后一天? 現在,為了獲得本月的最后一天,我需要稍微修改一下獲得上個月的最后一天的語句。修改需要給用DATEDIFF比較當前日期和“1900-01-01” 返回的時間間隔上加1。通過加1個月,我計算出下個月的第一天,然后減去3毫秒,這樣就計算出了這個月的最后一天。這是計算本月最后一天的SQL腳本。? SELECT?dateadd(ms,-3,DATEADD(mm,?DATEDIFF(m,0,getdate())+1,?0))? 本年的最后一天? 你現在應該掌握這個的做法,這是計算本年最后一天腳本? SELECT?dateadd(ms,-3,DATEADD(yy,?DATEDIFF(yy,0,getdate())+1,?0))。? 本月的第一個星期一? 好了,現在是最后一個例子。這里我要計算這個月的第一個星期一。這是計算的腳本。? select?DATEADD(wk,?DATEDIFF(wk,0,? dateadd(dd,6-datepart(day,getdate()),getdate())? ),?0)? 在這個例子里,我使用了“本周的星期一”的腳本,并作了一點點修改。修改的部分是把原來腳本中“getdate()”部分替換成計算本月的第6天,在計算中用本月的第6天來替換當前日期使得計算可以獲得這個月的第一個星期一。? 總結? 我希望這些例子可以在你用DATEADD和DATEDIFF函數計算日期時給你一點啟發。通過使用這個計算日期的時間間隔的數學方法,我發現為了顯示兩個日期之間間隔的有用歷法是有價值的。注意,這只是計算出這些日期的一種方法。要牢記,還有很多方法?可以得到相同的計算結果。假如你有其他的方法,那很不錯,要是你沒有,我希望這些例子可以給你一些啟發,當你要用DATEADD和DATEDIFF函數計算你程序可能要用到的日期時。? 附錄,其他日期處理方法? 1)去掉時分秒? declare?@?datetime? set?@?=?getdate()?--’2003-7-1?10:00:00’? SELECT?@,DATEADD(day,?DATEDIFF(day,0,@),?0)? 2)顯示星期幾? select?datename(weekday,getdate())? 3)如何取得某個月的天數? declare?@m?int? set?@m=2?--月份? select?datediff(day,’2003-’+cast(@m?as?varchar)+’-15’?,’2003-’+cast(@m+1?as?varchar)+’-15’)? 另外,取得本月天數? select?datediff(day,cast(month(GetDate())?as?varchar)+’-’+cast(month(GetDate())?as?varchar)+’-15’?,cast(month(GetDate())?as?varchar)+’-’+cast(month(GetDate())+1?as?varchar)+’-15’)? 或者使用計算本月的最后一天的腳本,然后用DAY函數區最后一天? SELECT?Day(dateadd(ms,-3,DATEADD(mm,?DATEDIFF(m,0,getdate())+1,?0)))? 4)判斷是否閏年:? SELECT?case?day(dateadd(mm,?2,?dateadd(ms,-3,DATEADD(yy,?DATEDIFF(yy,0,getdate()),?0))))?when?28?then?’平年’?else?’閏年’?end? 或者? select?case?datediff(day,datename(year,getdate())+’-02-01’,dateadd(mm,1,datename(year,getdate())+’-02-01’))? when?28?then?’平年’?else?’閏年’?end? 5)一個季度多少天? declare?@m?tinyint,@time?smalldatetime? select?@m=month(getdate())? select?@m=case?when?@m?between?1?and?3?then?1? when?@m?between?4?and?6?then?4? when?@m?between?7?and?9?then?7? else?10?end? select?@time=datename(year,getdate())+’-’+convert(varchar(10),@m)+’-01’? select?datediff(day,@time,dateadd(mm,3,@time))
?Asp基本日期函數 以及 日期函數擴展類(原創) clsDateFunEx_Power by Sman & Net Fetch:
點擊下載此文件
Asp基本日期函數: 函數 語法 說明 示例 Now Now() 取得系統當前的日期和時間 Date Date() 取得系統當前的日期 Time Time() 取得系統當前的時間 Year Year(Date) 取得給定日期的年份 Month Month(Date) 取得給定日期的月份 Day Day(Date) 取得給定日期是幾號 Hour Hour(time) 取得給定時間是第幾小時 Minute Minute(time) 取得給定時間是第幾分鐘 Second Second(time) 取得給守時間是第幾秒 WeekDay WeekDay(Date) 取得給定日期是
星期幾的整數,1表示星期日,2表示星期一,依此類推 DateDiff("Var",Var1,Var2) Var:日期或時間間隔因子,有如下參數:yyyy 年 m月 d 日 ww星期 h小時 s秒 Var1:第一個日期或時間 Var2:第二個日期或時間,比Var1晚 計算兩個日期或時間的間隔
DateAdd("Var",Var1,Var2) Var:日期或時間間隔因子: Var1:日期或時間間隔倍數 Var2:日期或時間的基準 對兩個日期或時間作加法 如果計算的日期是在公元 100 年之前,則會產生錯誤。
FormatDateTime FormatDateTime(Date,vbShortDate) 轉化為短日期格式 FromatDateTime(Date(),vbLongDate) "以長日期格式顯示 FormatDateTime(Date,vbLongDate) 轉化為長日期格式 FormatDateTime(Date,vbShortTime) 轉化為短時間格式 FormatDateTime(Date,vbLongTime) 轉化為長時間格式
日期函數擴展類代碼 (clsDateFunEx_Power by Sman & Net Fetch):
 程序代碼 <% '轉發時請保留此聲明信息,這段聲明不并會影響你的速度! '************************** 【日期擴展類】Ver 0.1.0 ******************************** '開發人:??Sman、Net Fetch '開發日期:??2005-11-11 '版本號:??Ver 0.1.0 '官方網站: http://www.sman.cnhttp://www.ad0.cn'電子郵件:huihui3030@126.com、Ad0@Ad0.Cn QQ:19341293 32050450 '版權聲明:版權沒有,盜版不究,源碼公開,歡迎盜版,歡迎你到官方網站來尋求支持。 '如有任何改進之處,麻煩轉發或者反饋一份到 huihui3030@126.com、Ad0@Ad0.Cn,Thanks! '詳細使用說明或范例請見下載附件或到官方站點或Email聯系下載! '************************************************************************************ Class DateFunEx Private d_ ?Private Sub class_initialize() ??d_ = "" ?End Sub ? Public Property Let setDate(strDate) '傳入日期參數 strDate d_ = strDate End Property ? ?Public Property Get Version ??Version = "Copyright ? Date Function Extend Ver 0.1.0<br />" & _ ????"Power by <a href=' http://www.sman.cn' target='_blank'>Sman</a> " & _ ????" & <a href='mailto:NetFetchStudio@163.com' target='_blank'>Net Fetch</a>" ?End Property Sub FormatDate() ??On Error Resume Next ??If IsNumeric(d_) Then ???d_ = Cint(d_) ???If len(d_)< 3 Then d_ = "20" & right("0"&d_,2) ???d_ = d_ & "-1" ??End If ??d_ = cDate(d_) End Sub?? '------------------------------ ' 功能說明:算第幾周的星期幾是幾號 ' 參數說明:y 年,w周,week 星期 (星期一1 星期天7) FirstDayofWeek 每周的第一天(詳細設置請參照VBS手冊) ' 例 2005年40周星期天 GetWeekDate(2005,40,7) '------------------------------ Public Function GetWeekDate(y, w, DayofWeek) ??Call FormatDate() Dim NewYearDay,FirstDayofWeek FirstDayofWeek = 2 NewYearDay = CDate(y & "-1-1") '元旦 GetWeekDate = ((NewYearDay - Weekday(NewYearDay, FirstDayofWeek)) + (w - 1) * 7 + DayofWeek) ?End Function '------------------------------ ' 功能說明:獲得某年某月的天數 ' 參數說明:d_ 年-月-日 ' 例 2005年10月 GetMonthDayCount("2005-10-11")(日可要可不要) '------------------------------ Public Function GetMonthDayCount() ??Call FormatDate() GetMonthDayCount = DateDiff("d", d_, DateAdd("m", 1, d_)) End Function '------------------------------ ' 功能說明:得到某年某月的第一天 ' 相關函數:GetMonthFirstDay ' 例 本月 GetMonthFirstDay(date)(日可要可不要) 上月 GetMonthFirstDay(dateadd("m",-1,date)) 以此類推 '------------------------------ Public Function GetMonthFirstDay() ??Call FormatDate() GetMonthFirstDay = CDate( Year(d_) & "-" & Month(d_) & "-1") End Function ? '------------------------------ ' 功能說明:得到某年的某月的最后一天 ' 參數說明:d_ 年-月-日 ' 關聯函數:GetMonthDayCount ' 例 本月 GetMonthLastDay(date)(日可要可不要) 上月 GetMonthLastDay(dateadd("m",-1,date)) 以此類推 '------------------------------ Public Function GetMonthLastDay() ??Call FormatDate() GetMonthLastDay = CDate( Year(d_) & "-"&Month(d_) & "-" & DateDiff("d", d_, DateAdd("m", 1, d_))) End Function '------------------------------ ' 功能說明:某日所在的周的第一天的日期 ' 相關函數:GetWeekDate ' 例 本周 WeekFirstDay(date) 上周 WeekFirstDay(dateadd("ww",-1,date)) 以此類推 '------------------------------ Public Function WeekFirstDay() ??Call FormatDate() WeekFirstDay = GetWeekDate(Year(d_), DatePart("ww", d_), 1) End Function '------------------------------ ' 功能說明:某日所在的周的第最后一天的日期 ' 相關函數:GetWeekDate ' 例 本周 WeekLastDay(date) 上周 WeekLastDay(dateadd("ww",-1,date)) 以此類推 '------------------------------ Public Function WeekLastDay() ??Call FormatDate() WeekLastDay = GetWeekDate(Year(d_), DatePart("ww", d_), 7) End Function ? End Class %>
調用代碼:
 程序代碼 <%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%> <% Option Explicit %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns=" http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>Test_clsDateFunEx</title> </head> <body> <!--#include file="clsDateFunEx.asp" --> <% Dim myDateFun,strDate strDate = "2005-6" Set myDateFun = new DateFunEx ?myDateFun.setDate = strDate ?Response.write "2005年第5周的星期天是幾號:<br>" & _ ??????String(20, " ") & myDateFun.GetWeekDate(2005,10,7) &"<br>" ?Response.Write "本月的天數:<br>"&_ ??????String(20, " ") & myDateFun.GetMonthDayCount & "<br>" ?Response.Write "本月的第一天:<br>"&_ ??????String(20, " ") & myDateFun.GetMonthFirstDay & "<br>" ?myDateFun.setDate = Now() ?Response.Write "本月的最后一天:<br>"&_ ??????String(20, " ") & myDateFun.GetMonthLastDay & "<br>" ?Response.Write "本月所在的周的第一天的日期:<br>"&_ ??????String(20, " ") & myDateFun.WeekFirstDay & "<br>" ?Response.Write "本月所在的周的第最后一天的日期:<br>" & _ ??????String(20, " ") & myDateFun.WeekLastDay & "<br>" ?Response.Write "<br><br><br><div style='padding-left:200px;font-size:12px;'>" & myDateFun.Version & "</div><br>" Set myDateFun = Nothing %> </body> </html>
 程序代碼 '************************************* '日期轉換函數 '************************************* Function DateToStr(DateTime,ShowType) ?Dim DateMonth,DateDay,DateHour,DateMinute,DateWeek,DateSecond ?Dim FullWeekday,shortWeekday,Fullmonth,Shortmonth,TimeZone1,TimeZone2 ?TimeZone1="+0800" ?TimeZone2="+08:00" ?FullWeekday=Array("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday") ?shortWeekday=Array("Sun","Mon","Tue","Wed","Thu","Fri","Sat") Fullmonth=Array("January","February","March","April","May","June","July","August","September","October","November","December") Shortmonth=Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec")
?DateMonth=Month(DateTime) ?DateDay=Day(DateTime) ?DateHour=Hour(DateTime) ?DateMinute=Minute(DateTime) ?DateWeek=weekday(DateTime) ?DateSecond=Second(DateTime) ?If Len(DateMonth)<2 Then DateMonth="0"&DateMonth ?If Len(DateDay)<2 Then DateDay="0"&DateDay ?If Len(DateMinute)<2 Then DateMinute="0"&DateMinute ?Select Case ShowType ?Case "Y-m-d" ??DateToStr=Year(DateTime)&"-"&DateMonth&"-"&DateDay ?Case "Y-m-d H:I A" ??Dim DateAMPM ??If DateHour>12 Then ???DateHour=DateHour-12 ???DateAMPM="PM" ??Else ???DateHour=DateHour ???DateAMPM="AM" ??End If ??If Len(DateHour)<2 Then DateHour="0"&DateHour? ??DateToStr=Year(DateTime)&"-"&DateMonth&"-"&DateDay&" "&DateHour&":"&DateMinute&" "&DateAMPM ?Case "Y-m-d H:I:S" ??If Len(DateHour)<2 Then DateHour="0"&DateHour? ??If Len(DateSecond)<2 Then DateSecond="0"&DateSecond ??DateToStr=Year(DateTime)&"-"&DateMonth&"-"&DateDay&" "&DateHour&":"&DateMinute&":"&DateSecond ?Case "YmdHIS" ??DateSecond=Second(DateTime) ??If Len(DateHour)<2 Then DateHour="0"&DateHour? ??If Len(DateSecond)<2 Then DateSecond="0"&DateSecond ??DateToStr=Year(DateTime)&DateMonth&DateDay&DateHour&DateMinute&DateSecond? ?Case "ym" ??DateToStr=Right(Year(DateTime),2)&DateMonth ?Case "d" ??DateToStr=DateDay Case "ymd" DateToStr=Right(Year(DateTime),4)&DateMonth&DateDay Case "mdy" Dim DayEnd select Case DateDay Case 1 DayEnd="st" Case 2 DayEnd="nd" Case 3 DayEnd="rd" Case Else DayEnd="th" End Select DateToStr=Fullmonth(DateMonth-1)&" "&DateDay&DayEnd&" "&Right(Year(DateTime),4) Case "w,d m y H:I:S" ??DateSecond=Second(DateTime) ??If Len(DateHour)<2 Then DateHour="0"&DateHour? ??If Len(DateSecond)<2 Then DateSecond="0"&DateSecond DateToStr=shortWeekday(DateWeek-1)&","&DateDay&" "& Left(Fullmonth(DateMonth-1),3) &" "&Right(Year(DateTime),4)&" "&DateHour&":"&DateMinute&":"&DateSecond&" "&TimeZone1 Case "y-m-dTH:I:S" ??If Len(DateHour)<2 Then DateHour="0"&DateHour? ??If Len(DateSecond)<2 Then DateSecond="0"&DateSecond ??DateToStr=Year(DateTime)&"-"&DateMonth&"-"&DateDay&"T"&DateHour&":"&DateMinute&":"&DateSecond&TimeZone2 ?Case Else ??If Len(DateHour)<2 Then DateHour="0"&DateHour ??DateToStr=Year(DateTime)&"-"&DateMonth&"-"&DateDay&" "&DateHour&":"&DateMinute ?End Select End Function
|
|
CALENDER
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
---|
27 | 28 | 29 | 30 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|
常用鏈接
留言簿(1)
隨筆檔案
文章檔案
搜索
最新評論

閱讀排行榜
評論排行榜
Powered By: 博客園 模板提供:滬江博客
|