Avatar billede mvk Nybegynder
27. august 2004 - 10:07 Der er 26 kommentarer og
1 løsning

Sammenligning af dato

jeg har et forum hvor jeg gerne vil vise brugerne de indlæg der er kommet siden deres sidste login så jeg forsøger i min SQL at sammenholde datoerne, men den virker ikke.

datoerne er af formatet: dd-mm-yyyy og felterne er af datatypen memo (tekst)

koden:
<%
Dim rsForum__valDato
rsForum__valDato = "1"
If (Request.QueryString("Dato") <> "") Then
  rsForum__valDato = Request.QueryString("Dato")
End If
%>
<%
Dim rsForum__valTid
rsForum__valTid = "1"
If (Request.QueryString("Tid") <> "") Then
  rsForum__valTid = Request.QueryString("Tid")
End If
%>
<%
Dim rsForum
Dim rsForum_numRows

Set rsForum = Server.CreateObject("ADODB.Recordset")
rsForum.ActiveConnection = MM_gutternes_STRING
rsForum.Source = "SELECT *  FROM thread  WHERE CreateDate >= '" + Replace(rsForum__valDato, "'", "''") + "' AND CreatedTime >= '" + Replace(rsForum__valTid, "'", "''") + "'  ORDER BY IDthread DESC"
rsForum.CursorType = 0
rsForum.CursorLocation = 2
rsForum.LockType = 1
rsForum.Open()

rsForum_numRows = 0
%>
Avatar billede fennec Nybegynder
27. august 2004 - 10:14 #1
Så kan du ikke gøre det uden at lavet komplekse beregninger. Datatypen skal være DateTime eller tekst på yyyy-mm-dd formatet. Vil dog ikke anbefale at bruge tekst.

Gem altid dato'er som DateTime type... Det kan ikke siges ofte nok :o)
Avatar billede mvk Nybegynder
27. august 2004 - 10:18 #2
hehe okay - kan man så omkonvertere det til dansk dataformat dd-mm-yyyy

hvis du siger go begynder jeg at omstrukturere min db til DateTime - jeg afsætter gerne flere point, hvis du kan hjælpe lidt :)
Avatar billede mvk Nybegynder
27. august 2004 - 10:18 #3
når jeg når til at skulle omkonvertere
Avatar billede ldanielsen Nybegynder
27. august 2004 - 10:23 #4
Det er ikke MSSQL, vel?

Anyway, prøv at skrive
Response.Write (rsForum.Source) lige før linien
rsForum.CursorType = 0

og lav os se hvad den indeholder

og lige et par bemærkninger:
CreatedTime >= '" + Replace(rsForum__valTid, "'", "''") + "'
Du skal bruge & i stedet for + når du samler tekststrenge, ellers KAN der opstå uventede resultater

Og hvis du vælger at gemme datoer i tekstfelter (hvilket er nødløsningen hvis man ikke kan hitte ud af rigtige datofelter), så skal du vælge et format der kan sorteres. Dvs: yyyy-mm-dd hh:mm:ss. Og ALTID to tegn til hver del, og fire til år, så i nu er 2004-08-27 10:23:05, ikke 2004-8-27 10:23:5. så kan det godt virke.
Avatar billede fennec Nybegynder
27. august 2004 - 10:30 #5
Man formatere altid datoer til det man vil vise i koden (PHP,ASP), hvis det er nødvendigt. Så gå du bare i gang med at konvertere dine datoer til DateTime formatet.

Jeg tror dog at hvis du får ændret formatet til yyyy-mm-dd (kan gøres med en update), kan du ændre typen til DateTime uden at data går tabt. Det kommer selvfølgelig an på, hvor meget data du har i øjeblikket, om det så kan betale sig.
Avatar billede mvk Nybegynder
27. august 2004 - 10:40 #6
jeg har delt formatet op i 2: ét til Datoen og ét til Tiden

nu har jeg ændret felterne i databasen til:

LastLogin_Date = datetype Date/Time
LastLogin_Time = datetype Date/Time

