随笔:19 文章:2 评论:6 引用:0
BlogJava 首页 发新随笔
发新文章 联系 聚合管理

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
posted @ 2006-10-24 11:33 yanzhicun 阅读(383) | 评论 (1)编辑 收藏

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
posted @ 2006-07-12 12:00 yanzhicun 阅读(603) | 评论 (0)编辑 收藏
 

在SQL 企业管理器上操作步骤:

一:进入企业管理器,打开支持服务,选取全文检索,点击启动。

 

二:对相关的数据表建立全文索引。

三:全文索引建立向导

 

 

 

然后确定提交后,建立向导就基本完成。

到这里在SQL上建立全文索引已经完成!

四:补充:由于全文填充是按照调度里设定周期进行的,所以不会马上生效,如果需要的话可以点击全目录,运行填充。通常数据量大的话不建议在访问量大的时候进行。

 

解决在全文搜索中搜索中文字符出错补丁:点击下载

解决中文字符出错问题:

方法一:
把下载解压的文件复制到...\Microsoft SQL Server\MSSQL\FTDATA\SQLServer\Config\
目录下(该路径为全文目录路径,可以全文目录属性中查看)

方法二:
编辑...\Microsoft SQL Server\MSSQL\FTDATA\SQLServer\Config\目录下的
noise.chs文件,清空文档,输入‘@’(其他的偏僻符号也可以)


最后,重新进行全文完全填充!

posted @ 2006-07-12 11:44 yanzhicun 阅读(354) | 评论 (0)编辑 收藏
 

引言

微软的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’)

posted @ 2006-07-12 11:42 yanzhicun 阅读(439) | 评论 (0)编辑 收藏
 
使用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&reg; SQL Server&#8482; 2000 在接收带全文构造的 Transact-SQL 语句时,使用全文提供程序从 Microsoft 搜索服务检索所需信息。全文构造是 CONTAINS 或 FREETEXT 谓词,或者是 CONTAINSTABLE 或 FREETEXTTABLE 行集函数。如果不知道包含搜索条件的列,全文构造可以在全文索引中引用多列。该进程的流程如下图所示。

 


这一进程涉及的步骤包括: 

应用程序给 SQL Server 实例发送带全文构造的 Transact-SQL 语句。

SQL Server 关系引擎通过查询系统表验证全文构造,确定全文索引是否覆盖列引用。关系引擎将每个 SQL 语句简化为一系列行集操作,并使用 OLE DB 将这些操作传递给基础组件,通常是存储引擎。关系引擎通过全文提供程序而不是存储引擎,将任何全文构造转换成对行集的请求。请求的行集是满足搜索条件和等级的键集,而这个等级表示每个键的数据满足搜索条件的程度。向全文提供程序发送的行集请求命令包括全文检索条件。

全文提供程序验证请求并将搜索条件更改为由Microsoft 搜索服务的查询支持组件使用的形式。将请求发送到搜索服务。

查询支持组件使用搜索引擎组件从全文索引析取所请求的数据。然后以行集的形式将这些数据传递回全文提供程序。

全文提供程序将这个行集返回给关系引擎。

关系引擎将它从存储引擎和全文提供程序收到的所有行集进行组合,以生成发送回客户端的最终结果集。 

 

全文目录和索引

Microsoft&reg; SQL Server&#8482; 2000 全文索引为在字符串数据中进行复杂的词搜索提供有效支持。全文索引存储关于重要词和这些词在特定列中的位置的信息。全文查询利用这些信息,可快速搜索包含具体某个词或一组词的行。

全文索引包含在全文目录中。每个数据库可以包含一个或多个全文目录。一个目录不能属于多个数据库,而每个目录可以包含一个或多个表的全文索引。一个表只能有一个全文索引,因此每个有全文索引的表只属于一个全文目录。

全文目录和索引不存储在它们所属的数据库中。目录和索引由 Microsoft 搜索服务分开管理。

全文索引必须在基表上定义,而不能在视图、系统表或临时表上定义。 全文索引的定义包括: 

能唯一标识表中各行的列(主键或候选键),而且不允许 NULL 值。

索引所覆盖的一个或多个字符串列。 

全文索引由键值填充。每个键的项提供与该键相关联的重要词(干扰词或终止词除外)、它们所在的列和它们在列中的位置等有关信息。

