社区
MS-SQL Server
帖子详情
对时间字段查询,DATEDIFF 和 DATEADD 两种方式是否一样?
CodeProject-Jerry
2010-08-31 12:55:49
在一个表中有一个 时间字段, 建立了索引
在搜索这个表单时候, 我一般用
[LastAccess] < DATEADD( minute, -30, GETDATE())
感觉这样能够利用索引
而这种写法
DATEDIFF( minute, [LastAccess], GETDATE()) > 30
隐隐觉得这种写法性能差些
不知道MSSQL查询优化的时候会不会优化这个哦
欢迎大家讨论
...全文
152
10
打赏
收藏
对时间字段查询,DATEDIFF 和 DATEADD 两种方式是否一样?
在一个表中有一个 时间字段, 建立了索引 在搜索这个表单时候, 我一般用 [LastAccess] 30 隐隐觉得这种写法性能差些 不知道MSSQL查询优化的时候会不会优化这个哦 欢迎大家讨论
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
10 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
feilniu
2010-09-02
打赏
举报
回复
[Quote=引用 7 楼 wangjia184 的回复:]
[LastAccess] < DATEADD( minute, -30, GETDATE())
那是不是改成
DECLARE @VAR DATETIME
SET @VAR = DATEADD( minute, -30, GETDATE())
最后[LastAccess] < @VAR
这样的查询效率就高些?
[/Quote]
一样的。SQL Server会把DATEADD( minute, -30, GETDATE())的结果放在临时变量里,而不会每次用的时候就计算一次。
nzperfect
2010-09-02
打赏
举报
回复
可以利用索引
[LastAccess] < DATEADD( minute, -30, GETDATE())
不能利用索引:
DATEDIFF( minute, [LastAccess], GETDATE()) > 30
xingdongfang
2010-09-02
打赏
举报
回复
我们做了一个实验:
总记录数:1617,453
where ins<@datetime;
--01:49
DATEDIFF(day,ins,@datetime)>0;
--01:53
CodeProject-Jerry
2010-09-02
打赏
举报
回复
[LastAccess] < DATEADD( minute, -30, GETDATE())
那是不是改成
DECLARE @VAR DATETIME
SET @VAR = DATEADD( minute, -30, GETDATE())
最后[LastAccess] < @VAR
这样的查询效率就高些?
asus09345
2010-08-31
打赏
举报
回复
两个都会变成index scan;
当然,如果你的表很小,执行速度也看不出什么区别
rfq
2010-08-31
打赏
举报
回复
专家级 试验
今年我18
2010-08-31
打赏
举报
回复
学习。。。
hchjjun
2010-08-31
打赏
举报
回复
函数参与计算,索引就不起作用了,,,你可以测试一下
路伊阑珊
2010-08-31
打赏
举报
回复
支持楼主 继续关注
hchjjun
2010-08-31
打赏
举报
回复
第一种方法索引也是失效的.
sqlserver自定义函数
--计算当前月的实际天数 Create FUNCTION dbo.CalcDaysOfMonth (@time varchar(6)) RETURNS int AS BEGIN DECLARE @Days int DECLARE @Month int DECLARE @Year int SET @Year=SUBSTRING(@time,1,4) SET @Month=SUBSTRING(@time,5,6) if( @Month='1' OR @Month='3' OR @Month='5' OR @Month='7' OR @Month='8' OR @Month='10' OR @Month='12' ) set @Days=31 else if( @Month='4' OR @Month='6' OR @Month='9' OR @Month='11' ) set @Days=30; else if(@Year%400=0 OR (@Year%4=0 AND @Year%100<>0)) set @Days=29 else set @Days=28 RETURN(@Days) END --确定某年某月有多少天 Create FUNCTION DaysInMonth ( @date datetime ) Returns int AS BEGIN RETURN Day(
dateadd
(mi,-3,
DATEADD
(m,
DATEDIFF
(m,0,@date)+1,0))) END --哪一天是输入
时间
的星期一 Create FUNCTION MondayInDate ( @date datetime ) RETURNS DATETIME AS BEGIN RETURN
DATEADD
(week,
DATEDIFF
(week,0,@date),0) END --输入
时间
的季度的第一天 Create FUNCTION QuarterInDate ( @date datetime ) RETURNS DATETIME AS BEGIN RETURN
DATEADD
(quarter,
DATEDIFF
(quarter,0,@date), 0) END --输入
时间
的季度的天数 Create FUNCTION QuarterDaysInDate ( @date datetime ) RETURNS INT AS BEGIN declare @m tinyint,@time SMALLDATETIME select @m=month(@date) 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,@date)+'-'+convert(varchar(10),@m)+'-01' return
datediff
(day,@time,
dateadd
(mm,3,@time)) END --按指定符号分割字符串,返回分割后的元素个数,方法很简单,就是看字符串中存在多少个分隔符号,然后再加一,就是要求的结果。 Create function Get_StrArrayLength ( @str varchar(1024), --要分割的字符串 @split varchar(10) --分隔符号 ) returns int as begin declare @location int declare @start int declare @length int set @str=ltrim(rtrim(@str)) set @location=charindex(@split,@str) set @length=1 while @location<>0 begin set @start=@location+1 set @location=charindex(@split,@str,@start) set @length=@length+1 end return @length END --按指定符号分割字符串,返回分割后指定索引的第几个元素,象数组一样方便 Create function Get_StrArrayStrOfIndex ( @str varchar(1024), --要分割的字符串 @split varchar(10), --分隔符号 @index int --取第几个元素 ) returns varchar(1024) as begin declare @location int declare @start int declare @next int declare @seed int set @str=ltrim(rtrim(@str)) set @start=1 set @next=1 set @seed=len(@split) set @location=charindex(@split,@str) while @location<>0 and @index>@next begin set @start=@location+@seed set @location=charindex(@split,@str,@start) set @next=@next+1 end if @location =0 select @location =len(@str)+1 --这儿存在两种情况:1、字符串不存在分隔符号 2、字符串中存在分隔符号,跳出while循环后,@location为0,那默认为字符串后边有一个分隔符号。 return substring(@str,@start,@location-@start) END select dbo.Get_StrArrayStrOfIndex('8,9,4','',4) --结合上边两个函数,象数组一样遍历字符串中的元素 create function f_splitstr(@SourceSql varchar(8000),@StrSeprate varchar(100)) returns @temp table(F1 varchar(100)) as begin declare @ch as varchar(100) set @SourceSql=@SourceSql+@StrSeprate while(@SourceSql<>'') begin set @ch=left(@SourceSql,charindex(',',@SourceSql,1)-1) insert @temp values(@ch) set @SourceSql=stuff(@SourceSql,1,charindex(',',@SourceSql,1),'') end return end select * from dbo.f_splitstr('1,2,3,4',',') --全角和半角转换函数 Create FUNCTION f_Convert( @str NVARCHAR(4000), --要转换的字符串 @flag bit --转换标志,0转换成半角,1转换成全角 )RETURNS nvarchar(4000) AS BEGIN DECLARE @pat nvarchar(8),@step int,@i int,@spc int IF @flag=0 Select @pat=N'%[!-~]%',@step=-65248, @str=REPLACE(@str,N' ',N' ') ELSE Select @pat=N'%[!-~]%',@step=65248, @str=REPLACE(@str,N' ',N' ') SET @i=PATINDEX(@pat COLLATE LATIN1_GENERAL_BIN,@str) WHILE @i>0 Select @str=REPLACE(@str, SUBSTRING(@str,@i,1), NCHAR(UNICODE(SUBSTRING(@str,@i,1))+@step)) ,@i=PATINDEX(@pat COLLATE LATIN1_GENERAL_BIN,@str) RETURN(@str) END GO declare @s1 varchar(8000) select @s1='中 2-3456a78STUVabn中国opwxyz' select dbo.f_convert(@s1,0),dbo.f_convert(@s1,1) 函数返回值是表 create table test(id int primary key,name char(10)) insert into test values(1,'test1') insert into test values(2,'test2') insert into test values(3,'test3') insert into test values(4,'test4') 1、标量函数 create function return_count() returns int as begin declare @count int select @count=count(*) from test return @count end --调用 select dbo.return_count() cont --count为显示的列头 --运行结果 --count --4 2、内嵌表值函数 create function return_test() returns table as --begin 内联表值函数不能用begin-end return select name from test --end --调用 select * from return_test() --运行结果 --name --test1 --test2 --test3 --test4 3、多语句表值函数 create function return_test_multi() returns @temp table(id int,name char(10)) as begin insert into @temp select * from test where id in(1,2) return --记住,一定不要忘记写return end --调用 select * from dbo.return_test_multi() --运行结果 --id name --1 test1 --2 test2 在
查询
结果中增加一个自动增长的ID select id=identity(int, 1, 1), * into #T from testTable select * from #T drop table #T sql删除重复的记录 打开测试数据库test,并以表w01为例,将下面的SQL语句放入sql2000
查询
分析器中,一段一段执行即可看到效果 ---在sql2000下创建测试数据表 if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[w01]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[w01] ---在sql2005下创建测试数据表,如果是sql2005则用本段来判断数据表
是否
存在 ---if exists(select 1 from sys.tables where name='w01') ---drop table w01 ----开始创建测试数据库 GO create table w01(gs903 varchar(32),gs1002 varchar(32)) insert into w01 select '1','a' union all select '1','a' union all select '1','a' union all select '2','a' union all select '2','e' union all select '3','b' union all select '3','d' go select * from w01 go ---为表w01添加一个可以表示唯一标示的自增
字段
ID alter table w01 add [ID] [int] IDENTITY (1, 1) NOT FOR REPLICATION NOT NULL ---
查询
删除前的数据和记录数:7 select * from w01 select count(*) from w01 ---
查询
具有重复记录的所有记录;3 select gs903,gs1002,count(*) as count from w01 group by gs903,gs1002 having count(*)>1 order by count desc ---删除重复的数据:2行 delete from w01 where id not in (select max(id) from w01 group by gs903,gs1002) ---看看删除后还有没有重复记录:0 select gs903,gs1002,count(*) as count from w01 group by gs903,gs1002 having count(*)>1 order by count desc ---删除后的数据和记录数:7-2=5 select * from w01 select count(*) from w01 用SQL语句添加删除修改
字段
增加
字段
alter table docdsp add dspcode char(200) 删除
字段
Alter TABLE table_NAME Drop COLUMN column_NAME 修改
字段
类型 Alter TABLE table_name Alter COLUMN column_name new_data_type 改名 sp_rename 更改当前数据库中用户创建对象(如表、列或用户定义数据类型)的名称。 语法 sp_rename [ @objname = ] 'object_name' , [ @newname = ] 'new_name' [ , [ @objtype = ] 'object_type' ] --假设要处理的表名为: tb --判断要添加列的表中
是否
有主键 if exists(select 1 from sysobjects where parent_obj=object_id('tb') and xtype='PK') begin print '表中已经有主键,列只能做为普通列添加' --添加int类型的列,默认值为0 alter table tb add 列名 int default 0 end else begin print '表中无主键,添加主键列' --添加int类型的列,默认值为0 alter table tb add 列名 int primary key default 0 end
sql datepart ,
dateadd
,
datediff
,DateName函数
[转载]sqldatepart,
dateadd
,
datediff
,DateName函数 (2011-09-13 15:16:56) 转载▼ 标签: 转载 分类:SQL语句(oracle,sql) 详细!! 原文地址:sqldatepart,
dateadd
,
datediff
,DateName函数作者:蓝天碧海 1. 当...
mysql2000日期加减,SQL日期处理函数
DATEADD
和
DATEDIFF
详解
SQL Server数据库中,DATETIME和SMALLDATETIME的值是存储为整数的。虽然如此,SQL Server数据库并不因此支持对这两种类型的值做数学运算。不过,我们一定会有给日期或
时间
值增加或减去一定
时间
差的需求。例如,你可能想给某个日期
时间
值增加几个月或几天,甚至加几个小时。你甚至可能想比较两个日期
时间
值来了解他们之间的
时间
有多长,例如判断相差几天或者几年。Transact-SQ...
SQL使用
dateadd
和
datediff
[code="sql"] 首先讲讲要用到的两个数据库函数,
dateadd
和
datediff
函数。
dateadd
函数:
DateAdd
(interval, number, date)返回的是一个日期数据,函数的三个形参都是必要。 interval表示
时间
的间隔可以是yy(表示年),mm(表示月),dd(表示日),qq(表示季度),ww(表示周); number表示间隔的数值,正数表示日期...
sql
datediff
_SQL日期格式概述;
DateDiff
SQL函数,
DateAdd
SQL函数等
sql
datediff
SQL date format functions like the
DateDiff
SQL function and
DateAdd
SQL Function are oft used by DBAs but many of us never took the time to fully understand these extremely useful fea...
MS-SQL Server
34,593
社区成员
254,589
社区内容
发帖
与我相关
我的任务
MS-SQL Server
MS-SQL Server相关内容讨论专区
复制链接
扫一扫
分享
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章