Avatar billede moso Nybegynder
30. juni 2003 - 14:59 Der er 71 kommentarer og
2 løsninger

Sortering ved hjælp ad dato.

Jeg skal have vurderet mine records efter Date().
Jeg har tre felter: Dag (1-31), måned(1-12) og år.
Jeg kan ikke lige gennemskue hvordan jeg kan sortere mine records så de records der er ældre end i dag ikke kommer med.
Nogen gode ideer
Avatar billede gertp Nybegynder
30. juni 2003 - 15:07 #1
hvis du laver et datofelt i stedet for så kan du skrive:
select * from dintabel where datofelt >= 'now()'
Avatar billede moso Nybegynder
30. juni 2003 - 15:09 #2
det ved jeg, men nu har jeg ikke et dato felt, men som beskrevet ovenfor tre felter: dag, måned og år. Det er der problemet ligger.
Jeg vil beholde disse tre felter.
Avatar billede cesil Nybegynder
30. juni 2003 - 15:14 #3
d = 30
m = 06
yy = 2003
           
sql = "select * from tabel  " & _
" WHERE " & _
" (DATEPART(d, datetime)>'" & d & "') " & _
" AND (DATEPART(m, datetime)>'" & m & "') " & _
" AND (DATEPART(yy, datetime)>'" & yy & "') "
Avatar billede moso Nybegynder
30. juni 2003 - 15:16 #4
vender tilbage senere idag
Avatar billede carpediem Nybegynder
30. juni 2003 - 15:30 #5
cesil>> Hvad så hvis der er tale om den 1/7/2003, så finder din funk. det ikke.
Har ikke selv lige nogen umiddelbar løsning, men det der vil ikke virke
Avatar billede nielle Nybegynder
30. juni 2003 - 15:36 #6
Absolut utestet:

SQL = "SELECT * FROM MyTable WHERE CAST(Year||'-'||Month||'-'||Day) AS DATE >= NOW()"
Avatar billede nielle Nybegynder
30. juni 2003 - 15:37 #7
Det er nu under alle omstændigheder mere et SQL spørgsmål end et ASP ditto.
Avatar billede cesil Nybegynder
30. juni 2003 - 15:46 #8
hvad med

sql = "SELECT DATEDIFF(day," & yy & m & d " &", now()) AS no_of_days
FROM tabel"
Set oRs = oConn.Execute(sql)
if oRs("no_of_days")>0 then

end if
Avatar billede hossein Nybegynder
30. juni 2003 - 16:01 #9
Er det M$Access som du bruger? hvis ja så skal du sætte din kolonner sammen i en forspørgsel (Query) i selve access i design. Også kalder du fra dinASP side denne forspørgsel (Query). Din Query er noget i den retning:
Select (dag &"-"&måned&""&år) as minDato From minTabel
og din Query fra din ASP side:
select * from minTabel where minDato >= 'now()'
Avatar billede hossein Nybegynder
30. juni 2003 - 16:04 #10
minTabel er navnet på din Query i:
select * from minTabel where minDato >= date()
og det skal vær Date og ikke Now.
Avatar billede moso Nybegynder
30. juni 2003 - 16:57 #11
jeg kigger på jeres forslag senere iaften.
 
hossein: MS Server.
Avatar billede hossein Nybegynder
30. juni 2003 - 20:31 #12
OK, hvad med at lave en temp table, også indsætte data i den?
Avatar billede moso Nybegynder
30. juni 2003 - 20:32 #13
Det lyder som en god ide, hvordan?
Avatar billede moso Nybegynder
30. juni 2003 - 20:41 #14
Min egen ide gik i den her retning:
Tempdate: <%
Dim  Tempdate
Tempdate = (aktivitet.Fields.Item("Slutdato_dag").Value)&"-"&(aktivitet.Fields.Item("Slutdato_maaned").Value)&"-"&(aktivitet.Fields.Item("Slutdato_aar").Value)
Response.Write(Tempdate)
%>
er
<% If Tempdate < Date() Then %>
større end
<% Else %>
mindre end
<% End If %>
<%= Date() %>

