SQL & ASP: Datum word steeds op 1/1/1900 gezet

Pagina: 1
Acties:
  • 192 views sinds 30-01-2008
  • Reageer

  • Urk
  • Registratie: Maart 2000
  • Laatst online: 09-08 00:05
Vauit een ASP pagina laat ik de volgende (dynamisch gegenereerde) SQL Query los op een SQL Server 2000 (SP3):

INSERT INTO Users (user_firstname, user_dateofbirth) values ('Harry', 3/6/1979)

De kolom "user_dateofbirth" is van het type smalldatetime

Toch komt er iedere keer in de database 1/1/1900 terecht! :? :? :?
Ikke totaal niet snappe.....iemand een idee...? _/-\o_

  • Urk
  • Registratie: Maart 2000
  • Laatst online: 09-08 00:05
Anyone...? plz.

Verwijderd

Ik werk zelf niet SQL server, maar zo te zien slikt die 3/6/1979 niet.

Probeer eens iets anders, misschien:
INSERT INTO Users (user_firstname, user_dateofbirth) values ('Harry', '3/6/1979')

Of zoek iig ff op wat de juiste manier van invoer is.

  • Ramon
  • Registratie: Juli 2000
  • Laatst online: 07:31
moet je niet bij MS SQL de datum zo ingeven? #3/6/1979# ?

Check mijn V&A ads: https://tweakers.net/aanbod/user/9258/


Verwijderd

misschien:

INSERT INTO Users (user_firstname, user_dateofbirth) values ('Harry', '3/6/1979')

Verwijderd

Tampie schreef op 06 May 2003 @ 08:22:
moet je niet bij MS SQL de datum zo ingeven? #3/6/1979# ?
Dat is bij Ms Access

  • Urk
  • Registratie: Maart 2000
  • Laatst online: 09-08 00:05
Ik snap er nog steeds helemaal niks van, dit alles had ik al geprobeerd!
#datum# genereerd een foutmelding.

Ook de datum andersom keren heeft geen zin, zowieso al omdat ik zeker weet dat op mijn Win 2k Server de datum staat ingesteld als: dd/mm/yyyy

Boven de Query voer ik nog deze ASP code uit:

code:
1
2
userdateofbirth = dob_day & "/" & dob_month & "/" & dob_year
userdateofbirth = CDate(userdateofbirth)

  • Urk
  • Registratie: Maart 2000
  • Laatst online: 09-08 00:05
Als ik trouwens de datum zelf invul in SQL. bijv. 31/12/1982 gaat dit wel goed... 8)7 :?

Verwijderd

waarom probeer je geen "stored procedure" te gebruiken?

  • Urk
  • Registratie: Maart 2000
  • Laatst online: 09-08 00:05
Verwijderd schreef op 06 May 2003 @ 10:45:
waarom probeer je geen "stored procedure" te gebruiken?
Wat bedoel je daar mee? De datum moet uit de keuze van de gebruiker komen, normaal moet dit toch geen enkel probleem zijn...

  • whoami
  • Registratie: December 2000
  • Laatst online: 10:17
Je kan in een stored procedure ook met parameters werken. :)

Heb je het al eens met die # rond de datum geprobeerd? Ik vermoed dat dit bij Sql Server ook moet werken....

Ipv je Sql string te concateneren, kan je waarschijnlijk ook met parameters werken.

https://fgheysels.github.io/


  • Urk
  • Registratie: Maart 2000
  • Laatst online: 09-08 00:05
whoami schreef op 06 mei 2003 @ 10:49:
Je kan in een stored procedure ook met parameters werken. :)

Heb je het al eens met die # rond de datum geprobeerd? Ik vermoed dat dit bij Sql Server ook moet werken....

Ipv je Sql string te concateneren, kan je waarschijnlijk ook met parameters werken.
Yes, zoals ik hierboven al zei: # rond de datum genereerd een foutmelding.
Maar hoe werkt zo'n stored procudure dan, en wat houd dat precies in?