格式化文本字符串(如 Microsoft&reg; Word&#8482; 文档文件或 HTML 文件)不能存储在字符串或 Unicode 列中,因为这些文件中的许多字节包含不构成有效字符的数据结构。数据库应用程序可能仍需要访问这些数据并对其应用全文检索。因为 image 列并不要求每一字节都构成一个有效字符,所以许多站点将这类数据存储在 image 列中。SQL Server 2000 引入了对存储在 image 列中的这些类型的数据执行全文检索的能力。SQL Server 2000 提供筛选,可从 Microsoft Office&#8482; 文件(.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&reg; SQL Server&#8482; 2000 数据的全文支持涉及两个功能:对字符数据发出查询的能力和创建及维护基础索引以简化这些查询的能力。

全文索引在许多地方与普通的 SQL 索引不同。

普通 SQL 索引
 全文索引
 
存储时受定义它们所在的数据库的控制。
 存储在文件系统中,但通过数据库管理。
 
每个表允许有若干个普通索引。
 每个表只允许有一个全文索引。
 
当对作为其基础的数据进行插入、更新或删除时,它们自动更新。
 将数据添加到全文索引称为填充,全文索引可通过调度或特定请求来请求,也可以在添加新数据时自动发生。
 
不分组。
 在同一个数据库内分组为一个或多个全文目录。
 
使用 SQL Server 企业管理器、向导或 Transact-SQL 语句创建和除去。
 使用 SQL Server 企业管理器、向导或存储过程创建、管理和除去。
 


 

这些差异使大量管理任务变得不可缺少。全文管理是在几个层次上实施的: 

服务器 

可以对服务器范围的某些属性(如 resource_usage)加以设置,以便增加或减少全文服务所使用的系统资源数量。


说明  全文引擎作为名为 Microsoft 搜索的服务在 Microsoft Windows NT&reg; Server 和 Microsoft Windows&reg; 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)
posted @ 2006-07-12 11:39 yanzhicun 阅读(544) | 评论 (0)编辑 收藏

2006年6月6日

JavaScript实际应用:innerHTMl和确认提示的使用

  今天开发中涉及到对一个层的信息控制,就是控制一个层中显示什么信息,查找资料才知道使用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>


演示:
HTML代码


