金沙国际平台登录-金沙国际会员登录

热门关键词: 金沙国际平台登录,金沙国际会员登录

smalldatetime 的值存储为两个 2 字节的整数,datet

废话少说,直接上SQL代码,下面这个查询语句为什么将2008-11-27的记录查询出来了呢?这个是同事遇到的一个问题,个人设计了一个例子。

一、T-SQL概述

SQL Server用于操作数据库的编程语言为Transaction-SQL,简称T-SQL。T-SQL与PL/SQL不同,并没有固定的程序结构。
  T-SQL包括以下4个部分:

  • DDL:定义和管理数据库及其对象,例如create、alter和drop等。
  • DML:实现对数据库表各对象的操作,例如insert、update等。
  • DCL:数据控制语言,实现对数据库进行安全管理和权限管理等控制,例如grant、revoke、deny等。
  • 附加的语言元素。T-SQL的附加语言元素,包括变量、运算符、函数、注释和流程控制语句等。

在T-SQL中,命令和语句的书写是不区分大小写的。

datetime 和 smalldatetime 代表日期和一天内的时间的日期和时间数据类型。 Microsoft SQL Server 用两个 4 字节的整数内部存储 datetime 数据类型的值。第一个 4 字节存储 base date 之前或之后的天数。基础日期是系统参考日期。不允许早于 1753 年 1 月 1 日的 datetime 值。第一个4 字节:1900 年1 月1 日当日为0 ;之前的日期是负数;之后日期是正数。另外一个 4 字节存储以午夜后3 1/3 毫秒数所代表的每天的时间。 smalldatetime 数据类型存储日期和每天的时间,但精确度低于 datetime 。 SQL Server 将 smalldatetime 的值存储为两个 2 字节的整数。第一个 2 字节存储 1900 年 1 月 1 日后的天数。另外一个 2 字节存储午夜后的分钟数。日期范围从1900 年 1 月 1 日到 2079 年 6 月 6 日,精确到分钟。 可以将这两种类型转换成float 浮点数, 其中整数部分就是对应的日期字节, 而小数部分是时间相应的比例, 如datetime 的小数部分就是占整天的毫秒数的比例;smalldatetime 的小数部分就是占整天的分钟数的比例. 因此我们可以直接将这两种类型的变量和整数、浮点数进行直接的加减。 datetime 从 1753 年 1 月 1 日到 9999 年 12 月 31 日的日期和时间数据,精确度为百分之三秒。如下表所示,把值调整到 .000 、.003 、或 .007 秒的增量。 示例 调整后的示例 01/01/98 23:59:59.999 1998-01-02 00:00:00.000 01/01/98 23:59:59.995,01/01/98 23:59:59.996, 01/01/98 23:59:59.997, 或01/01/98 23:59:59.998 1998-01-01 23:59:59.997 01/01/98 23:59:59.992, 01/01/98 23:59:59.993, 01/01/98 23:59:59.994 1998-01-01 23:59:59.993 01/01/98 23:59:59.990 或01/01/98 23:59:59.991 1998-01-01 23:59:59.990 我们常常需要搜索指定日期范围内的数据, 比如返回1998-01-01 当天内的数据, 你可能会这样写: date = ‘1998-01-01 00:00:00.000' and date = ‘1998-01-01 23:59:59.999 ' 根据上面的调整规则, 其实这句语句的实际搜索范围为: date = ‘1998-01-01 00:00:00.000' and date = ‘1998-01-02 00:00:00.000 ' 你会看到这包括了1998-01-02 的数据, 所以最好的正确的搜索语句为: date = ‘1998-01-01 00:00:00.000' and date ‘1998-01-02 00:00:00.000 ' smalldatetime 从 1900 年 1 月 1 日到 2079 年 6 月 6 日的日期和时间数据精确到分钟。29.998 秒或更低的 smalldatetime 值向下舍入为最接近的分钟,29.999 秒或更高的 smalldatetime 值向上舍入为最接近的分钟。 --returns time as 12:35 SELECT CAST('2000-05-08 12:35:29.998' AS smalldatetime) GO --returns time as 12:36 SELECT CAST('2000-05-08 12:35:29.999' AS smalldatetime) GO 赋值: 上面说了时间的实际格式,我们在给一个时间变量赋值时肯定不会赋一个浮点数给该变量,更多的情况是我们给这个变量赋一个字符串,系统会自动将字符串变成时间格式并保存到数据库中。若字符格式错误,则报错。根据语言不同,世界上有多种不同的用字符串表示时间方式,我们可以通过 sp_helplanguage 查看不同语言下的缺省时间格式,如简体中文的时间格式为 ymd ,可以通过 SET DATEFORMAT 来暂时更改这个缺省值。 时间函数 DATEADD :可以对时间类型的指定部分进行加减计算,虽然我们上面说了可以进行直接的加减,但是我们可以更方便的利用这个函数对指定部分,如年月日时分秒等进行加减。我们常常根据一个时间来构造出另外一个时间,比如下个月的今天 , 本月底等等,我们应该也尽量使用 DATEADD 函数来构造,它可以避免一些闰月、年底、月底之类的错误,我以前就是根据 DATENAME 来构造的,常常要考虑这些问题。 DATEDIFF :该函数对两个时间变量对指定部分进行比较计算。此函数不考虑比指定日期部分更高的粒度级别,它只考虑更低级别的部分。对时间的比较应尽量使用本函数。 举个出错的例子:返回两个时间变量的小时差。若使用 DATEPART(HOUR, @T2 - @T1) 就可能会出错;你应该使用 DATEDIFF(HOUR, @T1, @T2) 。 DATEPART :返回时间变量的指定部分的值。 DATENAME :返回时间变量的指定部分的值,和 DATAPART 不同的是本函数返回的是个字符串类型 GETDATE() 返回本机器的当前时间。 CURRENT_TIMESTAMP 变量与本函数功能相同。 GETUTCDATE() 返回本机器的当前 UTC 时间。

