[MSSQL] DateDiff dynamische 'datepart'

Pagina: 1
Acties:

  • xtra
  • Registratie: November 2001
  • Laatst online: 19-11-2025
Neem de volgende functie in MS SQL:

DATEDIFF ( datepart , startdate , enddate )

Voor een query die bepaalde intervallen moet berekenen (eens per 4 weken, eens per 6 maanden etc.) heb ik een query gemaakt die dynamisch de 'datepart' in DATEDIFF invult. Voor het echte werk wil ik deze query omzetten naar MS SQL.

Het probleem is nu dat datepart in Access een tekenreeks is en in MS SQL een soort constante. Zie het verschil:

Access: DATEDIFF ( "ww" , startdate , enddate )
MS SQL: DATEDIFF ( ww , startdate , enddate )
code:
1
2
3
4
5
6
7
SELECT id, 
     startdatum,  /* referentiedatum */
     Datum,       /* huidige datum */
     interval,    /* 1..n */
     periode,     /* ww, mm, yy */
     DateDiff([periode],[startdatum],[Datum]) AS diff
FROM tblService

Mijn vraag is nu hoe je in MS SQL de 'datepart' dynamisch kunt maken.

Uiteraard heb ik al hier en op Google gezocht. Uiteraard kan ik de query ook dynamisch opbouwen of CASE gebruiken, maar dat is m'n laatste redmiddel.

[ Voor 4% gewijzigd door xtra op 25-04-2004 11:47 . Reden: Toevoeging ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:18
Ik snap je probleem (of je vraag) niet echt.

This example determines the difference in days between the current date and the publication date for titles in the pubs database.

code:
1
2
3
4
5
6
7
8
9
USE pubs

GO

SELECT DATEDIFF(day, pubdate, getdate()) AS no_of_days

FROM titles

GO


en days kan je vervangen door year, quarter, month, etc..... (zie de Books Online).

Ach , I see. Maar je can die CASE misschien wel in je functie gebruiken:
code:
1
2
3
4
SELECT DATEDIFF ( CASE @blaat
                                 WHEN 'dd' THEN day
                                 WHEN 'year' THEN year
                               END CASE, ....

Niet getest enzo

[ Voor 30% gewijzigd door whoami op 25-04-2004 12:00 ]

https://fgheysels.github.io/


  • xtra
  • Registratie: November 2001
  • Laatst online: 19-11-2025
whoami schreef op 25 april 2004 @ 11:48:
Ik snap je probleem (of je vraag) niet echt.

This example determines the difference in days between the current date and the publication date for titles in the pubs database.

code:
1
2
3
4
5
6
7
8
9
USE pubs

GO

SELECT DATEDIFF(day, pubdate, getdate()) AS no_of_days

FROM titles

GO


en days kan je vervangen door year, quarter, month, etc..... (zie de Books Online).
Het probleem is dat day, week, month etc. ook een waarde is die uit de database komt.
(En Books Online had ik als eerste bekeken :) )

[ Voor 5% gewijzigd door xtra op 25-04-2004 11:52 ]


  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Voorzover ik weet, kan dat niet dynamisch.
Maar wat is het probleem om een case te gebruiken?

Never underestimate the power of


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
Je komt er niet onderuit dat je bepaalde queries anders moet formuleren, door SQL dialecten, verschillen in beschikbare functies e.d.

Als je je data access laag netjes splitst dan kun je bv een MSSQL en een MSACCESS 'queryprovider' schrijven, die dmv een factory object ( design pattern ) aangemaakt worden, afhankelijk van een opstartswitch oid.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Even zitten prutsen in de Query Analyzer en op deze manier blijkt SQL Server het te pikken:
code:
1
2
3
4
SELECT DATEDIFF ("day", date1, date2),
       DATEDIFF ("month", date1, date2),
       DATEDIFF ("year", date1, date2)
FROM   dbo.table

Never underestimate the power of


  • xtra
  • Registratie: November 2001
  • Laatst online: 19-11-2025
Bedankt voor jullie reacties. Ik heb het nu inderdaad met CASE opgelost.

De redenen waarom het eigenlijk anders moest:
  • Het kan in Access dus waarom niet in MS SQL :)
  • Door CASE te gebruiken wordt de query vier keer zo groot en dus wat ingewikkelder om lezen. Zeker als je ook nog genestte queries gebruikt.
  • Door CASE te gebruiken moet ik iedere variant apart definiëren. In tegenstelling tot Access moet ik dus queries gaan aanpassen bij een mogelijke uitbreiding (die er waarschijnlijk nooit komt.)
Overigens heb ik in dit geval geen behoefte om cross-db te schrijven, dus ik houd het lekker bij MS SQL. Afgezien van dit probleem bevalt dat dialect me prima. Bovendien hoef ik dan niet aan jullie te vragen hoe ik in Access een trigger maak :)

[ Voor 5% gewijzigd door xtra op 26-04-2004 21:31 ]


  • SuperRembo
  • Registratie: Juni 2000
  • Laatst online: 20-08-2025
Waarom maak je geen user-defined function die wel een varchar als eerste argument accepteerd?

| Toen / Nu

Pagina: 1