Maar er moet trouwens ook de normale manier zijn.... gewoon de datum inserten net zoals alle andere text die ook goed gaat...

Verwijderd

ah ok. Ik dacht dat het een datum was die automatisch werd gegenereerd.

Je zegt dat je de kolom op smalldatetime hebt gezet, is dit niet de manier hoe de datum getoond wordt? M.a.w. moet je ook het "tijd" gedeelte niet toevoegen aan de datum die je insert? vb: '31/12/2003 23:59:59'

[ Voor 7% gewijzigd door Verwijderd op 06-05-2003 10:56 . Reden: tijd edit ]


Verwijderd

Urk schreef op 06 mei 2003 @ 10:52:
[...]

Yes, zoals ik hierboven al zei: # rond de datum genereerd een foutmelding.
Maar hoe werkt zo'n stored procudure dan, en wat houd dat precies in?

Maar er moet trouwens ook de normale manier zijn.... gewoon de datum inserten net zoals alle andere text die ook goed gaat...
Hallo :?

Heb je het nu al geprobeerd met quotjes om de datum heen, dus '3/6/1979' ipv 3/6/1979. Want dat is nl. de oplossing van je probleem!

  • whoami
  • Registratie: December 2000
  • Laatst online: 10:17
Een stored procedure is een procedure die SQL (T-SQL) statements bevat en bewaard wordt in de databank.
Dmv stored procedures kan je een betere performance verkrijgen, en kan je ook meer veiligheid waarborgen.
Een SP schrijven is betrekkelijk eenvoudig.
Op jouw situatie bv toegepast:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE PROCEDURE InsertUser ( @p_userid          INTEGER OUTPUT,
                              @p_username    VARCHAR(40),
                              @p_dateOfBirth DATE )
AS
BEGIN

  INSERT INTO Users ( user_firstname, user_dateofbirth )
  VALUES
  ( @p_username, @p_dateofbirth)

  --return the generated primkey for this record
  SELECT @p_userid = @@identity FROM users

END


Die procedure kan je dan vanuit je ASP code gaan oproepen ipv het Sql statement vanuit je ASP code aan te roepen.
Je moet in je ASP code natuurlijk nog wel de parameters gaan invullen.

Hoe je dat allemaal doet, lees je best in eoa tutorial ofzo.

[ Voor 3% gewijzigd door whoami op 06-05-2003 11:01 ]

https://fgheysels.github.io/


  • Urk
  • Registratie: Maart 2000
  • Laatst online: 09-08 00:05
Verwijderd schreef op 06 mei 2003 @ 10:57:
[...]


Hallo :?

Heb je het nu al geprobeerd met quotjes om de datum heen, dus '3/6/1979' ipv 3/6/1979. Want dat is nl. de oplossing van je probleem!
Zoveel verstand van SQL heb ik nog wel om te weten dat dat natuurlijk niet werkt, niet negatief bedoelt hoor. Heb het wederom nog een keer geprobeerd (om je toch een plezier te doen ;) ) en krijg dan de volgende foutmelding

Microsoft OLE DB Provider for SQL Server error '80040e07'

The conversion of char data type to smalldatetime data type resulted in an out-of-range smalldatetime value.

/test.asp, line 173


Iets tussen quotes '' word namelijk opgevat als text.

  • whoami
  • Registratie: December 2000
  • Laatst online: 10:17
Neen, niet als text, maar als een ongeldige datum....

https://fgheysels.github.io/


  • Urk
  • Registratie: Maart 2000
  • Laatst online: 09-08 00:05
whoami schreef op 06 May 2003 @ 11:21:
Neen, niet als text, maar als een ongeldige datum....
Kan ook, in ieder geval een datum tussen '' werkt niet :)

  • Batsies
  • Registratie: Mei 2002
  • Laatst online: 27-01-2022

Batsies

E-Developing

Sla de datum is op als 19790306 voer dat is in bij de datum en kijk is wat hij in de database zet!

[ Voor 4% gewijzigd door Batsies op 06-05-2003 11:38 . Reden: Typo in datum! ]