[Ctrl+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

posted @ 2006-06-06 13:03 yanzhicun 阅读(605) | 评论 (0)编辑 收藏

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 是一月中的第几天,范围为 131
mysql> SELECT DAYOFMONTH('1998-02-03');
        -> 3
DAYOFYEAR(date)
返回 date 是一年中的第几天,范围为 1366
mysql> SELECT DAYOFYEAR('1998-02-03');
        -> 34
MONTH(date)
返回 date 中的月份,范围为 112
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 在一年中的季度,范围为 14
mysql> SELECT QUARTER('98-04-01');
        -> 2
WEEK(date)
WEEK(date,first)
对于星期日是一周中的第一天的场合,如果函数只有一个参数调用,返回 date 为一年的第几周,返回值范围为 053 (是的,可能有第 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 的年份,范围为 10009999
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 的小时值,范围为 023
mysql> SELECT HOUR('10:05:03');
        -> 10
MINUTE(time)
返回 time 的分钟值,范围为 059
mysql> SELECT MINUTE('98-02-03 10:05:03');
        -> 5
SECOND(time)
返回 time 的秒值,范围为 059
mysql> SELECT SECOND('10:05:03');
        -> 3
PERIOD_ADD(P,N)
增加 N 个月到时期 P(格式为 YYMMYYYYMM)中。以 YYYYMM 格式返回值。 注意,期间参数 P不是 一个日期值:
mysql> SELECT PERIOD_ADD(9801,2);
        -> 199803
PERIOD_DIFF(P1,P2)
返回时期 P1P2 之间的月数。P1P2 应该以 YYMMYYYYMM 指定。 注意,时期参数 P1P2不是 日期值:
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 是一个 DATETIMEDATE 值,指定一个日期的开始。expr 是一个表达式,指定从开始日期上增加还是减去间隔值。expr 是一个字符串;它可以以一个 “-” 领头表示一个负的间隔值。type 是一个关键词,它标志着表达式以何格式被解释。 下表显示 typeexpr 参数是如何关联的:
typeexpr期望的格式
SECONDSECONDS
MINUTEMINUTES
HOURHOURS
DAYDAYS
MONTHMONTHS
YEARYEARS
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 值,并且计算的间隔仅仅有 YEARMONTHDAY 部分(没有时间部分),那么返回值也是一个 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 假设你遗漏了间隔值的最左边部分。例如,如果指定一个 typeDAY_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。如果你增加 MONTHYEAR_MONTHYEAR,并且结果日期的天比新月份的最大天数还大,那么它将被调整到新月份的最大天数:
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)
%pAMPM
%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,或者以一个 YYMMDDYYYYMMDD 显示的本地时间:
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
posted @ 2006-06-01 11:55 yanzhicun 阅读(336) | 评论 (1)编辑 收藏

2006年5月23日

54 改变浏览器状态栏文字提示
  1. <script language=”JavaScript”>
  2. window.status “A new status message”;
  3. </script>


55 弹出确认提示框
  1. <script language=”JavaScript”>
  2. var 
  3. userChoice window.confirm(“Click OK or Cancel”);
  4. if (
  5. userChoice) { 
  6. document.write(“You chose OK”);
  7.  } else { 
  8. document.write(“You chose Cancel”);
  9.  }
  10. </script>


56 提示输入
  1. <script language=”JavaScript”>
  2. var 
  3. userName window.prompt(“Please Enter Your Name”,”Enter Your Name Here”);
  4. document.write(“Your Name is “ userName);
  5. </script>


57 打开一个新窗口
  1. //打开一个名称为myNewWindow的浏览器新窗口
  2. <script language=”JavaScript”>
  3. window.open(“http://www.liu21st.com/”,”myNewWindow”);
  4. </script>


58 设置新窗口的大小
  1. <script language=”JavaScript”>
  2. window.open(“http://www.liu21st.com/”,”myNewWindow”,'height=300,width=300');
  3. </script>


59 设置新窗口的位置
  1. <script language=”JavaScript”>
  2. window.open(“http://www.liu21st.com/”,”myNewWindow”,'height=300,width=300,left=200,screenX=200,top=100,screenY=100');
  3. </script>


60 是否显示工具栏和滚动栏
  1. <script language=”JavaScript”>
  2. window.open(“http:


61 是否可以缩放新窗口的大小
  1. <script language=”JavaScript”>
  2. window.open('http://www.liu21st.com/' 'myNewWindow''resizable=yes' );</script>


62 加载一个新的文档到当前窗口
  1. <a href='#' onClick='document.location = '125a.html';' >Open New Document</a>


63 设置页面的滚动位置
  1. <script language=”JavaScript”>
  2. if (
  3. document.all) { //如果是IE浏览器则使用scrollTop属性
  4. document.body.scrollTop 200;
  5.  } else { 
  6. //如果是NetScape浏览器则使用pageYOffset属性
  7. window.pageYOffset 200;
  8.  }
  9. </script>


64 在IE中打开全屏窗口
  1. <a href='#'  onClick=”window.open('http://www.juxta.com/','newWindow','fullScreen=yes');>Open a full-screen window</a>


65 新窗口和父窗口的操作
  1. <script language=”JavaScript”>
  2. //定义新窗口
  3. var newWindow window.open(“128a.html”,”newWindow”);
  4. newWindow.close(); //在父窗口中关闭打开的新窗口
  5. </script>
  6. 在新窗口中关闭父窗口
  7. window.opener.close()


66 往新窗口中写内容
  1. <script language=”JavaScript”>
  2. var 
  3. newWindow window.open(“”,”newWindow”);
  4. newWindow.document.open();
  5. newWindow.document.write(“This is a new window”);
  6. newWIndow.document.close();
  7. </script>


67 加载页面到框架页面
  1. <frameset cols=”50%,*>
  2. <
  3. frame name=”frame1” src=”135a.html”>
  4. <
  5. frame name=”frame2” src=”about:blank”>
  6. </
  7. frameset>
  8. 在frame1中加载frame2中的页面
  9. parent
  10. .frame2.document.location “135b.html”;


68 在框架页面之间共享脚本
如果在frame1中html文件中有个脚本
  1. function doAlert() { 
  2. window.alert(“Frame 1 is loaded”);
  3.  }

那么在frame2中可以如此调用该方法
  1. <body onLoad=”parent.frame1.doAlert();>
  2. This is frame 2.
  3. </body>


69 数据公用
可以在框架页面定义数据项,使得该数据可以被多个框架中的页面公用
  1. <script language=”JavaScript”>
  2. var 
  3. persistentVariable “This is a persistent value”;
  4. </script>
  5. <frameset cols=”50%,*”>
  6. <frame name=”frame1” src=”138a.html”>
  7. <frame name=”frame2” src=”138b.html”>
  8. </frameset>


这样在frame1和frame2中都可以使用变量persistentVariable
70 框架代码库
根据以上的一些思路,我们可以使用一个隐藏的框架页面来作为整个框架集的代码库
  1. <frameset cols=”0,50%,*>
  2. <
  3. frame name=”codeFrame” src=”140code.html”>
  4. <
  5. frame name=”frame1” src=”140a.html”>
  6. <
  7. frame name=”frame2” src=”140b.html”>
  8. </
  9. frameset>

posted @ 2006-05-23 13:46 yanzhicun 阅读(573) | 评论 (1)编辑 收藏

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))
posted @ 2006-04-10 11:12 yanzhicun 阅读(1208) | 评论 (0)编辑 收藏
 
 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
posted @ 2006-04-10 11:09 yanzhicun 阅读(1487) | 评论 (1)编辑 收藏
CALENDER
<2024年4月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用链接

留言簿(1)

随笔档案

文章档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜


Powered By: 博客园
模板提供沪江博客