SQL Server时间格式浅析

server

 
 

SQL Server时间格式浅析

 

数据库中时间日期往往是一个很重要的数据。各个计算机上的时间往往不同,为了在数据库中插入统一的时间,如果是取当前时刻,最好直接从数据库服务器读取。比如有一个表名为tablename的表格,其中columnname字段是当前记录插入时的当前时间,则该插入语句应写为:insert into table name (columnname,…) values (GetDate(),…)。这样GetDate()函数将数据库服务器的当前时间插入该记录中。

在查找所有当天的记录前,先来分析一下T-SQL的时间日期表示方式。在T-SQL中,时间日期格式数据类型实际上是一个浮点数类型,记录的是当前时间到1900年1月1日0时的天数,加上剩余的时间化成小数。下面的语句:

select getdate() as 当前时间,cast(getdate() as float) as 距1900年1月1日天数

将返回:

 

当前时间                        距1900年1月1日天数

--------------------------- -----------------------------------------------------

2001-11-10 11:05:35.733                        37203.462219135799

 

(1 row(s) affected)

 

所以要查找当天插入的记录,理所应当的会想到用GetDate()获取两个当前时间,并将前一个用Convert或Cast函数转换为整数(记为IntToday),将后一个转换为浮点数(记为FloatNow),再将需要查找的记录日期也转换为浮点数(记为FloatCheck),只要使用条件”…where FloatCheck between IntToday and FloatNow”就可以找出哪些时间是属于今天的时间。现在看起来确实如此。

表格testtable有三个字段,id是一个自动增长的主键,inserttime是记录插入时刻的时间,comment字段是为了方便观察设立的。该表格中共有四条记录,前两条记录是11月9日插入的,后两条是11月10日插入的。

第一条SQL语句返回该表格中的所有记录。

select * from testtable

 

id                    inserttime                              comment

------------ -------------------------------------- --------------------------------------------

1                   2001-11-09 10:28:42.943                    第一条记录

2                   2001-11-09 17:43:22.503                    第二条记录

3                   2001-11-10 11:29:11.907                     第三条记录

4                   2001-11-10 11:29:51.553                    第四条记录

 

(4 row(s) affected)

 

下面的语尝试选出今天(2001年11月10日)插入的记录,该语句执行时的数据库服务器时间是2001-11-10 11:40:57.800

 

select * from testtable where cast(inserttime as float) between cast(GetDate() as int) and cast(GetDate() as float)

 

id                    inserttime                              comment

------------ -------------------------------------- --------------------------------------------

3                   2001-11-10 11:29:11.907                     第三条记录

4                   2001-11-10 11:29:51.553                    第四条记录

(2 row(s) affected)

 

这条语句成功地过滤了前一天产生的记录。

现在地11点51分,午餐时间到了,我要等一会再继续工作。

12点26分,开始工作前让我先欣赏一下自己的“杰作”。可是,出问题了,那条用来过滤的语句什么也没有返回。去掉where子句再执行,原来的记录还在。也就是说数据库里的记录不再满足条件了。没有别的办法,让我们来看看条件发生了什么变化。

执行语句:

select cast(inserttime as float) as FloatCheck,cast(GetDate() as int) as IntToday,cast(GetDate() as float) as FloatNow from testtable

结果返回:

 

FloatCheck                      IntToday                              FloatNow

-----------------------------------------------------------------------------------

3702.43660814043                    37204                   3703.524545756176

3702.728274807101                   37204                   3703.524545756176

3703.478610030863                   37204                   3703.524545756176

3703.479068904322                   37204                   3703.524545756176

 

(4 row(s) affected)

 

注意到IntToday比FloatNow大,这就是条件不再满足的原因。原来cast()函数并不简单地去掉小数,而是四舍五入,所以下午(cast(GetDate() as int))返回的值比上午返回的要大1。在程序中不可能先判断上午和下午再选择SQL语句执行,因此有必要对GetDate()返回的值做一下数学上的处理。注意到cast(GetDate() as int)当天下午返回的值和前一天下午返回的值一样大,我的办法是先将GetDate()值减去0.5。这样如果是上午,减去0.5后变为前一天的下午,小数部分“入”,如果是下午,减去0.5后变为当天上午,小数部分“去”。写成的新语句如下:

select * from testtable where cast(inserttime as float) between cast(GetDate()-0.5 as int) and cast(GetDate() as float)

执行结果正常。

另外,事实上float(也可能是real)数据类型是DateTime数据类型的基本类型,所以它们之间可以透明地比较,也就是说不必进行转换就能直接比较,像这样:

select * from testtable where inserttime between cast(GetDate()-0.5 as int) and GetDate()

我先前做的转换只是为了方便说明。

时间: 2025-01-23 12:03:31

SQL Server时间格式浅析的相关文章

Sql server时间格式

  Sql server时间格式convert Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AM Select CONVERT(varchar(100), GETDATE(), 1): 05/16/06 Select CONVERT(varchar(100), GETDATE(), 2): 06.05.16 Select CONVERT(varchar(100), GETDATE(), 3): 16/05/06 Sele

Sql日期时间格式转换

原文:Sql日期时间格式转换 sql server2000中使用convert来取得datetime数据类型样式(全) 日期数据格式的处理,两个示例: CONVERT(varchar(16), 时间一, 20) 结果:2007-02-01 08:02/*时间一般为getdate()函数或数据表里的字段*/ CONVERT(varchar(10), 时间一, 23) 结果:2007-02-01 /*varchar(10)表示日期输出的格式,如果不够长会发生截取*/ 语句及查询结果:Select C

SQL SERVER时间格式化

原文:SQL SERVER时间格式化 1 declare @i int=1 2 begin 3 while(@i<=200) 4 begin 5 BEGIN try 6 print convert(varchar(3),@i)+' '+convert(VARCHAR,getdate(),@i) 7 END TRY 8 BEGIN catch 9 end catch 10 set @i=@i+1 11 end 12 end 结果: 1:11/30/142:14.11.303:30/11/144:3

SQL SERVER 日期格式转换详解_Mysql

SQL SERVER 2000用sql语句如何获得当前系统时间就是用GETDATE(); Sql中的getDate()2008年01月08日 星期二 14:59Sql Server 中一个非常强大的日期格式化函数 复制代码 代码如下: Select CONVERT(varchar(100), GETDATE(), 0);-- 05 16 2008 10:57AMSelect CONVERT(varchar(100), GETDATE(), 1);-- 05/16/08Select CONVERT

分享Sql日期时间格式转换

Sql server2000中使用convert来取得datetime数据类型样式(全) 日期数据格式的处理,两个示例: CONVERT(varchar(16), 时间一, 20) 结果:2007-02-01 08:02/*时间一般为getdate()函数或数据表里的字段*/ CONVERT(varchar(10), 时间一, 23) 结果:2007-02-01 /*varchar(10)表示日期输出的格式,如果不够长会发生截取*/ 语句及查询结果:复制代码 代码如下:Select CONVER

SQL Server日期格式的转换

server|转换 SQL Server中文版的默认的日期字段datetime格式是yyyy-mm-dd Thh:mm:ss.mmm 例如: select getdate() 2004-09-12 11:06:08.177 这对于在要不同数据库间转移数据或者习惯oracle日期格式YYYY-MM-DD HH24:MI:SS的人多少有些不方便. 我整理了一下SQL Server里面可能经常会用到的日期格式转换方法: 举例如下: select CONVERT(varchar, getdate(),

SQL Server 2005常见问题浅析

问题1:使用.net2005自带的SQL-Express连接不上. 解决方法: 1.网络防火墙阻止数据库连接: 2.默认SQL-Express没有启动Sa账户->下载一个management studio express界面工具管理SQL-Express 3.无线网络会出现根据机器名找不到SQL服务器的情况,直接用IP连接 4.服务端通过开始菜单打开->配置工具->SQL Server外围应用配置器->服务和连接的外围应用配置器->远程连接->右边选择"本地连

VS 2005与SQL Server整合优势浅析

微软整合SQL Server 2005与Visual Studio 2005倒不是顶新鲜的创举,Oracle早在2004年年底即率先针对Visual Studio 2003,推出Oracle Developer Tools for Visual Studio .NET,用意在提供.NET平台的Oracle用户,整合于Visual Studio的数据库设计与管理工具,甚至可利用.NET开发Stored Procedure(预存程序).相信Oracle在不久的将来,也会针对.NET Framewor

SQL Server全文检索查询浅析

方案概要: 1. 改变文件存储时的文件名 2. 配置索引服务器,并将索引服务器与MS SQL Server关联. 3. 修改SQL语句,将进行全文查询语句的内容加入查询条件中 文件的存储方式: 为了方便存储以及方便索引,我们将上传的文件存储到一个目录里面,为了保证上传的文件名不重复,采用GUID作为文件名,并且通过这个GUID于数据库记录相关联.同时,文件的后缀还保持原始文件的后缀,让索引服务能够识别该文档. 配置索引服务 进入计算机管理(Computer Management)程序(右键"我的