DATEDIFF(参数一,参数二,参数三) ---参数一:year month day; 参数二:比较的起始日期,默认1900-1-1;参数三:比较的日期。
eg:DATEDIFF(year,0,getdate())表示比较0(默认1900-1-1)到当前的日期想差几年
SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) -- 取得本月的第一天
SELECT DATEADD(wk, DATEDIFF(wk,0,getdate()), 0) -- 取得本周的星期一
SELECT DATEADD(yy, DATEDIFF(yy,0,getdate()), 0) -- 取得本年的第一天
SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)) --上个月最后一天
SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate())+1, 0)) --本月最后一天
SELECT dateadd(m,0,dateadd(yy,datediff(yy,0,getdate()),0)) --取得本年第一月 ......
in 和 exists其实挺好区别的.且看下边基本概念。
in 是一个集合运算符.
a in {a,c,d,s,d....}
这个运算中,前面是一个元素,后面是一个集合,集合中的元素类型是和前面的元素一样的。实现的对集合中的元素进行遍历,以确定给定的元素a是否与子查询或列表中的值相匹配。
in 运算用在sql语句中,它后面带的select 一定是选一个字段,而不是select *。
exists是一个存在判断,指定一个子查询,检测行的存在。如果后面的查询中有结果,则exists为真,否则为假.
比如说你要判断某班是否存在一个名为"小明"的学生,你可以用in 运算:
"小明" in (select sname from student)
这样(select sname from student) 返回的是一个全班姓名的集合,in用于判断"小明"是否为此集合中的一个数据;
同时,你也可以用exists语句:
exists (select * from student where sname="小明")
这两个函数是差不多的, 但是由于优化方案的不同, 通常NOT EXISTS要比NOT IN 要快, 因为NOT EXISTS可以使用结合算法而NOT IN 就不行了,而EXISTS则不如IN快, 因为这时候IN可能更多的使用结合算法.
select * from 表A where exists(select * from 表B where 表B.id ......
定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一个特殊的存储过程。
常见的触发器有三种:分别应用于Insert , Update , Delete 事件。
我为什么要使用触发器?比如,这么两个表:
Create Table Student( --学生表
StudentID int primary key, --学号
....
)
Create Table BorrowRecord( --学生借书记录表
BorrowRecord int identity(1,1), --流水号
Stu ......
接(一)
--触发器示例2
/*
创建触发器[T_INSERT_卷烟销售表],该触发器较复杂。
说明: 每当[卷烟库存表]发生 INSERT 动作,则引发该触发器。
触发器功能: 实现业务规则。
业务规则: 如果销售的卷烟品牌不存在库存或者库存为零,则返回错误。
否则则自动减少[卷烟库存表]中对应品牌卷烟的库存数量和库存金额。
*/
IF EXISTS (SELECT NAME from SYSOBJECTS WHERE XTYPE = ’TR’ AND NAME = ’T_INSERT_卷烟销售表’)
DROP TRIGGER T_INSERT_卷烟销售表
GO
CREATE TRIGGER T_INSERT_卷烟销售表
ON 卷烟销售表
FOR INSERT
AS
BEGIN TRANSACTION
--检查数据的合法性:销售的卷烟是否有库存,或者库存是否大于零
IF NOT EXISTS (
SELECT 库存数量
from 卷烟库存表
WHERE 卷烟品牌 IN (SELECT 卷烟品牌 from INSERTED)
)
BEGIN
--返回错误提示
RAISERROR(’错误!该卷烟不存在库存,不能销售。’,16,1)
--回滚事务
ROLLBACK
RETURN
END
IF EXISTS (
SELECT 库存数量
from 卷烟库存表
WHERE 卷烟品牌 IN (SELECT 卷烟品牌 from INSERTED) AND
库存数量 <= 0
)
BEGIN
--返回错误提示
RAISERROR(&rs ......
1:replace 函数
第一个参数你的字符串,第二个参数你想替换的部分,第三个参数你要替换成什么
select replace('lihan','a','b')
-----------------------------
lihbn
(所影响的行数为 1 行)
=========================================================
2:substring函数
第一个参数你的字符串,第二个是开始替换位置,第三个结束替换位置
select substring('lihan',0,3);
-----
li
(所影响的行数为 1 行)
=========================================================
3:charindex函数
第一个参数你要查找的char,第二个参数你被查找的字符串 返回参数一在参数二的位置
select charindex('a','lihan')
---------- ......
detachedCriteria.add(Restrictions.or(
Restrictions.like("chengBanDanWeiIds", rForm.getChengBanDanWeiIds()+(char)13, MatchMode.START),
Restrictions.or(
Restrictions.like("chengBanDanWeiIds", rForm.getChengBanDanWeiIds()+ (char)13, MatchMode.END),
Restrictions.eq("chengBanDanWeiIds", rForm.getChengBanDanWeiIds())
)));
换行不用CHAR(13),用(char)13 ......
detachedCriteria.add(Restrictions.or(
Restrictions.like("chengBanDanWeiIds", rForm.getChengBanDanWeiIds()+(char)13, MatchMode.START),
Restrictions.or(
Restrictions.like("chengBanDanWeiIds", rForm.getChengBanDanWeiIds()+ (char)13, MatchMode.END),
Restrictions.eq("chengBanDanWeiIds", rForm.getChengBanDanWeiIds())
)));
换行不用CHAR(13),用(char)13 ......