skal der kun være 1 felt ?
Avatar billede fennec Nybegynder
27. august 2004 - 10:42 #7
Jeg vil anbefale et felt....
Avatar billede mvk Nybegynder
27. august 2004 - 10:45 #8
ldanielsen - hehe "gemme datoer i tekstfelter (hvilket er nødløsningen hvis man ikke kan hitte ud af rigtige datofelter" - det er mig :)
men nu prøver jeg at flytte mine sql skills til det næste niveau
Avatar billede mvk Nybegynder
27. august 2004 - 10:51 #9
puha - det giver mig chills at ændre så mange felter...  håber det virker
Avatar billede mvk Nybegynder
27. august 2004 - 10:52 #10
hvordan skal jeg så smide Date/Time i databasen ? kender kun <%=Date()%> og <=%Time()%>
Avatar billede mvk Nybegynder
27. august 2004 - 10:52 #11
skal jeg bare sætte dem sammen ? eller er det et fælles navn
Avatar billede fennec Nybegynder
27. august 2004 - 11:01 #12
ASP:

date() = kun dato
time() = kun tid
now() = dato og tid

Men hvis du skal smide dagsdato ind eller tiden lige nu. Har MySQL også dato funktioner til det. Så skal du heller ikke tænke på formatet, da de funktioner jo bruger MySQL's format :o)
Avatar billede mvk Nybegynder
27. august 2004 - 11:03 #13
okay hvad er nemmest ... med tanke på at jeg skal sammenligne dato + tidspunkt fra andre tabeller og vise resultaterne i dansk datoformat (giver det mening eller forklarede jeg det dårligt)
Avatar billede fennec Nybegynder
27. august 2004 - 11:15 #14
Det kommer altid an på i hvilken sammenhæng du skal bruge det. I mange tilfælde kan du bruge MySQL'funktion.

CURDATE() = dato
NOW() = dato og tid

set rs = conn.execute("select * from EnTabel where DitDatoFelt < NOW()")
er det samme som:
set rs = conn.execute("select * from EnTabel where DitDatoFelt < '"& now() &"'")

men det kræver at ASP's dato format passer med MySQL. Det er derfor nemmere at bruge MySQL's funktion. Noget andet er hvis du skal se for 3 dage tidligere. Der synes jeg det er nemmere at bruge ASP DateAdd() funktion, også formatere datoen så den passer til MySQL. Til det har jeg lavet en funktion som jeg kører alle datoer fra ASP igennem.

Når du så får datoen ud, kan du formatere den som du har lyst til i ASP. Hvis du har sat en LCID, burde datoerne blive vist efter dens specifikationer.
Avatar billede mvk Nybegynder
27. august 2004 - 11:17 #15
nu er der intet der virker
Avatar billede mvk Nybegynder
27. august 2004 - 11:18 #16
denne får jeg fejl på:
<body onload="document.forms[0].submit();">
<form ACTION="<%=MM_editAction%>" METHOD="POST" name="form1">
  <input name="DateTime" type="hidden" id="DateTime" value="<%=Now()%>">
<input name="sidstelogin" type="hidden" id="sidstelogin" value="<%=(rsUser.Fields.Item("DateTime").Value)%>">
<input type="hidden" name="MM_update" value="form1">
<input type="hidden" name="MM_recordId" value="<%= rsUser.Fields.Item("IDuser").Value %>">
</form>
Avatar billede fennec Nybegynder
27. august 2004 - 11:20 #17
Det er når du indsætter du får fejlen ikke???
Avatar billede mvk Nybegynder
27. august 2004 - 11:22 #18
jeg prøver at opdatere en tabel med brugerens sidste login, her er hele koden:

<%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%>
<!--#include file="../Connections/gutternes.asp" -->
<%
' *** Edit Operations: declare variables

Dim MM_editAction
Dim MM_abortEdit
Dim MM_editQuery
Dim MM_editCmd

Dim MM_editConnection
Dim MM_editTable
Dim MM_editRedirectUrl
Dim MM_editColumn
Dim MM_recordId

Dim MM_fieldsStr
Dim MM_columnsStr
Dim MM_fields
Dim MM_columns
Dim MM_typeArray
Dim MM_formVal
Dim MM_delim
Dim MM_altVal
Dim MM_emptyVal
Dim MM_i

MM_editAction = CStr(Request.ServerVariables("SCRIPT_NAME"))
If (Request.QueryString <> "") Then
  MM_editAction = MM_editAction & "?" & Server.HTMLEncode(Request.QueryString)
End If

' boolean to abort record edit
MM_abortEdit = false