USE AdventureWorks2014;GOSELECT * FROM [Person].[Person]WHERE ModifiedDate = '2008-11-26 00:00:00:000' AND ModifiedDate = '2008-11-26 23:59:59.999'

二、T-SQL编程基础

其实如果细看过文档的话,应该知道是什么原因,因为数据类型Datetiem的时间范围:00:00:00 到 23:59:59.997 , 最后部分的范围为0 ~997,官方文档提示,datetime的秒的小数部分精度的有舍入,具体请见下面

1、标识符

①T-SQL规则标识符

  • 由字母、数字、下划线、@、#、$符号组成,其中字母可以是a-z或A-Z,也可以是来自其他语言的字母字符。
  • 首字符不能为数字和$。
  • 标识符不允许是T-SQL保留字。
  • 标识符内不允许有空格和特殊字符
  • 长度小于128

②界定标识符
  对于不符合标识符规则的标识符,则要使用界定符方括号([])或双引号(“”)将标识符括起来。如标识符[My Table]、“select”内分别使用了空格和保留字select。

datetime 秒的小数部分精度的舍入

2、数据类型

在SQL Server中提供了多种系统数据类型。除了系统数据类型外,还可以自定义数据类型。

①系统数据类型

(1)精确数字数据类型

  • int
      存储整型数值,存储数值范围为-231~231-1。
  • bigint
      bigint比int能存储更大的数值,存储数值范围为-263~263-1。
  • smallint
      数据类型的范围数值比int更小,在-215~215-1之间。定义这种数据类型的时候一定要小心,要确定存储的数据不会超过smallint所能存储的数值范围。
  • tinyint
      数据类型的范围数值比smallint更小,存储从 0 到 255 的整型数据。
  • decimal/numeric
      decimal[(p,s)]和numeric[(p,s)]这两种数据类型用于存储相同精度和范围的数据(小数点的左、右两边存储的数值位数相同),所能存储的数值范围为-1038+1~1038-1。
      p表示指定小数点左边和右边可以存储的十进制数字的最大个数,s指定小数位数。[(p,s)]的范围为1≤p≤38,0≤s≤p。若省略s,则默认为0;若未附带p及s,则numeric表示numeric(18),只能表示整数

(2)近似数字数据类型

  • float
      存储小数点不固定的数值,存储的数值范围。为-1.79E+308~1.79E+308。
  • real
      与float非常相似,存储数值范围为-3.40E+38~3.40E+38。

(3)货币数据类型

  • money
  • smallmoney

(4)字符数据类型

  • char
      长度固定,最多可以定义8000个字符。如果定义一个列为char(n),则将存储n个字符。当输入少于定义的字符数时,剩余的长度将被在右边的空格填满。
  • nchar
      与char类型相似,但最多可以定义4000个字符,使用Unicode编码。
  • varchar
      与char一样,用于存储字母数字数据,最多可定义8000个字符。二者不同之处在于varchar的每一行可以有不同的字符数,最大字符数未定义的最大长度。例如列定义为varchar(50),则该列数据最多可以有50个字符长。然而,如果列中只存储了3个字符长的字符串,则只会使用3个字符的存储空间。如果定义列时没有指定大小,即varchar(),则其长度默认为1。
      特别,varchar(max)可以定义超过8000个字符的字符串数据类型,最多1073741824个字符。【注意不是varchar(n)】
  • nvarchar
      定义方式与varchar相似,除了nvarchar使用Unicode格式存储字符。

(3)日期和时间数据类型

  • date
      仅用来存储日期,其范围从0001年1月1日到9999年12月31日。date数据类型的格式是YYYY-MM-DD。
  • time
      只存储基于24小时制的时间,其格式为hh:mm:ss[.nnnnnnn]。与date数据类型类似,为了给要存储在列中的数据提供准确的数据类型,能存储精确度达100纳秒的数据。
  • datetime
      用于存储从1753年1月1日到9999年12月31日之间的任何日期和时间。datetime不仅存储日期,而且会在日期的旁边存储时间。如果只像定义为datetime的列存入日期,则会在存储的日期中加入默认的时间12:00:00。
  • datetime2
      与datetime类似,datetime2用于存储日期和时间。不同之处是,datatime2的数据类型秒的小数部分的精度更高。此外,该数据类型能存储从0001年1月1日到9999年12月31日的日期。其格式为YYYY-MM-DD hh:mm:ss[.nnnnnnn]。
  • smalldatetime
      与datetime十分相似,除了smalldatetime可存储的数值范围是从1900年1月1日到2079年6月6日。该数值范围的结束日期不是月末。

(4)二进制数据类型

  • binary
      存储固定大小的二进制个十数据,最多可存储8000字节。
      这种数据类型主要用于存储作为标记或标记组合的数据。例如存储关于客户的标记。需要了解客户是否处于活动状态(值为1)、最近一个月有无消费记录(值为2)、最后一个月的消费额是否超过1000元(值为4)或者是否按时销账(值为8)。这将向数据库中加入4个数据列。然而,若使用binary值,如果客户有一个值为1101的二进制值,那么该客户拥有的值为1+4+8,这表明客户是活动的。最后一个月的消费额超过1000元并按时销账。
  • varbinary
      与binary十分相似,但是varbinary每一行的物理列大小随存储的值而不同。varbinary(max)能存储长度超过8000个字符的数据,最多可存储2GB,可用于存储类似图像这样的数据。

(5)专用数据类型

  • bit
      该数据类型存储的值为0或1.通常用于判定真假值。
  • uniqueidentifier
      用于存储16位全局唯一标识符(UUID)。
  • XML

②程序中的数据类型
(1)cursor
  数据能够以驻留内存的状态进行存储。游标,与表类似,有数据行和列,但它们的相似之处仅限于此。不同之处如:游标没有索引。通过使用游标来建立数据集,以便一次处理一行数据。

