关于sql语句的一个小问题。

时间:2022-01-12 17:37:03
现在我在做一个出勤系统,登录之后,把登录名,还有等入时间在index.asp上面显示出来。现在出现了问题,我每登入一次,就显示一次。

我现在的目的就是,只记录每天第一次登入的信息,请问这个sql语句应该怎么写?

14 个解决方案

#1


select top 1 * from 登录日志表 order by 登录时间 desc

#2


楼住的意思是有很多人登陆,不是他自己

select * from loginlog where loginname="&session("loginname")&" 
if rs("登陆时间")<>"" then
if now() - rs("登陆时间") >8 then
rs("登陆时间")=""
rs.update
else
rs.addnew
rs("登陆时间")=now()
....
...

这只是一个意思,第一次登陆时,登陆时间应是空的,这时就写进库里他的登陆时间 now()
过了1小时后,他如果又登陆一次,则判断,如果登陆时间为空,就增加,如果不为空,则判断
当前时间-登陆时间如果大于8,则说明已经过了每天8小时的上班时间,这时清空登陆时间字段
LZ的代码里还需要要求在下班时必须点击“退出”得到退出时间写进库里

#3


楼上的,不对啊。你可能误解了我的意思。
我现在的语句是:sql= "select * from logins  where  month(thedate)=month({ fn NOW() }) and day(thedate)=day({ fn NOW() }) and year(thedate)=year({ fn NOW() })  order by time_login desc "

而我的目的是,显示每一个在今天登录了的人的信息。因为涉及到登录时间,所以我只想取每个人在今天第一次登录的信息。

比方说:  1  1234  2006-5-2  18:00
          2  1234  2006-5-2  19:00
          3  4444  2006-5-2  01:00
          4  4444  2006-5-2  12:00

我现在只想取第1和第3条~~~望高手指教~

#4


说实话,我还是没太明白你的意思。。。
如果是出勤,你为什么非要记录多次登陆时间?只记录1次不就可以吗?
sql= select * from logins where timer<>""
这样不就列出所有登陆过的人吗?

#5


Sql="Select distinct Name_Login ,Time_Login From Logins Where......
你可以试试~~~另外,对于时间,你可以用DateDiff()=0来判断,没必要按照年月日都相同来判断!!

#6


楼上的说的有理~~~,但是有一点啊,if now() - rs("登陆时间") >8 then 是不是不行??

我如果早上8点登录一次,晚上22点再登录一次,我今天的出勤是不是就是22点了??

我想把这里改成〉24,可行吗?

还有,now()是不是要改成time()??

#7


最好不要这样写~~因为有时候还要考虑下班的问题!!
另外使用DateDiff('dd',Time_Login,GetDate())=0是最好的办法!
Now()不是改成Time()而是改成GetDate(),如果是在SQL数据库中的话.

#8


使用DateDiff是最标准的做法
如果你担心22点登陆时时间不正确,可以在登陆页判断,如果当前时间小于你设定的上班时间,比如早上8点,则不对数据库操作,如果当前时间已经超过了下午下班时间比如下午5点
也不记录。
否则判断登陆时间是否为空,为空就记录,记录的就是登陆时间,如果不为空,就用现在的时间减登陆时间,如果时间已经是8小时,就清空,代表这个人今天已经上班而且满了8小时。
如果在清空了数据库后他再登陆,就转到登陆页判断,如开头处

#9


我再试试楼上的方法,楼上的楼上的distinct方法好像不行,一显示,还是全部都显示了。

#10


楼上的大哥,能帮我改下吗?我把我现在的logins.asp发出来,你最好就在上面帮我改下,谢谢了。
<%
Set rs=server.CreateObject("adodb.recordset")
Dim strname,strpassword,sql
strname=request.Form("uname")
strpassword=request.Form("upass")

If strname="" Then
response.write"账号不能为空<P></P>"
%>

<a href=javascript:history.back()>返回</a>

<%
  response.End
End If 
   If strpassword="" Then
   response.write"密码不能为空<P></P>"

  %>
<a href=javascript:history.back()>返回</a>
<%  
   response.End 
  End If
  


sql="select * from  user_list where uname='"&strname&"'"
rs.open sql,conn,1,1


 If rs.recordcount=1 Then
   If rs("upass")=strpassword Then
   session("uname")=strname
    session("time_login")=time() 


Set rs1=server.CreateObject("adodb.recordset")
sql="select * from logins"

sql="insert into logins (uname,time_login,thedate,ip_login,i_desc) values ('"&session("uname")&"','"&Time()&"','"&date()&"','"&Request.ServerVariables("HTTP_X_FORWARDED_FOR")&"',1)"

rs1.open sql,conn,3,3 

   response.redirect"index.asp"
   Else
   %>
<a href=javascript:history.back()>密码错误,请重新输入!</a>
<%
response.End
End If 