' query string to execute
MM_editQuery = ""
%>
<%
' *** Update Record: set variables

If (CStr(Request("MM_update")) = "form1" And CStr(Request("MM_recordId")) <> "") Then

  MM_editConnection = MM_gutternes_STRING
  MM_editTable = "users"
  MM_editColumn = "IDuser"
  MM_recordId = "" + Request.Form("MM_recordId") + ""
  MM_editRedirectUrl = "../http://www.google.dk"
  MM_fieldsStr  = "DateTime|value"
  MM_columnsStr = "DateTime|',none,NULL"

  ' create the MM_fields and MM_columns arrays
  MM_fields = Split(MM_fieldsStr, "|")
  MM_columns = Split(MM_columnsStr, "|")
 
  ' set the form values
  For MM_i = LBound(MM_fields) To UBound(MM_fields) Step 2
    MM_fields(MM_i+1) = CStr(Request.Form(MM_fields(MM_i)))
  Next

  ' append the query string to the redirect URL
  If (MM_editRedirectUrl <> "" And Request.QueryString <> "") Then
    If (InStr(1, MM_editRedirectUrl, "?", vbTextCompare) = 0 And Request.QueryString <> "") Then
      MM_editRedirectUrl = MM_editRedirectUrl & "?" & Request.QueryString
    Else
      MM_editRedirectUrl = MM_editRedirectUrl & "&" & Request.QueryString
    End If
  End If

End If
%>
<%
' *** Update Record: construct a sql update statement and execute it

If (CStr(Request("MM_update")) <> "" And CStr(Request("MM_recordId")) <> "") Then

  ' create the sql update statement
  MM_editQuery = "update " & MM_editTable & " set "
  For MM_i = LBound(MM_fields) To UBound(MM_fields) Step 2
    MM_formVal = MM_fields(MM_i+1)
    MM_typeArray = Split(MM_columns(MM_i+1),",")
    MM_delim = MM_typeArray(0)
    If (MM_delim = "none") Then MM_delim = ""
    MM_altVal = MM_typeArray(1)
    If (MM_altVal = "none") Then MM_altVal = ""
    MM_emptyVal = MM_typeArray(2)
    If (MM_emptyVal = "none") Then MM_emptyVal = ""
    If (MM_formVal = "") Then
      MM_formVal = MM_emptyVal
    Else
      If (MM_altVal <> "") Then
        MM_formVal = MM_altVal
      ElseIf (MM_delim = "'") Then  ' escape quotes
        MM_formVal = "'" & Replace(MM_formVal,"'","''") & "'"
      Else
        MM_formVal = MM_delim + MM_formVal + MM_delim
      End If
    End If
    If (MM_i <> LBound(MM_fields)) Then
      MM_editQuery = MM_editQuery & ","
    End If
    MM_editQuery = MM_editQuery & MM_columns(MM_i) & " = " & MM_formVal
  Next
  MM_editQuery = MM_editQuery & " where " & MM_editColumn & " = " & MM_recordId

  If (Not MM_abortEdit) Then
    ' execute the update
    Set MM_editCmd = Server.CreateObject("ADODB.Command")
    MM_editCmd.ActiveConnection = MM_editConnection
    MM_editCmd.CommandText = MM_editQuery
    MM_editCmd.Execute
    MM_editCmd.ActiveConnection.Close

    If (MM_editRedirectUrl <> "") Then
      Response.Redirect(MM_editRedirectUrl)
    End If
  End If

End If
%>
<%
Dim rsUser__MMColParam
rsUser__MMColParam = "1"
If (Session("MM_Username") <> "") Then
  rsUser__MMColParam = Session("MM_Username")
End If
%>
<%
Dim rsUser
Dim rsUser_numRows

Set rsUser = Server.CreateObject("ADODB.Recordset")
rsUser.ActiveConnection = MM_gutternes_STRING
rsUser.Source = "SELECT * FROM users WHERE Username = '" + Replace(rsUser__MMColParam, "'", "''") + "'"
rsUser.CursorType = 0
rsUser.CursorLocation = 2
rsUser.LockType = 1
rsUser.Open()

rsUser_numRows = 0

%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body onload="document.forms[0].submit();">
<form ACTION="<%=MM_editAction%>" METHOD="POST" name="form1">
  <input name="DateTime" type="hidden" id="DateTime" value="<%=Now()%>">