(2)table
  table数据类型与游标和表有几分相似之处。该数据类型用于存储行和列的数据,但不能在数据上建索引。此时,系统可以“一次处理一个数据集”的数据,就想处理一个标准的表那样。

(3)sql_varint
  可以根据存储的数据改变数据类型,即用来存储一些不同类型的数据类型。不过强烈不推荐使用这种数据类型。

如下表所示,将 datetime 值舍入到 .000、.003、或 .007 秒的增量 。

3、表达式

表达式常指由常量、变量、函数等通过运算符按一定的规则连接起来的有意义的式子。

1.变量
  T-SQL的变量分为局部变量和全局变量。
(1)局部变量
  局部变量由用户定义,一般出现在批处理、存储过程和触发器中,其作用范围仅在程序内部。
  局部变量必须先声明,后使用。T-SQL还为局部变量提供了赋值语句。
  ①declare变量声明语句,其语法格式为:

declare @变量1 [as] datatype,@变量2 [as] datatype...
  • 局部变量名称必须以@开始开头
  • as可以省略
  • 赋初值NULL

局部变量的赋值有三种方式:
  ①在变量定义的时候对其赋值:

declare @变量1 [as] datatype = value,@变量2 [as] datatype = value...

②select赋值语句,其语法格式为:

select @变量1 = 表达式1,@变量2 = 表达式2...
  • 用select命令可以一次给多个变量赋值
  • 表达式可以为普通的value,也可以为查询结果
  • 当表达式为表的列名时,形式与普通查询中使用列别名的用法类似。可以使用子查询从表中一次返回多个值。如果查询的结果为多行,则只会把最后一行的相应列值赋给变量,这与PL/SQL的处理方式不同,在PL/SQL中,不允许把多行查询结果赋值给变量

③set赋值语句,其语法格式为:

set @变量 = 表达式
  • 基本用法和select一样,区别在于一条set赋值语句只能给一个变量赋值,而一条select语句可以给多个变量赋值

【示例】

declare @sumsal as numeric(10,2),@dno as tinyint
select @dno = deptno,@sumsal = sum(sal) 
from emp 
where deptno = 10
group by deptno
print cast(@dno as varchar)+':'+cast(@sumsal as varchar)

(2)全局变量
  全局变量由SQL Server系统定义,通常用来跟踪服务器范围和特定会话期间的信息,不能被用户显式地定义和赋值。可以通过访问全局变量来了解系统目前的一些状态信息。
  全局变量名以@@开头。下面给出一些常用的全局变量。

全局变量 说明
@@error 上一条SQL语句报告的错误号
@@nestlevel 当前存储过程或触发器的嵌套级别
@@rowcount 上一条SQL语句处理的行数
@@servername 本地服务器名称
@@identity 最后插入的标识值
@@spid 当前用户进程的会话id
@@fetch_status 上一条游标fetch语句的状态
@@cpu_busy SQL Server自上次启动后的时间状态

2.函数
  函数是用来完成某种特定功能,并返回处理结果的一组T-SQL语句,处理结果成为“返回值”,处理过程成为“函数体”。
  函数又分为系统内置函数和用户自动以函数。SQL Server提供了大量系统内置函数,主要可以分为以下几类:数学函数、字符串函数、日期函数、convert函数、聚合函数。
  (1)数学函数
  T-SQL中提供的常用的数学函数如下:

  • abs():返回绝对值
  • round(数值表达式,长度,[,类型]):舍入到指定长度或精度。类型为0,表示舍入,类型为非0,表示截断
  • power(m,n):返回m的n次幂
  • trunc():将数字截断到指定的位数
  • %:求余数,SQL Server没有mod(m,n),而用m%n代替