E-Developing


  • pistole
  • Registratie: Juli 2000
  • Laatst online: 12:01

pistole

Frutter

Urk schreef op 06 May 2003 @ 11:25:
[...]


Kan ook, in ieder geval een datum tussen '' werkt niet :)
hallo

je moet de datum tussen apostrophes zetten.
De foutmelding
The conversion of char data type to smalldatetime data type resulted in an out-of-range smalldatetime value
komt doordat je kennelijk een verkeerde dag/maand combinatie hebt.

Overigens: hoe connect je naar je database? ODBC kan ook nog wel eens wat converteren enzo...

kijk maar:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/*-----------------------------
create table blaffertje (
    blafveld varchar(10),
    datumveld datetime
)
insert into blaffertje (blafveld, datumveld) values ('blaat', '3/6/1979')
go
-----------------------------*/

(1 row(s) affected)

/*-----------------------------
select * from blaffertje
go
-----------------------------*/
blafveld   datumveld                                              
---------- ------------------------------------------------------ 
blaat      1979-03-06 00:00:00.000

(1 row(s) affected)

[ Voor 37% gewijzigd door pistole op 06-05-2003 11:42 ]

Ik frut, dus ik epibreer


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 14:17

TeeDee

CQB 241

Net als wat pistole zegt (alleen gebruikt TS een smalldatetime :))
code:
1
INSERT into dbo.Woei (naam, datum) VALUES ('Harry', '04/13/1979')
Werkt gewoon.
'13/04/1979' geeft bij mij de zelfde error, maar dat heeft dus met je systeemsettings te maken. Als het voor een webapp is, moet je rekening houden met je Session.LCID natuurlijk!

Heart..pumps blood.Has nothing to do with emotion! Bored


  • Urk
  • Registratie: Maart 2000
  • Laatst online: 09-08 00:05
Ja maar hoe kan het dan, in je systeem settings heb ik ingesteld dat datum door het hele systeem staat als: dag/maand/jaar

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 14:17

TeeDee

CQB 241

ms SQL heeft zijn eigen settings?

Heart..pumps blood.Has nothing to do with emotion! Bored


Verwijderd

INSERT INTO Users (user_firstname, user_dateofbirth) values ('Harry', '3/6/79')

Probeer dit eens.

  • j_du_pee
  • Registratie: Maart 2000
  • Laatst online: 23-09-2024

j_du_pee

du pain, du vin, du pee

Urk schreef op 06 May 2003 @ 11:58:
Ja maar hoe kan het dan, in je systeem settings heb ik ingesteld dat datum door het hele systeem staat als: dag/maand/jaar
weergave != het formaat waarin het op wordt geslagen.
Datums worden als aantal seconden sinds start (1-jan-1900) opgeslagen.
- 3/6/1979 (drie gedeelddoor 6 enz...) is kleiner dan 1 seconde na 1 jan. de datum die je dan opslaat is dus 12u 'snachts 1900

als je 6-3-1979 opslaat krijg je waarschijnlijk een dag in december 1899

de oplossing is dan ook allang gegeven IMHO, je moet de datum quoten. Of dat met ' of met # is, lijkt mij met enig debugwerk toch wel uit te vinden ;)

kaart != map && bottel != fles
Wacht op antwoord


Verwijderd

Welkom in de wondere wereld van de datm/tijd notatie

Je hebt te maken met de notatie van de gebruiker
van IIS
van SQL
en van ODBC
Ga maar eens leuk testen van 1/3/2003
is dat 1 maart of 3 januari
En doe dat testen eens met verschillend clientsettings
lachen

  • Batsies
  • Registratie: Mei 2002
  • Laatst online: 27-01-2022

Batsies

E-Developing

Verwijderd schreef op 06 May 2003 @ 15:08:
Welkom in de wondere wereld van de datm/tijd notatie

Je hebt te maken met de notatie van de gebruiker
van IIS
van SQL
en van ODBC
Ga maar eens leuk testen van 1/3/2003
is dat 1 maart of 3 januari
En doe dat testen eens met verschillend clientsettings
lachen
En wat draagt dit bij aan dit topic?