Men den fanger ikke værdien rigtigt. Den skriver bare mindre end ved alle datoerne. Kan det overhovedet lade sig gøre på den måde jeg foreslår?
Avatar billede hossein Nybegynder
30. juni 2003 - 21:00 #15
Hvad med denne her:
select * from minTabel
where måned >= month(now)
and år >= year(now)
and dag > day(now)
Avatar billede nielle Nybegynder
30. juni 2003 - 21:14 #16
hossein -> Den vil f.eks. fejle med 1/1-2004.

Opgaven kan ikke løses ved at teste på dag, måned eller år hver for sig selv - de *skal* samles til en hel dato først.
Avatar billede nielle Nybegynder
30. juni 2003 - 21:17 #17
moso -> Du kan enten løse opgaven i SQL-delen (det er det min 15:36:20 forsøger) eller du kan trække alle datoerne ud og så fjerne de uønskede i ASP-delen. Hvilken metode ville du foretrække?
Avatar billede hossein Nybegynder
30. juni 2003 - 21:22 #18
Det tror jeg ikke at den vil give fejl ved 1/1-2004 fordi alle 3 betingelser skal være opfyldt. Skriv 3 eller 4 af din rækker så kan jeg se hvad din tabel indeholder.
Avatar billede cesil Nybegynder
30. juni 2003 - 21:29 #19
har du prøvet min ide?

sql = "SELECT DATEDIFF(day," & yy & m & d " &", now()) AS no_of_days
FROM tabel"
Set oRs = oConn.Execute(sql)
if oRs("no_of_days")>0 then

end if
Avatar billede nielle Nybegynder
30. juni 2003 - 21:32 #20
hossein -> Så prøv lige at forklare hvorfor 1/1-2004 ikke skulle blive sorteret fra? Den ville jo f.eks. aldrig opfylde delbetingelsen dag > day(now)

Datoen 1/1-2004 skulle jo netop ikke sorteres fra.
Avatar billede nielle Nybegynder
30. juni 2003 - 21:42 #21
cesil -> Måske skulle du lige tjekke syntaksen. Specielt når du nu poster den anden gang:

sql = "SELECT DATEDIFF(day, " & yy & "-" & m & "-" & d & ", now()) AS no_of_days FROM tabel"
Set oRs = oConn.Execute(sql)
if oRs("no_of_days")>0 then
  ....
end if

For det første ville den oprindelige version give fejl ved ...m & d " &", now()...

For det andet så ville din ...yy & m & d... give en ret ubrugbar del-streng (200367 for i dag) - ubrugbar idet SQL gerne vil have bindestreg mellem de enkelte komponenter af datoen (2003-06-30).
Avatar billede hossein Nybegynder
30. juni 2003 - 21:47 #22
hvis i dag er som er 30-06-2003 kommer 1-1-2004 og bliver ikke sorteret fra. Jeg ved ikke hvordan du læser det.
Avatar billede nielle Nybegynder
30. juni 2003 - 21:56 #23
Hvis vi bruger dit eksempel på de to datoer, så bliver SQL-strengen:

select * from minTabel where 1>=6 and 2004>=2003 and 1>30

Jeg tror faktisk at den vil fejle på både 1>=6 og 1>30.
Avatar billede moso Nybegynder
30. juni 2003 - 21:58 #24
nielle: Jeg vil helst sortere i asp.
Avatar billede moso Nybegynder
30. juni 2003 - 22:01 #25
Mit foreslag giver dette resultat:
Tempdate: 31-5-2003 er mindre end 30-06-2003 
Tempdate: 18-6-2003 er mindre end 30-06-2003 
Tempdate: 12-8-2003 er mindre end 30-06-2003 
Tempdate: 16-8-2003 er mindre end 30-06-2003 

Hvilket jo ikke er sandt.
Men jeg er enig med dig i at der ikke bare kan sorteres på de enkelte datoer, men at det skal samles først. Spørgsmålet er så bare hvordan...
Avatar billede cesil Nybegynder
30. juni 2003 - 22:03 #26
moso --> Prøv nu min, den virker når syntaxfejlene er rettet ;-)
Avatar billede moso Nybegynder
30. juni 2003 - 22:03 #27
cecil: Det kunne jeg ikke få til at køre...
Avatar billede cesil Nybegynder
30. juni 2003 - 22:04 #28
nielle har vist rettet dem :-)

sql = "SELECT DATEDIFF(day, " & yy & "-" & m & "-" & d & ", now()) AS no_of_days FROM tabel"
Set oRs = oConn.Execute(sql)
if oRs("no_of_days")>0 then
  ....
end if
Avatar billede cesil Nybegynder
30. juni 2003 - 22:05 #29
hvad får du af fejl
Avatar billede moso Nybegynder
30. juni 2003 - 22:05 #30
cesil: syntaxfejlene?
Avatar billede cesil Nybegynder
30. juni 2003 - 22:05 #31
prøv og kom med din sql
Avatar billede cesil Nybegynder
30. juni 2003 - 22:06 #32
og syntaxfejlen ja
Avatar billede moso Nybegynder
30. juni 2003 - 22:06 #33
Fejl:
unclosed quotationmark before the character string...
Avatar billede moso Nybegynder
30. juni 2003 - 22:07 #34
SELECT *
FROM dbo.Aktivitetskalender_2003
ORDER BY Startdato_aar ASC, Startdato_maaned ASC, Startdato_dag ASC
Avatar billede cesil Nybegynder
30. juni 2003 - 22:07 #35
lad mig se din sql
Avatar billede nielle Nybegynder
30. juni 2003 - 22:07 #36
Session.LCID = 1030  ' Sæt til dansk datoformat

SQL = "SELECT Day, Month, Year FROM MyTable ORDER BY Year, Month, Day"
rs = Conn.Execute(SQL)

do while not rs.eof
  DatoFraDB = CDate(rs("Day") & "-" & rs("Month") & "-" & rs("Year"))
  if DatoFraDB > Date() then
    ' Her gør du det du vil med datoerne
  end if
  rs.MoveNext
loop
Avatar billede nielle Nybegynder
30. juni 2003 - 22:08 #37
Ovenstående eksempel går ud fra at du har kaldt de tre felter for hhv. Day, Month og Year.
Avatar billede nielle Nybegynder
30. juni 2003 - 22:08 #38
Men, det er nu mest effektivt at gøre det i SQL-delen.
Avatar billede hossein Nybegynder
30. juni 2003 - 22:10 #39
nielle>> du har ret det skulle vær or isted for and. jeg prøvede med denne her og giver svar det er godt nok med access men:
<%@ Language=VBScript %>
<%session.LCID = 1030%>
<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
</HEAD>
<BODY>

<%
DSN = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" &server.mappath("minDB.mdb")
Set conn = Server.CreateObject("ADoDB.Connection")
conn.open DSN
set rs = server.CreateObject("ADODB.recordset")

strSQL = "Select * from Tabel where dag > day(date()) or måned >= month(date()) or år >= year(date())"

rs.Open strSQL, conn

do while not rs.EOF%>
<%=rs("dag")%>&nbsp;&nbsp;<%=rs("måned")%>&nbsp;&nbsp;<%=rs("år")%>
<%rs.MoveNext

loop
%>

</BODY>
</HTML>
Avatar billede moso Nybegynder
30. juni 2003 - 22:12 #40
hossein: Jeg ved ikke om det har nogen betydning, men jeg kører på en MS server, ike Access.
Avatar billede moso Nybegynder
30. juni 2003 - 22:12 #41
Nielle: Hvordan kan det se ud i sql? Hvis det er lettere så er jeg lutter øre...
Avatar billede hossein Nybegynder
30. juni 2003 - 22:14 #42
bare lav om på din connection
Avatar billede nielle Nybegynder
30. juni 2003 - 22:14 #43
hossein -> Nej det dur skam heller ikke med or. Den ville f.eks. godkende datoen 12/12-2000:

select * from minTabel where 12>=6 or 2000>=2003 and 12>30

Success på 12>=6
Avatar billede nielle Nybegynder
30. juni 2003 - 22:15 #44
moso -> Har du da slet ikke prøve min 15:36:20?
Avatar billede hossein Nybegynder
30. juni 2003 - 22:16 #45
jeg mener i sted for den:
DSN = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" &server.mappath("minDB.mdb")
Set conn = Server.CreateObject("ADoDB.Connection")

resten er ens.

skal du ha connection til din msSQL database, har du ikke den allerede
Avatar billede nielle Nybegynder
30. juni 2003 - 22:19 #46
hossein -> Din:

strSQL = "Select * from Tabel where dag > day(date()) or måned >= month(date()) or år >= year(date())"

- er vis sammenblanding af ASP ind i SQL-strengen...
Avatar billede hossein Nybegynder
30. juni 2003 - 22:20 #47
Sådan laver du forbindelse til msSQL:
DSN = "Provider=SQLOLEDB;Data Source=xxxx;UID=xxxx;PWD=xxxx;DATABASE=xxxx"
Set conn = Server.CreateObject("ADoDB.Connection")
conn.open DSN
...
Avatar billede moso Nybegynder
30. juni 2003 - 22:20 #48
Jo, den duer ikke ;-)
Avatar billede hossein Nybegynder
30. juni 2003 - 22:22 #49
nielle>> jo det er det, men hvad tænker du på? :)
Avatar billede nielle Nybegynder
30. juni 2003 - 22:22 #50
moso -> Kunne du ikke hjælpe lidt og beskrive hvad der sker? Fejlkoder? Eller bare forkerte resultater?
Avatar billede hossein Nybegynder
30. juni 2003 - 22:23 #51
det kan ikke passe! :)) hvad får du?
Avatar billede moso Nybegynder
30. juni 2003 - 22:25 #52
Nielle: Det virker nu:
Tempdate: 31-05-2003 er mindre end 30-06-2003 
Tempdate: 18-06-2003 er mindre end 30-06-2003 
Tempdate: 12-08-2003 er større end 30-06-2003 
Tempdate: 16-08-2003 er større end 30-06-2003 
Jeg kan ikke give dig point, hvorfor?
Avatar billede moso Nybegynder
30. juni 2003 - 22:25 #53
Og 1000 tak forresten
Avatar billede nielle Nybegynder
30. juni 2003 - 22:27 #54
hossein -> Jeg tænker på at det slet ikke ville virke! Databasen forstår jo ikke ASP koden.

Den skal rettes til:

"Select * from Tabel where dag > " & day(date()) & " or måned >= " & month(date()) & " or år >= " & year(date())

Den grundlæggende konstruktion med 'or' er imidlertid også forkert (22:14:45) men det er en anden sag.
Avatar billede moso Nybegynder
30. juni 2003 - 22:27 #55
Jeg skulle bare lige have koden sat rigtigt op, du ved, lidt for mange tommelfingre...
Avatar billede nielle Nybegynder
30. juni 2003 - 22:28 #56
Fordi jeg ikke har lagt et svar. cesil bør dog også have nogle - unden at være sikker så burde hans løsning også fungere.
Avatar billede hossein Nybegynder
30. juni 2003 - 22:29 #57
nielle>> nej det passer ikke (30/06-2003 22:14:45), den trækker rigtig ud!
Avatar billede moso Nybegynder
30. juni 2003 - 22:29 #58
ok
Avatar billede nielle Nybegynder
30. juni 2003 - 22:31 #59
hossein -> Din SQL ville også trække 12/12-2000 ud. Det er ikke rigtigt!
Avatar billede moso Nybegynder
30. juni 2003 - 22:35 #60
hossein: Din løsnning duer ikke fordi man ikke bare kan sortere dem individuelt. Som nielle skriver giver det mange fejl, selv om man lavede en del if-sætninger, vil det stadig være en kompliceret affære.
Den anden løsning virkede efter hensigten fordi datoen blev sat sammen, og derefter kunne sammenlignes, men tak for forsøget alligevel.
Avatar billede hossein Nybegynder
30. juni 2003 - 22:35 #61
nielle> nej, den trækker rigtig ud, har du prøvet med msAccess, jeg har lagt nogle data og svaret er korrekt.
output:
10  10  2003
1  7  2003
Avatar billede hossein Nybegynder
30. juni 2003 - 22:36 #62
det virker fint med msAccess lige nu har ikke adgang til msSQL. men det var så lidt.
Avatar billede nielle Nybegynder
30. juni 2003 - 22:38 #63
hossein -> Hvilke datoer har du puttet i databasen?
Avatar billede hossein Nybegynder
30. juni 2003 - 22:42 #64
også 12-12-2000
Avatar billede nielle Nybegynder
30. juni 2003 - 22:48 #65
Så *forklar* mig lige hvorfor at:

SELECT * from Tabel WHERE 12>30 OR 12>7 OR 2000>2003

- ikke spytter noget ud?! OR delen er sand lige så snart en af komponenterne er sand. Og 12>7 er altså sand.
Avatar billede hossein Nybegynder
30. juni 2003 - 22:54 #66
min kode er her, lav en tabel i access og prøv den og glem ikke =:
strSQL = "Select * from Tabel where dag > day(date()) or måned >= month(date()) or år >= year(date())"
og moso skrev: "de records der er ældre end i dag ikke kommer med." dvs alt i fremtiden :) dvs alt hvad han har i sin tabel: ALT>30-06-2003
Avatar billede nielle Nybegynder
30. juni 2003 - 23:02 #67
hossein -> Det der er *ikke* din kode. Der er igen blandet ASP ind i SQL-strengen. Hvorfor klipper du ikke koden ud fra det ASP-scipt du rent faktisk køre?

Og uanset om du har =-tegn med i din kode, så vil:

"Select * from Tabel where dag > 30 or måned >= 6 or år >= 2003"

- stadig også spytte en dato som 12/12-2000 ud. Hvis den ikke gør det, så har du en fejl i din Access - for det *skal* den gøre!
Avatar billede hossein Nybegynder
30. juni 2003 - 23:05 #68
det kan godt vær at det er fejl i access det er dansk, måske, men det virker.
Avatar billede nielle Nybegynder
30. juni 2003 - 23:09 #69
Hvis den ikke udføre SQL-sætningerne korrekt - så virker den sgu ikke.
Avatar billede hossein Nybegynder
30. juni 2003 - 23:16 #70
12-12-2003
Select * from Tabel where 12> 30 or 12>= 6 or 2000 >= 2003
da 2000 er ikke større eller lige med 2003 opfylder ikke kriterie ergo den er falsk
Avatar billede nielle Nybegynder
01. juli 2003 - 07:15 #71
1) Ved "or" skal bare et af deludsagnene være sandt (f.eks. 12>6) før det hele er sandt.

2) Ved "and" skal alt sammen være sandt før det hele er sandt.
Avatar billede carpediem Nybegynder
01. juli 2003 - 08:48 #72
Hvis man skal løse det på nemmeste vis, så vil det være, at trække alt ud, og så sortere fra i ASP. Det er desværre også det der performer dårligst.
Men her er den løsning:
y = Datepart("yyyy", now)
m = DatePart("m", now)
d = DatePart("d", now)
If rs("Year") > y Then
  'Skal vises
ElseIf rs("Year") = y Then
  If rs("Month") > m Then
    'Skal vises
  ElseIf rs("Month") = m Then
    If rs("Day") >= d Then
      'Skal vises
    End If
  End If
End If
Avatar billede carpediem Nybegynder
01. juli 2003 - 09:20 #73
Hovsa.
Sidste del kom ikke med, men det kommer så her.
Og det kan man så med lidt logik omskrive til en sql streng. Måske ikke den kønneste, men den virker, og er hurtigere end at gøre det i ASP.

SELECT * FROM Table WHERE (Year > DatePart("yyyy", GetDate())) OR (Year = DatePart("yyyy", GetDate()) AND Month > DatePart("m", GetDate())) OR (Year = DatePart("yyyy", GetDate()) AND Month = DatePart("m", GetDate()) AND Day >= DatePart("d", GetDate()))
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
Kurser inden for grundlæggende programmering

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