Else
%>
<a href=javascript:history.back()>账号错误,请重新输入!</a>

不胜感激。

#11


<%
Set rs=server.CreateObject("adodb.recordset")
Dim strname,strpassword,sql
strname=request.Form("uname")
strpassword=request.Form("upass")

If strname="" Then
response.write"账号不能为空<P></P>"
%>

<a href=javascript:history.back()>返回</a>

<%
  response.End
End If 
   If strpassword="" Then
   response.write"密码不能为空<P></P>"

  %>
<a href=javascript:history.back()>返回</a>
<%  
   response.End 
  End If
  


sql="select * from  user_list where uname='"&strname&"'"
rs.open sql,conn,1,1


 If rs.recordcount=1 Then
   If rs("upass")=strpassword Then
   session("uname")=strname
    session("time_login")=time() 


Set rs1=server.CreateObject("adodb.recordset")
sql="select * from logins where DateDiff('dd',GetDate(),Time_login)=0 And uname='"&uname&"'"
rs1.open sql,conn,1,3
If Rs1.Eof Then
Rs1.AddNew
Rs1("uname")=uname
Rs1("time_login") 
.
.
.
.
Rs1.UPdate
End If
Rs1.close:set Rs1=Nothing
Rs.Close:set rs=Nothing
Conn.Close:Set Conn=Nothing
   response.redirect"index.asp"
   Else
   %>
<a href=javascript:history.back()>密码错误,请重新输入!</a>
<%
response.End
End If 


Else
%>
<a href=javascript:history.back()>账号错误,请重新输入!</a>

#12


另外要注意
1、数据库要及时关闭和断开连接
2、要对一些非法字符串进行过滤,否则很危险!!

#13


谢谢楼上的。。。。不过,你的代码还是没有解决我的问题啊。。。。

我开始用了你的distinct,但是好像不行。

#14


distinct只能解决单列的问题,对于多列显示,目前还没办法~!!
估计是能用两个SQL语句来显示了~!!
Sql="Select distinct loginname From Login Where DateDiff('d',LoginTime,Now())=0"
Rs.open sql,conn,1,1
If Rs.Eof Then
Rs.close:set Rs=Nothing
Response.write "error"
Response.End
Else
Do While Not Rs.Eof
Sql1="Select Top 1 LoginName,LoginTime From Login Where LoginName='"&LoginName&"'" 
Order by LoginTime Desc"
Set Rs1=ExeCute(Sql1)
Response.Write 
Rs1.Close:Set Rs1=Nothing
Rs.MoveNext
Loop
End If
Rs.close:Set Rs=Nothing
Conn.Close:Set Conn=Nothing

#1


select top 1 * from 登录日志表 order by 登录时间 desc

#2


楼住的意思是有很多人登陆,不是他自己

select * from loginlog where loginname="&session("loginname")&" 
if rs("登陆时间")<>"" then
if now() - rs("登陆时间") >8 then
rs("登陆时间")=""
rs.update
else
rs.addnew
rs("登陆时间")=now()
....
...

这只是一个意思,第一次登陆时,登陆时间应是空的,这时就写进库里他的登陆时间 now()
过了1小时后,他如果又登陆一次,则判断,如果登陆时间为空,就增加,如果不为空,则判断
当前时间-登陆时间如果大于8,则说明已经过了每天8小时的上班时间,这时清空登陆时间字段
LZ的代码里还需要要求在下班时必须点击“退出”得到退出时间写进库里

#3


楼上的,不对啊。你可能误解了我的意思。
我现在的语句是:sql= "select * from logins  where  month(thedate)=month({ fn NOW() }) and day(thedate)=day({ fn NOW() }) and year(thedate)=year({ fn NOW() })  order by time_login desc "

而我的目的是,显示每一个在今天登录了的人的信息。因为涉及到登录时间,所以我只想取每个人在今天第一次登录的信息。

比方说:  1  1234  2006-5-2  18:00
          2  1234  2006-5-2  19:00
          3  4444  2006-5-2  01:00
          4  4444  2006-5-2  12:00

我现在只想取第1和第3条~~~望高手指教~

#4


说实话,我还是没太明白你的意思。。。
如果是出勤,你为什么非要记录多次登陆时间?只记录1次不就可以吗?
sql= select * from logins where timer<>""
这样不就列出所有登陆过的人吗?

#5


Sql="Select distinct Name_Login ,Time_Login From Logins Where......
你可以试试~~~另外,对于时间,你可以用DateDiff()=0来判断,没必要按照年月日都相同来判断!!

#6


楼上的说的有理~~~,但是有一点啊,if now() - rs("登陆时间") >8 then 是不是不行??

我如果早上8点登录一次,晚上22点再登录一次,我今天的出勤是不是就是22点了??

我想把这里改成〉24,可行吗?

还有,now()是不是要改成time()??

#7