<input name="sidstelogin" type="hidden" id="sidstelogin" value="<%=(rsUser.Fields.Item("DateTime").Value)%>">
<input type="hidden" name="MM_update" value="form1">
<input type="hidden" name="MM_recordId" value="<%= rsUser.Fields.Item("IDuser").Value %>">
</form><%=Now()%><br>
<%=(rsUser.Fields.Item("DateTime").Value)%><br>
<%=(rsUser.Fields.Item("IDuser").Value)%>
</body>
</html>
<%
rsUser.Close()
Set rsUser = Nothing
%>
Avatar billede mvk Nybegynder
27. august 2004 - 11:22 #19
jo det virker som om den ikke vil opdatere feltet i databasen
Avatar billede ldanielsen Nybegynder
27. august 2004 - 11:33 #20
Jeg har engang svaret meget uddybende på et spm om datoer i db, Hvis du læser mine indlæg herfra er der nok noget du kan bruge. SET DATEFORMAT virker ikke i alle db'er, men anyway ...

http://www.eksperten.dk/spm/504795
Avatar billede fennec Nybegynder
27. august 2004 - 12:00 #21
Som sagt plejer jeg at bruge en convert funktion til at indsætte datoer fra ASP.

Function ConvertToSqlDate(dato)
    dim SQLYear,SQLMonth,SQLDay
    SQLYear = Year(dato)
    SQLMonth = Month(dato)
    SQLDay = Day(dato)
    if SQLDay<10 then
        SQLDay = 0&SQLDay
    end if
    if SQLMonth<10 then
        SQLMonth = 0&SQLMonth
    end if
    ConvertToSqlDate = SQLYear&SQLMonth&SQLDay
End Function       
Function ConvertToSqlDatetime(dato)
    dim SQLYear,SQLMonth,SQLDay,SQLHour,SQLMinute
'    response.write "dskb " & dato
    SQLYear = Year(dato)
    SQLMonth = Month(dato)
    SQLDay = Day(dato)
    SQLHour = Hour(dato)
    SQLMinute = minute(dato)
    if SQLDay<10 then
        SQLDay = 0&SQLDay
    end if
    if SQLMonth<10 then
        SQLMonth = 0&SQLMonth
    end if
    ConvertToSqlDatetime = SQLYear&SQLMonth&SQLDay&" "&SQLHour&":"&SQLMinute
End Function

Så skal de bare bruges når sql-sætningerne opbygges.

conn.execute("insert into DinTabel(enDato,enDatoTid) values('"& ConvertToSqlDate(date()) &"','"& ConvertToSqlDatetime(now()) &"')")

Men nu indsætte du now() værdien, så den kan du faktisk fjerne fra din form, også bruge MySQL's NOW() i din sql-sætning i stedet.
Avatar billede mvk Nybegynder
27. august 2004 - 12:24 #22
det virker lidt uoverskueligt ... jeg kan bla ikke se hvor i koden jeg skal bruge MySQL's NOW() ?
Avatar billede fennec Nybegynder
27. august 2004 - 12:32 #23
Du opbygger MM_editQuery i en løkke. Hvis du prøver at skrive den ud, skulle du gerne få en "update..." sql-sætning. Et eller andet sted i løkken indsætter du formfeltet DateTime.

Det er en meget rodet kode du har dig der. Skal den bare lave en opdatering af data i databasen???
Avatar billede mvk Nybegynder
27. august 2004 - 12:46 #24
hehe ja - jeg bruger Dreamweaver - den skal opdatere 1 felt i databasen
Avatar billede fennec Nybegynder
30. august 2004 - 08:47 #25
Det var noget af en kode til det. Det kan man gøre meget nemmere (og overskueligt) selv. Det var måske noget du skulle kikke på.....

et lille eks:

<%
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.open "En connection string til din database"
conn.execute("UPDATE DinDatabase SET DitFelt='"& request.form("FormNavn") &"', DitDatoFelt=NOW() where id="& request.form("et id"))
%>

Så lidt ASP kode skal der til for at opdatere en række i databasen.
Avatar billede mvk Nybegynder
09. september 2004 - 11:19 #26
fennec - du skal lige have point. jeg holder lidt igen med det dato crap :)
Avatar billede fennec Nybegynder
09. september 2004 - 13:50 #27
ok.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester