问个日期的问题

bolome 2008-09-05 08:36:19
有个字段名aa里面的值是:
aa
22D 表示14天
3M 表示3个月
1YEAR 表示1年
想用两个日期之间的天数跟aa字段来比较或者用int类型的变量来跟aa字段比较。
...全文
139 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
行者无疆-Kevin 2008-09-05
  • 打赏
  • 举报
回复
具体的自己调试调试.
行者无疆-Kevin 2008-09-05
  • 打赏
  • 举报
回复
DECLARE @time_b DATETIME,@time_a DATETIME,@time_c datetime
SELECT @time_a='2007-10-5',@time_b='2008-1-2'
set @time_c=CASE WHEN CHARINDEX('d',aa)>0 THEN DATEADD(dd,CAST(REPLACE(aa,'d','') AS INT),@time_a)
WHEN CHARINDEX('m',aa)>0 THEN DATEADD(mm,CAST(REPLACE(aa,'m','') AS INT),@time_a)
WHEN CHARINDEX('year',aa)>0 THEN DATEADD(yy,CAST(REPLACE(aa,'year','') AS INT),@time_a) END

给变量赋值要用SET 或SELECT
bolome 2008-09-05
  • 打赏
  • 举报
回复

DECLARE @time_b DATETIME,@time_a DATETIME,@time_c datetime
SELECT @time_a='2007-10-5',@time_b='2008-1-2'
@time_c=CASE
WHEN CHARINDEX('d',aa)>0 THEN
DATEADD(dd,CAST(REPLACE(aa,'d','') AS INT),@time_a)
WHEN CHARINDEX('m',aa)>0 THEN
DATEADD(mm,CAST(REPLACE(aa,'m','') AS INT),@time_a)
WHEN CHARINDEX('year',aa)>0 THEN
DATEADD(yy,CAST(REPLACE(aa,'year','') AS INT),@time_a)
END

我的查询语句有点长,想通过中间变量,怎么老提示不对呢?
bolome 2008-09-05
  • 打赏
  • 举报
回复
我试试
fcuandy 2008-09-05
  • 打赏
  • 举报
回复
IF object_id('tb','u') IS NOT NULL
DROP TABLE tb
GO

CREATE TABLE tb(aa varchar(20))
insert tb select '22D'
union all select '3M'
union all select '1YEAR'

GO


DECLARE @time_b DATETIME,@time_a DATETIME
SELECT @time_a='2007-10-5',@time_b='2008-1-2'

SELECT * FROM tb a
WHERE CASE
WHEN CHARINDEX('d',aa)>0 THEN
DATEADD(dd,CAST(REPLACE(aa,'d','') AS INT),@time_a)
WHEN CHARINDEX('m',aa)>0 THEN
DATEADD(mm,CAST(REPLACE(aa,'m','') AS INT),@time_a)
WHEN CHARINDEX('year',aa)>0 THEN
DATEADD(yy,CAST(REPLACE(aa,'year','') AS INT),@time_a)
END
>@time_b
fcuandy 2008-09-05
  • 打赏
  • 举报
回复
这样可以,因为你有了基准值。
@time_a 一确定,那么几d,几m,几year是多少就都确定了。
bolome 2008-09-05
  • 打赏
  • 举报
回复
那换个方式:
有两个时间@time_a,@time_b 一个aa字段
aa
22D 表示22天
3M 表示3个月
1YEAR 表示1年
判断@time_b <time_a+aa,
如果aa字段中是22D,则是time_a+22天,
如果aa字段中是3M,则是time_a+3个月,
如果aa字段中是1YEAR,则是time_a+1年 这样可以吧???
bolome 2008-09-05
  • 打赏
  • 举报
回复
那换个方式:
有两个时间@time_a,@time_b 一个aa字段
aa
22D 表示14天
3M 表示3个月
1YEAR 表示1年
判断@time_b<time_a+aa,
如果aa字段中是22D,则是time_a+22天,
如果aa字段中是3M,则是time_a+3个月,
如果aa字段中是1YEAR,则是time_a+1年 这样可以吧???
fcuandy 2008-09-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 bolome 的回复:]
只能是换天比较了.但是3M,不一定是90天哟?
碰上二月份差好几天呢?
[/Quote]

那你只能自己回头去想你的设计了。

如果用第一个时间 与 表中指定的段来 dateadd, D是为dd,M时为mm,Year时为yy去加上相应值
第一时间若是 2000-2-28 ,加1月,得到 3-28 实际上根本没满一月。

怎么算都是有问题的。

差值是多少本来就跟指定时刻值有关的,你表里笼统的写个多少多少时间,谁也不知道是多久.

也就是说你表里存放的数据,本来就是做为比较的基值或参照值, 而这个基值又随着变量而变化,根本没法处理。

你也可能说把两个时间变量的天数差算出来,再计算间隔了多少月,或多少年,然后与表中的值比较, 那我想请问,按你的说法:
2008-6-15 至 2008-8-14 这是几个月?
如果按我们平时人的思维来看,刚好是2个月。
如果按月计算,6月有16天,7月有31天,8月有14天, 7月全范围被包了, 就不说了, 6月和8月以哪个为准?
以6月为准的话,则刚好2个月
以8月为准的话,则还差一天才到2个月
bolome 2008-09-05
  • 打赏
  • 举报
回复
只能是换天比较了.但是3M,不一定是90天哟?
碰上二月份差好几天呢?
wzy_love_sly 2008-09-05
  • 打赏
  • 举报
回复
declare @tb table(aa varchar(10))
insert into @tb select '22D'
insert into @tb select '3M'
insert into @tb select '1YEAR'

select aa,
[day]=case when right(aa,1)='D' then replace(aa,'D','')
when right(aa,1)='M' then replace(aa,'M','')*30
when right(aa,4)='YEAR' then replace(aa,'YEAR','')*365 end
from @tb


aa day
22D 22
3M 90
1YEAR 365

换天比较
fcuandy 2008-09-05
  • 打赏
  • 举报
回复
类似于这样?



declare @t table(v varchar(20))
insert @t select '22D'
union all select '3M'
union all select '1YEAR'

select a.* from @t a
inner join
(
select v='d',n=1
union
select v='m',n=30
union
select v='year',n=365
) b
on charindex(b.v,a.v)>0
where datediff(dd,'2007-9-1','2008-3-5')>=cast(replace(a.v,b.v,'') as int) * n
CN_SQL 2008-09-05
  • 打赏
  • 举报
回复
再说清楚一点,你想要什么结果,举个例子

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