sql字段类型的转换问题!

yangzi7908 2004-12-13 09:56:00
舒特考勤系统真BT,连个字段的数据类型的表现形式都不统一。
由于单位最近出现以下情况:很多人某天不上班(不刷卡,所以就没有考勤记录),但会跑到食堂吃饭(吃饭时刷卡就免费),但按我们的规定,当天不上班就不提供免费的工作餐。
所以,领导就找我实现一个功能:每月找出那些某天没有上班,但当天在食堂就餐的人当月所有的记录。我理所当然找舒特,他们说不提供这个功能。
无奈之下,我就自己在其提供sql7.0数据库中找到考勤刷卡记录和售饭刷卡记录两个表,准备用delphi实现这个功能(如果能在sql查询分析器实现就更好了):在两个表中(考勤表为kq,售饭表为:sf)以日期字段(kq.kqrq,sf.sfrq)相等为条件,从而找出在sf表中出现而没在kq表中出现的卡号(cardno),sql语句为:select cardno from sf where sf.card not in (select card from kq where kq.kqrq=sf.sfrq);当我打开两个表时,差点faint了:
考勤表(kq)的日期字段(kqrq)的数据类型是varchar,表现形式为:2004-11-01
售饭表(sf)的日期字段(sfrq)的数据类型是char, 表现形式为:20041101

【请问】我现在如何将两种不同的日期建立一个比较关系(相等,数据类型问题不大,关键是数据表现形式),才能让我的sql语句如愿以偿地得到我想要的数据。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
...全文
1071 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangzi7908 2004-12-13
  • 打赏
  • 举报
回复
晕,回帖之间又出来个方法,看来得赶紧结了
不然100不够啊
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
yangzi7908 2004-12-13
  • 打赏
  • 举报
回复
回复人: txlicenhe(马可) ( ) 信誉:167 2004-12-13 11:13:00 得分: 0


呵呵,你们sql版的反应真的很快
------------------------------

希望楼主以后可以说 "我们SQL版"。 呵呵。
------------------------------------------------
呵呵,版主不好意思,其实我也是硬件版的大版,为了突出对硬件版的感情,只好这样了,希望不要因我这样的话把我当成“阶级敌人”哦,^_^
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
zhang_yzy 2004-12-13
  • 打赏
  • 举报
回复
再该你一个方法:
select
sf.cardno
from
sf left join kq on sf.sfrq=left(kq.kqrq,4)+substring(kq.kqrq,6,2)+right(kq.kqrq,2)
and sf.cardno=kq.cardno
where
kq.cardno is null
yangzi7908 2004-12-13
  • 打赏
  • 举报
回复
呵呵,看来还是我的sql书看的少啊。
楼上各位的方法都用了一遍,都不错。
马上揭帖!
再次感谢!
~~~~~~~~~~~~~~~~~~
txlicenhe 2004-12-13
  • 打赏
  • 举报
回复
呵呵,你们sql版的反应真的很快
------------------------------

希望楼主以后可以说 "我们SQL版"。 呵呵。
yangzi7908 2004-12-13
  • 打赏
  • 举报
回复
呵呵,你们sql版的反应真的很快
谢谢大家了,先去44,好了就揭帖
~~~~~~~~~~~~~~~~
txlicenhe 2004-12-13
  • 打赏
  • 举报
回复
select cardno from sf a
where not exists(select 1 from kq where card = a.card and datediff(day,kqrq,a.sfrq) = 0)
vinsonshen 2004-12-13
  • 打赏
  • 举报
回复
建议尽量不要用in进行查询~~~
vinsonshen 2004-12-13
  • 打赏
  • 举报
回复
select a.cardno from sf as a,kq as b where a.card<>b.card and a.kqrq=replace(b.sfrq,'-','')

或:

select a.cardno from sf as a,kq as b where a.card<>b.card and a.kqrq=convert(varchar(8),cast(b.sfrq as datetime),112)
子陌红尘 2004-12-13
  • 打赏
  • 举报
回复
select
cardno
from
sf
where
sf.card not in
(select
card
from
kq
where
cast(kq.kqrq as datetime) = cast(rtrim(sf.sfrq) as datetime))
txlicenhe 2004-12-13
  • 打赏
  • 举报
回复
或者不作任何类型转换,直接比较即可。

... where datediff(day,kq.kqrq,sf.sfrq) = 0

例:
declare @aa varchar(10),@bb char(8)
set @aa = '2004-11-11'
set @bb = '20041111'
select datediff(day,@aa,@bb)
xingfuniao 2004-12-13
  • 打赏
  • 举报
回复
上面少個括號,
select cardno from sf
where sf.card not in
(select card from kq where cast(kq.kqrq as datetime) =cast(sf.sfrq as datetime))
xingfuniao 2004-12-13
  • 打赏
  • 举报
回复
select cardno from sf where sf.card not in (select card from kq where cast(kq.kqrq as datetime =cast(sf.sfrq as datetime))
txlicenhe 2004-12-13
  • 打赏
  • 举报
回复
convert(char(8),cast(kq.kqrq as datetime),112) = sf.sfrq

例:
declare @aa varchar(10)
set @aa = '2004-11-11'

select convert(char(8),cast(@aa as datetime),112)

/*

--------
20041111

(所影响的行数为 1 行)
*/

27,579

社区成员

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

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