最好不要这样写~~因为有时候还要考虑下班的问题!!
另外使用DateDiff('dd',Time_Login,GetDate())=0是最好的办法!
Now()不是改成Time()而是改成GetDate(),如果是在SQL数据库中的话.

#8


使用DateDiff是最标准的做法
如果你担心22点登陆时时间不正确,可以在登陆页判断,如果当前时间小于你设定的上班时间,比如早上8点,则不对数据库操作,如果当前时间已经超过了下午下班时间比如下午5点
也不记录。
否则判断登陆时间是否为空,为空就记录,记录的就是登陆时间,如果不为空,就用现在的时间减登陆时间,如果时间已经是8小时,就清空,代表这个人今天已经上班而且满了8小时。
如果在清空了数据库后他再登陆,就转到登陆页判断,如开头处

#9


我再试试楼上的方法,楼上的楼上的distinct方法好像不行,一显示,还是全部都显示了。

#10


楼上的大哥,能帮我改下吗?我把我现在的logins.asp发出来,你最好就在上面帮我改下,谢谢了。
<%
Set rs=server.CreateObject("adodb.recordset")
Dim strname,strpassword,sql
strname=request.Form("uname")
strpassword=request.Form("upass")

If strname="" Then
response.write"账号不能为空<P></P>"
%>

<a href=javascript:history.back()>返回</a>

<%
  response.End
End If 
   If strpassword="" Then
   response.write"密码不能为空<P></P>"

  %>
<a href=javascript:history.back()>返回</a>
<%  
   response.End 
  End If
  


sql="select * from  user_list where uname='"&strname&"'"
rs.open sql,conn,1,1


 If rs.recordcount=1 Then
   If rs("upass")=strpassword Then
   session("uname")=strname
    session("time_login")=time() 


Set rs1=server.CreateObject("adodb.recordset")
sql="select * from logins"

sql="insert into logins (uname,time_login,thedate,ip_login,i_desc) values ('"&session("uname")&"','"&Time()&"','"&date()&"','"&Request.ServerVariables("HTTP_X_FORWARDED_FOR")&"',1)"

rs1.open sql,conn,3,3 

   response.redirect"index.asp"
   Else
   %>
<a href=javascript:history.back()>密码错误,请重新输入!</a>
<%
response.End
End If 


Else
%>
<a href=javascript:history.back()>账号错误,请重新输入!</a>

不胜感激。

#11


<%
Set rs=server.CreateObject("adodb.recordset")
Dim strname,strpassword,sql
strname=request.Form("uname")
strpassword=request.Form("upass")

If strname="" Then
response.write"账号不能为空<P></P>"
%>

<a href=javascript:history.back()>返回</a>

<%
  response.End
End If 
   If strpassword="" Then
   response.write"密码不能为空<P></P>"

  %>
<a href=javascript:history.back()>返回</a>
<%  
   response.End 
  End If
  


sql="select * from  user_list where uname='"&strname&"'"
rs.open sql,conn,1,1


 If rs.recordcount=1 Then
   If rs("upass")=strpassword Then
   session("uname")=strname
    session("time_login")=time() 


Set rs1=server.CreateObject("adodb.recordset")
sql="select * from logins where DateDiff('dd',GetDate(),Time_login)=0 And uname='"&uname&"'"
rs1.open sql,conn,1,3
If Rs1.Eof Then
Rs1.AddNew
Rs1("uname")=uname
Rs1("time_login") 
.
.
.
.
Rs1.UPdate
End If
Rs1.close:set Rs1=Nothing
Rs.Close:set rs=Nothing
Conn.Close:Set Conn=Nothing
   response.redirect"index.asp"
   Else
   %>
<a href=javascript:history.back()>密码错误,请重新输入!</a>
<%
response.End
End If 


Else
%>
<a href=javascript:history.back()>账号错误,请重新输入!</a>

#12


另外要注意
1、数据库要及时关闭和断开连接
2、要对一些非法字符串进行过滤,否则很危险!!

#13


谢谢楼上的。。。。不过,你的代码还是没有解决我的问题啊。。。。

我开始用了你的distinct,但是好像不行。

#14


distinct只能解决单列的问题,对于多列显示,目前还没办法~!!
估计是能用两个SQL语句来显示了~!!
Sql="Select distinct loginname From Login Where DateDiff('d',LoginTime,Now())=0"
Rs.open sql,conn,1,1
If Rs.Eof Then
Rs.close:set Rs=Nothing
Response.write "error"
Response.End
Else
Do While Not Rs.Eof
Sql1="Select Top 1 LoginName,LoginTime From Login Where LoginName='"&LoginName&"'" 
Order by LoginTime Desc"
Set Rs1=ExeCute(Sql1)
Response.Write 
Rs1.Close:Set Rs1=Nothing
Rs.MoveNext
Loop
End If
Rs.close:Set Rs=Nothing
Conn.Close:Set Conn=Nothing