(2)字符串函数

  • ltrim(str,substr)/rtrim(str,substr):str表示要操作的字符串,substr表示要裁剪的子串,若裁剪空格,则可以省略
  • substring(str,position,length):求子字符串
  • replace(str,search_str,rep_str):替换一个字符串中的子串。search_str表示要搜索的子字符串,rep_str表示要替换的目标字符串
  • left(str,n):返回字符串从左边开始的指定个数的字符
  • len():求字符串长度

(3)日期和时间函数
  首先列出日期时间函数中的重要参数。

日期时间元素 缩写 含义
year yy,yyyy
month m,mm
day d,dd
dayofyear dy 年的天数
week wk 星期数
weekday dw 星期几
hour hh
minute mi
quarter qq
second ss
millisecond ms 毫秒

T-SQL中提供下列日期函数:

  • getdate():返回当前的日期和时间
  • year(日期):返回指定日期的“年”部分的整数
  • month(日期):返回指定日期的“月”部分的整数
  • day(日期):返回指定日期的“日”部分的整数
  • datepart(日期元素,日期):返回日期元素指定的日期部分的整数
  • datename(日期元素,日期):以字符串的形式返回日期元素指定时间的日期名称
  • datediff(日期元素,日期1,日期2):返回两个日期间的差值并将其转换为指定日期元素的形式
  • dateadd(日期元素,数值,日期) :按照“日期元素”给定的日期单位,返回“日期”加上“数值”的新日期

涉及日期时间常量时,SQL Server建议使用与dateformat及语言环境设置无关的字符串格式,通常这样的字符串常量符合下面两种形式:

  • 日期之间不使用分隔符,格式为yyyymmdd[ hh:mi:[:ss][,mmm]],如'20070703','20070703 17:53:00.997'。
  • ISO 8601标准形式,格式为yyyy-mm-ddThh:mi:ss[.mmm],日期各个部分之间使用“-”分隔符,日期和时间部分用T分隔,并且时间部分不能省略,如'2007-07-03T17:53:10'。

(4)数据类型转换函数
  转换的方式有隐式转换和显式转换两种。
  隐式转换是SQL Server自动地将数据从一种数据类型转换为另一种数据类型,用户不可见。
  显式转换使用convert函数,该函数可以将一种数据类型的表达式强制转换为另一种数据类型的表达式。两种数据类型必须能够进行转换,例如,char值可以转换为binary,但不能转换为image。该函数的主要作用是把数值型或日期型数据转换为字符串,而只包含数字的字符串转换为数值型数据一般隐式转换。
  格式:convert(数据类型(长度),表达式[,n])
  函数的第4个参数n是可选的,用于日期时间型数据类型和字符数据类型转换。参数取值如下表所示。

不带世纪数位 带世纪数位 格式
1 101 mm/dd/yyyy
2 102 yy.mm.dd
3 103 dd/mm/yyyy
4 104 dd.mm.yy
5 105 dd-mm-yy
8 108 hh:mi:ss
20或120 yyyy-mm-dd hh:mi::ss(24h)

【示例】

select ename+''''+'s sal is'+convert(char(7),sal) as 'EMPLOYEE'S SAL' from emp;

select cid as '客户ID',cname as '客户名称'
   convert(char(10),cRegisterationDate,102) as '注册日期'
from customer;

最终显示的日期格式就会如2006.12.02

3.运算符
算术运算符:+、-、*、/、%(求余)
字符串运算符:+(连接)
比较运算符:=、>、>=、<、<=、<>(不等于)、!>(不大于)、!<(不小于)
逻辑运算符:NOT、AND、OR、ALL(所有)、ANY(或SOME,任意一个)、BETWEEN...AND、EXISTS(存在)、IN(在范围内)、LIKE(匹配)
按位运算符:&(位与)、|(位或)、^(按位异或)
一元运算符:+(正)、-(负)、~(按位取反)
赋值运算符:=(等于)

本文由金沙国际平台登录发布于金沙国际平台登录,转载请注明出处:smalldatetime 的值存储为两个 2 字节的整数,datet

您可能还会对下面的文章感兴趣: