Har sökt lite i forumet, men inte hittat något (kanske sökt fel...). Jobbar du mot sql-server kan frågan t ex se ut: Jag kör Access som db, och den klagade på följande: Mot Access borde detta fungera. Finns ett alternativt sätt att gå till väga vilket följer sql standarden: Finns ett alternativt sätt att gå till väga vilket följer sql standarden:Datum oavsett år...
Håller på att bygga en sida som ska visa historiska saker som hänt ett specifikt datum...
Dock så undrar jag hur man hämtar information från en tabell i en db (access), som har med dagens datum att göra (oavsett vilket år).
T.ex. vill jag ha ut allt från databasen som finns på XXXX-03-18.
M.a.o. oavsett om det gäller 2004-03-18 eller 1957-03-18...
Hur ska denna SQL-fråga se ut??
Tacksam för svar!
TommySv: Datum oavsett år...
select *
from tbl_History
where ( datePart( dd, HistoricDate ) = datepart (dd, GetDate() ) )
and
( datePart( mm, HistoricDate ) = datepart (mm, GetDate() ) )
HistoricDate är det fält i tabellen om innehåller ditt datum i historien.
GetDate() är en intern funktion i SQL-server och den hämtar dagens datum och tid.
Jämföreslsesatsen tittar först på dag och hämtar de som matchar dag i dagens datum och tid. Sen görs samma sak för månad.Sv: Datum oavsett år...
Undefined Function 'GetDate' in expression
Bytte jag ut GetDate() mot dagens datum (provade både 2004-03-18 och #2004-03-18#), så fick jag frågor om att mata in parametervärde för dd resp. mm...
//TommySv: Datum oavsett år...
<code>
SELECT ... FROM ... WHERE Month(Datum) = " & SöktMånad & " AND Day(Datum) = " & SöktDag</code>
Mvh, JanneSv: Datum oavsett år...
<code>
<%
Function SQLDate(Value)
If IsDate(Value) Then
SQLDate = """" & Year(Value) & "-" & Right("0" & Month(Value), 2) & "-" & Right("0" & Day(Value), 2) & """"
Else
SQLDate = "Null"
End If
End Function
Function SQLTime(Value)
If IsDate(Value) Then
SQLTime = """" & Right("0" & Hour(Value), 2) & ":" & Right("0" & Minute(Value), 2) & ":" & Right("0" & Second(Value), 2) & """"
Else
SQLTime = "Null"
End If
End Function
Function SQLDateTime(Value)
If IsDate(Value) Then
SQLDateTime = """" & Year(Value) & "-" & Right("0" & Month(Value), 2) & "-" & Right("0" & Day(Value), 2) & " " & Right("0" & Hour(Value), 2) & ":" & Right("0" & Minute(Value), 2) & ":" & Right("0" & Second(Value), 2) & """"
Else
SQLDateTime = "Null"
End If
End Function
Dim rs
Dim con
Dim Y
Dim M
Dim D
Dim FirstDate
Dim LastDate
Dim strIn
Dim strSQL
Const strCon = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:\Inetpub\db\DinDatabas"
'Instansier och öpnnar databasen
Set con = Server.CreateObject("ADODB.Connection")
con.Open strCon
'Instansierar recordset
Set rs = Server.CreateObject("ADODB.Recordset")
'Fråga som hämtar största och minsta datument
strSQL = "SELECT Min(DateField) As FirstDate, Max(DateField) As LastDate" & vbCrLf & _
"FROM TableName"
'Öpnnar recordset som retunerar en post
rs.Open strSQL, con
FirstDate = rs("FirstDate")
LastDate = rs("LastDate")
rs.Close
If IsNull(FirstDate) Or IsNull(LastDate) Then
D = Day(Date)
M = Month(Date)
For Y = Year(FirstDate) To Year(LastDate)
strIn = strIn & ", " & SQLDate(DateSerial(Y, M, D))
Next
strIn = Mid(strIn, 3)
strSQL = "SELECT *" & vbCrLf & _
"FROM TableName" & vbCrLf & _
"WHERE DateField IN (" & strIN & ")
rs.Open strSQL, con
Do Until rs.EOF
'Kod
rs.MoveNext
Loop
rs.Close
End If
con.Close
Set con = Nothing
%>
</code>
Denna metoden kanske ser lite krångigare utm. Men prestanda fördelen är mycket stor:
* Man slipper anropa en funktion för varje rad
* Ett Index på kolumnen kan mycket effektivt plocka ut Max och Min samt det poster man angivit.
Detta förutsätter att datumen lagras utan tidsangivelse.Sv: Datum oavsett år...
<code>
<%
Function SQLDate(Value)
If IsDate(Value) Then
SQLDate = """" & Year(Value) & "-" & Right("0" & Month(Value), 2) & "-" & Right("0" & Day(Value), 2) & """"
Else
SQLDate = "Null"
End If
End Function
Dim rs
Dim con
Dim Y
Dim M
Dim D
Dim FirstDate
Dim LastDate
Dim strIn
Dim strSQL
Const strCon = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:\Inetpub\db\DinDatabas"
'Instansier och öpnnar databasen
Set con = Server.CreateObject("ADODB.Connection")
con.Open strCon
'Instansierar recordset
Set rs = Server.CreateObject("ADODB.Recordset")
'Fråga som hämtar största och minsta datument
strSQL = "SELECT Min(DateField) As FirstDate, Max(DateField) As LastDate" & vbCrLf & _
"FROM TableName"
'Öpnnar recordset som retunerar en post
rs.Open strSQL, con
FirstDate = rs("FirstDate")
LastDate = rs("LastDate")
rs.Close
If IsNull(FirstDate) Or IsNull(LastDate) Then
D = Day(Date)
M = Month(Date)
For Y = Year(FirstDate) To Year(LastDate)
strIn = strIn & ", " & SQLDate(DateSerial(Y, M, D))
Next
strIn = Mid(strIn, 3)
strSQL = "SELECT *" & vbCrLf & _
"FROM TableName" & vbCrLf & _
"WHERE DateField IN (" & strIN & ")
rs.Open strSQL, con
Do Until rs.EOF
'Kod
rs.MoveNext
Loop
rs.Close
End If
con.Close
Set con = Nothing
%>
</code>
Denna metoden kanske ser lite krångigare ut. Men prestanda fördelen är mycket stor:
* Man slipper anropa en funktion för varje rad
* Ett Index på datum kolumnen kan mycket effektivt plocka ut Max och Min
* Ett Index på datum kolumnen plockar effektivt ut poster med =, >, <, IN, etc.
Detta förutsätter att datumen lagras utan tidsangivelse.