`
xuyuanshuaaa
  • 浏览: 394889 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

MS SQL Server中DATETIME类型数据的处理

阅读更多
通过函数GETDATE(),你可以获得当前的日期和时间。函数GETDATE()可以用来作为DATEDIME型字段的缺省值。这对插入记录时保存当时的时间是有用的。要建立一个表,其中的记录包含有当前的日期和时间,可以添加一个DATETIME型字段,指定其缺省值为函数GETDATE()的返回值,就象这样:

CREATE TABLE site_log (
       username VARCHAR(40),
       useractivity VARCHAR(100),
       entrydate DATETIME DEFAULT GETDATE())

转换日期和时间
函数GETDATE()的返回值在显示时只显示到秒。实际上,SQL Sever内部时间可以精确到毫秒级(确切地说,可以精确到3.33毫秒)。
要得到不同格式的日期和时间,你需要使用函数CONVERT()。例如,当下面的这个语句执行时,显示的时间将包括毫秒:

SELECT CONVERT(VARCHAR(30),GETDATE(),9)

注意例子中数字9的使用。这个数字指明了在显示日期和时间时使用哪种日期和时间格式。当这个语句执行时,将显示如下的日期和时间:
Nov 30 1997 3:29:55:170AM
(1 row(s) affected)

在函数CONVERT()中你可以使用许多种不同风格的日期和时间格式。下表显示了所有的格式。

日期和时间的类型:
类型值               标准               输出
   0                 Default           mon dd yyyy hh:miAM
   1                 USA               mm/dd/yy
   2                 ANSI              yy.mm.dd
   3                 British/French    dd/mm/yy
   4                 German            dd.mm.yy
   5                 Italian           dd-mm-yy
   6                 -                 dd mon yy
   7                 -                 mon dd,yy
   8                 -                 hh:mi:ss
   9                        Default + milliseconds--mon dd yyyy
hh:mi:ss:mmmAM(or )
   10                USA              mm-dd-yy
   11                JAPAN            yy/mm/dd
   12                ISO              yymmdd
   13                Europe           Default + milliseconds--dd mon yyyy
                                       hh:mi:ss:mmm(24h)
   14                 -                hh:mi:ss:mmm(24h)

   类型0,9,和13总是返回四位的年。对其它类型,要显示世纪,把style值加上100。类型13和14返回24小时时钟的时间。类型0,7,和13返回的月份用三位字符表示(用Nov代表November).

对表中所列的每一种格式,你可以把类型值加上100来显示有世纪的年(例如,00年将显示为2000年)。例如,要按日本标准显示日期,包括世纪,你应使用如下的语句:

SELECT CONVERT(VARCHAR(30),GETDATE(),111)

    在这个例子中,函数CONVERT()把日期格式进行转换,显示为1997/11/30

抽取日期和时间
在许多情况下,你也许只想得到日期和时间的一部分,而不是完整的日期和时间。为了抽取日期的特定部分,你可以使用函数DATEPART(),象这样:

SELECT site_name ‘Site Name’,
DATEPART(mm,site_entrydate) ‘Month Posted’ FROM site_directory

函数DATEPART()的参数是两个变量。第一个变量指定要抽取日期的哪一部分;第二个变量是实际的数据。在这个例子中,函数DATEPART()抽取月份,因为mm代表月份。下面是这个SELECT 语句的输出结果:

Site Name                         Month Posted
………………………………………………………………
Yahoo                              2
Microsoft                          5
Magicw3                            5
(3 row(s) affected)

   Month Posted列显示了每个站点被查询的月份。函数DATEPART()的返回值是一个整数。你可以用这个函数抽取日期的各个不同部分,如下表所示。

日期的各部分及其简写
日期部分           简写               值
year                yy                1753--9999
quarter             qq                1--4
month               mm                1--12
day of year         dy                1--366
day                 dd                1--31
week                wk                1--53
weekday             dw                1--7(Sunday--Saturday)
hour                hh                0--23
minute              mi                0--59
second              ss                0--59
milisecond          ms                0--999

当你需要进行日期和时间的比较时,使用函数DATEPART()返回整数是有用的。但是,上例中的查询结果(2,5)不是十分易读。要以更易读的格式得到部分的日期和时间,你可以使用函数DATENAME(),如下例所示:

SELECT site_name ‘Site Name’
DATENAME(mm,site_entrydate) ‘Month Posted’
FROM site_directory

函数DATENAME()和函数DATEPART()接收同样的参数。但是,它的返回值是一个字符串,而不是一个整数。下面是上例该用DATENAME()得到的结果:

Site Name                           Month Postec
………………………………………………………………….
Yahoo                               February
Microsoft                           June
Magicw3                             June
(3 row(s) affected)

你也可以用函数DATENAE()来抽取一个星期中的某一天。下面的这个例子同时抽取一周中的某一天和日期中的月份:

SELECT site_name ‘Site Name’,
DATENAME(dw,site_entrydate)+ ‘-’ + DATENAME(mm,site_entrydate)
         ‘Day and Month Posted’ FORM  site_directory

这个例子执行时,将返回如下的结果:

Site Name                       Day and Month Posted
………………………………………………………………………
Yahoo                           Friday - February
Microsoft                       Tuesday - June
Magicw3                         Monday - June
(3 row(s) affected)

返回日期和时间范围
当你分析表中的数据时,你也许希望取出某个特定时间的数据。你也许对特定的某一天中――比如说2000年12月25日――访问者在你站点上的活动感兴趣。要取出这种类型的数据,你也许会试图使用这样的SELECT语句:

SELECT * FROM weblog WHERE entrydate="12/25/20000"

不要这样做。这个SELECT语句不会返回正确的记录――它将只返回日期和时间是12/25/2000 12:00:00:000AM的记录。换句话说,只有刚好在午夜零点输入的记录才被返回。

问题是SQL Sever将用完整的日期和时间代替部分日期和时间。例如,当你输入一个日期,但不输入时间时,SQL Sever将加上缺省的时间“12:00:00:000AM”。当你输入一个时间,但不输入日期时,SQL Sever将加上缺省的日期“Jan 1 1900”。
要返回正确的记录,你需要适用日期和时间范围。有不止一种途径可以做到这一点。例如,下面的这个SELECT 语句将能返回正确的记录:

SELECT * FROM weblog
WHERE  entrydate>=”12/25/2000” AND entrydate<”12/26/2000”

这个语句可以完成任务,因为它选取的是表中的日期和时间大于等于12/25/2000 12:00:00:000AM并小于12/26/2000 12:00:00:000AM的记录。换句话说,它将正确地返回2000年圣诞节这一天输入的每一条记录。
另一种方法是,你可以使用LIKE来返回正确的记录。通过在日期表达式中包含通配符“%”,你可以匹配一个特定日期的所有时间。这里有一个例子:

SELECT * FROM weblog WHERE entrydate LIKE ‘Dec 25 2000%’

这个语句可以匹配正确的记录。因为通配符“%”代表了任何时间。
使用这两种匹配日期和时间范围的函数,你可以选择某个月,某一天,某一年,某个小时,某一分钟,某一秒,甚至某一毫秒内输入的记录。但是,如果你使用LIKE 来匹配秒或毫秒,你首先需要使用函数CONVERT()把日期和时间转换为更精确的格式(参见前面“转换日期和时间”一节)。

比较日期和时间
最后,还有两个日期和时间函数对根据日期和时间取出记录是有用的。使用函数DATEADD()和DATEDIFF(),你可以比较日期的早晚。例如,下面的SELECT语句将显示表中的每一条记录已经输入了多少个小时:

SELECT entrydate ‘Time Entered’
DATEDIFF(hh,entrydate,GETDATE()) ‘Hours Ago’ FROM weblog

如果当前时间是2000年11月30号下午6点15分,则会返回如下的结果:

Time Entered                Hours Ago
…………………………………………………..
Dec 30 2000  4:09PM          2
Dec 30 2000  4:13PM          2
Dec 1 2000  4:09PM           698
(3 row(s) affected)

函数DADEDIFF()的参数是三个变量。第个变量指定日期的某一部分。在这个例子中,是按小时对日期进行比较,(要了解日期各部分的详细内容,请参考表11.2)在日期2000年11月1日和2000年11月30日的指定时间之间有689个小时。另外两个参数是要进行比较的时间。为了返回一个正数,较早的时间应该先给。
函数DATEADD()把两个日期相加。当你需要计算截止日期这一类的数据时,这个函数是有用处的。假如你要查询一个月前注册用户的记录,你可以使用如下的SELECT语句:

SELECT username ‘User Name’,
DATEADD(mm,1,firstvisit_date) ‘Registration Expires’
FROM registration_table

函数DATEADD()的参数有三个变量。第一个变量代表日期的某一部分,这个例子用到了代表月份的mm。第二个变量指定了时间的间隔――在本例中是一个月。最后一个变量是一个日期,在这个例子中,日期是取自DATETIME型字段firstvisit_date.假设当前日期是June 30,2000,这个语句将返回如下的内容:

User Name                         Registration Expires
……………………………………………………………………………
Bill Gates                        Jul 30 2000  4:09PM
President Clinton                 Jul 30 2000  4:13PM
William Shakespeare               Jul 1 2000  4:09PM
(3 row(s) affected)

注意:
使用函数DATEADD()把一个日期加上一个月,它并不加上30天。这个函数只简单地把月份值加1。
分享到:
评论

相关推荐

    PostgreSQL 与 MS SQLServer在过程语言中的差异

    PostgreSQL 与 MS SQLServer 在过程语言中的差异 PostgreSQL 和 MS SQL Server 是两种流行的关系数据库管理系统,它们在过程语言中有许多差异。下面我们将从数据类型、变量定义与赋值、IF/ELSE 控制结构等方面对这...

    PostgreSQL_与_MS_SQLServer比较

    - **MS SQL Server** 中使用 `TRY...CATCH` 结构来捕获并处理异常。 - **PostgreSQL** 中使用 `BEGIN...EXCEPTION` 结构来处理异常情况。 #### LIKE 条件语句 - 两者都支持使用 `LIKE` 进行模式匹配,但语法稍有...

    sqlserver自动生成sql语句工具sqlserver转oracle

    1. 数据类型映射:SQL Server和Oracle的数据类型可能存在差异,如SQL Server的`datetime`对应Oracle的`timestamp`,`varchar2`对应`nvarchar2`等,工具会自动进行转换,但也可能需要手动调整。 2. 函数和过程转换:...

    MS SQL Server中大数据量表的查询优化

    在MS SQL Server环境中如何有效处理记录条数超过2000万且每日增加20万条的数据表,这是许多开发人员面临的挑战。本文将通过实际案例来探讨这个问题,并提供一种解决方案,同时也讨论了该方案可能带来的问题及适用...

    MS SQL SERVER 分区表

    分区表是MS SQL SERVER中的一种高级存储技术,设计用于管理和优化大规模数据存储。它的主要目标是提升大型表(数据量巨大,如2000万条记录或2GB容量)的可伸缩性和可管理性,以及针对不同访问模式的性能。访问模式指...

    MS SQL Server简明教程

    2. **数据类型**:了解SQL Server 2005支持的各种数据类型,如整数类型(INT)、小数类型(DECIMAL)、字符类型(VARCHAR)、日期/时间类型(DATETIME)等。 3. **T-SQL语法**:掌握基本的SELECT、INSERT、UPDATE、...

    从sqlserver数据库到MYSQL数据库转换操作指南

    在数据库转换过程中,我们需要将 SQL Server 数据库中的数据类型映射到 MySQL 数据库中。Kettle 提供了多种数据类型映射方式,包括: * 字符串类型:从 SQL Server 的 VARCHAR 到 MySQL 的 VARCHAR * 数值类型:从 ...

    MS-SQL Server热点话题30问

    随着企业数据量的不断增长和业务需求的复杂化,MS-SQL Server在实际应用中可能会遇到各种问题,本文档根据51CTO论坛上MS-SQL Server版块的热点问题,整理出30个典型问题,为大家的讨论和参考提供方便。 1. SQLSA...

    PHP实现SQL_Server数据导入到Mysql数据库

    在从SQL Server迁移到MySQL的过程中,需要注意数据类型的兼容性问题。例如,如果SQL Server中的日期字段类型为`datetime`,而在MySQL中使用的是`DATE`或`DATETIME`类型,则需要确保在导入过程中进行适当的转换。 ##...

    彻底解决MS SQL Server2000中最大流水号的生成问题.pdf

    MS SQL Server 2000 中最大流水号的生成问题解决方案 MS SQL Server 2000 是一个功能强大的关系数据库管理系统,它广泛应用于各种企业级应用系统中。然而,在实际应用中,MS SQL Server 2000 中最大流水号的生成...

    Microsoft SQL Server 2005 Express Edition SP3

    由于未在 Windows 中完全配置 Microsoft 分布式事务处理协调器 (MS DTC),因此,应用程序可能无法在分布式事务中登记 SQL Server Express 资源。此问题会影响使用分布式事务的链接服务器、分布式查询以及远程存储...

    MS SQLServer数据库结构读取工具

    3. **数据类型**:数据类型定义了数据库中字段可以存储的数据种类,如整数(INT)、字符(VARCHAR)、日期时间(DATETIME)、布尔(BIT)等。选择合适的数据类型能确保数据的正确性和存储效率。 4. **长度**:字段...

    SQL语句转换(delphi与MS SQL语句进行转换)

    1. **数据类型转换**:Delphi和MS SQL Server支持的数据类型可能有所不同,比如DateTime在Delphi中和SQL Server中的表示方式就不同。转换工具需要识别这些类型并进行适配。 2. **函数转换**:两者都有各自特有的...

    SqlServer日期处理函数

    SqlServer 提供了一系列强大的日期处理函数,这些函数可以帮助开发者和数据库管理员高效地操作日期和时间数据。本文档将详细介绍几个常用的日期处理函数及其应用场景,并通过具体实例加深理解。 #### 常用日期处理...

    MS-SQL Server2000数据库程序设计官方习题

    SQL Server 2000支持多种数据类型,如数值类型(INT、FLOAT、DECIMAL)、字符类型(VARCHAR、NVARCHAR)、日期时间类型(DATETIME)、二进制类型(BINARY、VARBINARY)等。了解每种数据类型的特性,有助于正确设计...

    主流数据库数据类型的比较

    本篇文章将详细比较主流数据库——Oracle、MySQL、DB2和MS SQL Server之间的数据类型差异。 1. **整数类型** - MySQL提供了多种整数类型,如tinyint、smallint、mediumint、int、integer、bigint,其中tinyint适合...

    SQL Server与Access的函数对比

    在数据库管理领域,SQL Server和Access都是常用的数据库系统,但它们在处理数据和函数功能上存在一定的差异。本文将深入探讨这两个系统在日期时间函数方面的区别。 首先,我们来看看获取当前时间的函数。在SQL ...

    SQL SERVER 2008 新特性 英文版

    新增的日期时间数据类型如DATE、TIME、DATETIME2等,以及相关函数,提供了更精确的时间戳处理能力和更好的国际标准兼容性。 ### 大型用户定义类型(Large UDTs) 大型用户定义类型(Large UDTs)的引入,使得可以...

    MS - Microsoft SQL Server 2008 T-SQL Fundamentals (2008.10).

    1. **数据类型**:了解SQL Server 2008中的各种数据类型,如数值类型(整型、浮点型)、字符类型(VARCHAR、NVARCHAR)、日期/时间类型(DATETIME、SMALLDATETIME)以及二进制类型(BINARY、VARBINARY)。...

    MS-sql、Oracle、Mysql、Informix数据类型集锦

    MS-SQL(Microsoft SQL Server)提供了多种数据类型,以满足各种数据存储需求: 1. **bit**:用于存储二进制值,如布尔类型,0代表False,1代表True,NULL代表未知。 2. **int、smallint、tinyint**:整数类型,...

Global site tag (gtag.js) - Google Analytics