E-Developing


  • cimbom
  • Registratie: Juni 2001
  • Laatst online: 26-04-2024

cimbom

Just Kidding

Je kunt het beste datum wel tussen enkele quetos zetten + datum notatie duidelijk meegeven. Ik bedoel bij 31/8/1982 sbnapt ie wel dat 31 dag is 8 maand enzovoort,maar bij 1/3/1982 zal het niet weten welke maand is en welke dag dus gebruikt het zijn standaard instelling en die is mm/dd/yyyy dacht ik. Dus datum naar SQL altijd zo meegeven : '1-MAR-1982' dan zal het ook altijd goed gaan.

edit: met dit notatie heb je dus geen probleem met watnou duidelijk probeert te maken

[ Voor 12% gewijzigd door cimbom op 06-05-2003 15:18 ]


  • Urk
  • Registratie: Maart 2000
  • Laatst online: 09-08 00:05
Verwijderd schreef op 06 May 2003 @ 15:08:
Welkom in de wondere wereld van de datm/tijd notatie

Je hebt te maken met de notatie van de gebruiker
van IIS
van SQL
en van ODBC
Ga maar eens leuk testen van 1/3/2003
is dat 1 maart of 3 januari
En doe dat testen eens met verschillend clientsettings
lachen
Je inderdaad... IIS heb ik niks mee te maken, ODBC ook niet want ik gebruik OLEDB.
Het zijn 3 selectboxen, 1 voor dag, 1 voor maan, en ja je raadt het natuurlijk al 1 voor jaar :P

  • Urk
  • Registratie: Maart 2000
  • Laatst online: 09-08 00:05
Nou het is dan eindelijk gelukt!
Het was inderdaad, dag & maand omdraaien, dus mm/dd/yyyy en dat dan weer tussen Quotes! Heel vreemd, toch weer eigenwijs dat ik dat niet geloofde, SORRY :P

Maar, dan toch nog een vraag hierover.
Is het mogelijk ergens (in SQL?) in te stellen dat ik de datum stuur als dd/mm/yyyy i.p.v. mm/dd/yyyy ????

  • Batsies
  • Registratie: Mei 2002
  • Laatst online: 27-01-2022

Batsies

E-Developing

of dat in te stellen is weet ik niet, maar als het voor het weergeven is, dan kan je ook via datepart, het deel van de datum eruit halen en dan plaatsen in de goede volgorde, ik weet alleen niet of je dit bedoelt?

E-Developing


  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

cimbom schreef op 06 May 2003 @ 15:16:
Dus datum naar SQL altijd zo meegeven : '1-MAR-1982' dan zal het ook altijd goed gaan.
Dit werkt niet altijd, aangezien dit nog steeds afhankelijk is van de taal settings van de database (niet alle maandcodes zijn gelijk in alle talen).


Even kort samengevat voor de TS:
  • datums worden in MSSQL omsloten met enkele quotes
  • geef een datum altijd op in de ISO notatie
En dit laatste punt is al vaker langsgekomen (ook recent nog): [rml]Annie in "[ MSSQL] Structurele oplossing datum/tijd"[/rml].

[ Voor 7% gewijzigd door Annie op 06-05-2003 17:29 . Reden: foutje in quote ]

Today's subliminal thought is:


  • whoami
  • Registratie: December 2000
  • Laatst online: 10:17
Ik geloof dat, als je parameters gebruikt in je Sql string, je je niets hoeft aan te trekken van het datumformaat. Dit in tegenstelling tot wanneer je je SQL string dynamisch dmv concatenatie gaat gaan opbouwen.

https://fgheysels.github.io/


  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

Je zal dan toch nog steeds de parameter van een waarde moeten voorzien? Of zie ik dat nu fout? M.i. verleg je dus alleen het probleem naar een ander deel van je applicatie.

Today's subliminal thought is:


  • whoami
  • Registratie: December 2000
  • Laatst online: 10:17
Ja, je moet die parameter nog van een waarde voorzien, maar ik denk niet dat je je bezig zult moeten gaan houden met het formaat van die datum dan.
Ik zal het ff uittesten.

Ik heb het net ff geprobeerd, en mijn stelling klopt.
Ik heb een tabel die er als volgt uit ziet (MS SQL Server)

PrimKey : integer, autonumber
EenDatum : datetime

Mijn stored procedure doet niets anders dan een record inserten:

code:
1
2
3
4
5
6
7
8
9
CREATE PROCEDURE InsertRecord ( @p_Datum DATETIME )
AS
BEGIN

  INSERT INTO myTabel ( EenDatum ) 
  VALUES
  ( @p_datum )

END


Ik heb de procedure als volgt aangeroepen:

code:
1
2
EXEC InsertRecord  '1976-01-12' ;
EXEC InsertRecord '12-05-1982';

Dit leverde iedere keer een juist resultaat op. (Query Analyzer)

Echter, als ik in Query Analyzer het volgende doe:
code:
1
EXEC InsertRecord '14-12-1978';

dan krijg ik een fout.
DD-MM-YYYY wordt blijkbaar niet herkend.
code:
1
EXEC InsertRecord '12-14-1978'

werkt dan weer wel.

Note dat m'n date-separator op '-' staat.

Ik heb dan ook eens geprobeerd om die procedure vanuit C# uit te voeren:
code:
1
2
3
4
5
6
7
8
9
10
SqlCommand cmd = new SqlCommand ();
cmd.Connection = conn;
cmd.CommandText = "insertorder";
cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters.Add ("@p_date",    SqlDbType.DateTime);

cmd.Parameters["@p_date"].Value    = "14/12/1985";

cmd.ExecuteNonQuery();


Hier werkt het formaat DD/MM/YYY dus wel. Let er ook op dat ik hier / gebruik als date-separator, terwijl m'n date-separator op '-' staat.

[ Voor 81% gewijzigd door whoami op 06-05-2003 19:38 ]

https://fgheysels.github.io/


  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

Nu weet ik niet hoe het zit met c#, maar je laat de cast naar een datetime value nu toch over aan de ADO laag? Met de kans op eventuele ambiguïteiten als je geen ISO date gebruikt?

Today's subliminal thought is:


  • whoami
  • Registratie: December 2000
  • Laatst online: 10:17
Hmmm.... goeie vraag.

Ik heb het net ff als volgt getest:
code:
1
cmd.Parameters["@p_date"].Value = "06/05/1988";

en in de databank wordt het geinserted als:
code:
1
1988-05-06

Dat verloopt dus goed. Ik denk dat er ook gekeken wordt naar de regional settings om die cast te doen.....

https://fgheysels.github.io/


  • Urk
  • Registratie: Maart 2000
  • Laatst online: 09-08 00:05
Kijk! Na veel lezen in de SQL Server 2000 Help is dit nog een veel betere oplossing:

SET DATEFORMAT dmy
Zet het formaat op dmy, draai dus dit direct voor een INSERT query en werkt perfect!

  • guyvdn
  • Registratie: Maart 2003
  • Laatst online: 18-06 20:15

guyvdn

Eagle

Je kan een datum altijd best inserten in het volgende formaat : yyyy/mm/dd dan ben je er zeker van dat hij goed wordt toegevoegd.

To deny our own impulses is to deny the very thing that makes us human


  • whoami
  • Registratie: December 2000
  • Laatst online: 10:17
whoami schreef op 06 mei 2003 @ 21:57:
Hmmm.... goeie vraag.

Ik heb het net ff als volgt getest:
code:
1
cmd.Parameters["@p_date"].Value = "06/05/1988";

en in de databank wordt het geinserted als:
code:
1
1988-05-06

Dat verloopt dus goed. Ik denk dat er ook gekeken wordt naar de regional settings om die cast te doen.....
Een ideale situatie hier is natuurlijk dat je een datetime object gebruikt ipv een string.

https://fgheysels.github.io/

Pagina: 1