[sql] type veld voor minuten/uren
Als je uren of minuten o.i.d. moet opslaan in een database als welk (nummer) type zou jij het dan opslaan?
Je wilt bijvoorbeeld een 40 uur durende werkweek opslaan, is 40 dan een int, float, double, decimal, ..?
Bvd
Wil je ook halve of kwart uren kunnen registreren dan zeg ik decimal, wil je alleen hele uren opslaan dan zeg ik integer.
Daarmee kan je heel nauwkeurig mee rekenen.
http://stackoverflow.com/questions/4037777/interval-datatype-in-mysql
Mocht je een PostgreSQL database hebben (werkt fijner dan MySQL vind ik) dan is interval het ideale data type: PT40U
http://www.postgresql.org/docs/9.1/static/datatype-datetime.html
Mocht je een PostgreSQL database hebben (werkt fijner dan MySQL vind ik) dan is interval het ideale data type: PT40U
http://www.postgresql.org/docs/9.1/static/datatype-datetime.html
Bart, Het gaat hier niet om een datum.
Dos, (Helaas) geen postgre, op die stack link die je post noemen ze time?
Kan (en is het wel goed) als time meer dan 23 uur opslaat? Werkweek van 40 uur wordt dan opgeslagen als 40:00:00.
Gewijzigd op 15/04/2014 11:46:59 door Michael -
23 < 838
PS. de shorthand voor PostgreSQL is vreemd genoeg postgres
Ik zal de uren als TIME opslaan.
PS: Thanks ;)
Toevoeging op 15/04/2014 12:12:43:
Heb je daar trouwens een bron van? Geldt die range tot 838 alleen voor MySQL?
Ik zie dat MS Server '12 namelijk range 00:00:00.0000000 tot 23:59:59.9999999 gebruikt.
Het heeft er waarschijnlijk mee te maken dat het -83x uur tot en met +83x aan kan EN tot 6 cijfers achter de komma.
INTERVAL is een ANSI SQL standaard die (voor zover ik weet) jammer genoeg nog niet in SQL Server of MySQL zit.
Je kunt het altijd in het aantal minuten in een int opslaan. minuten lijkt me klein genoeg, als je het daar niet mee eens bent kun je altijd zelf nog iets kleiner kiezen.
PS. bron: http://dev.mysql.com/doc/refman/5.0/en/time.html
Gewijzigd op 15/04/2014 12:44:50 door Dos Moonen
Dus TIME(/INTERVAL) 40:00:00 en niet geschikt voor alle databases
of INT 2400 (40*60)
Ik denk dan toch voor het laatste. Je weet nooit wat voor database er nog is achter komt.
Gewijzigd op 15/04/2014 13:08:56 door Michael -
FETCH FIRST 10 ROWS ONLY is dat wel (SQL:2008) maar MySQL ondersteund dat weer niet (PostgreSQL doet beide, yay!)
Mocht je willen weten hoe verschillende databases het aantal records limiteren:
http://en.wikipedia.org/wiki/Select_%28SQL%29#FETCH_FIRST_clause
Er zullen altijd wel functies zijn die de één wel en de ander niet kent.
Als ik die lijsten zo zie, schommelt het aardig.
Een uitgebreide set van query's die op alle databases werkt, zal onmogelijk zijn.
Maar kies een database, en gebruik de unieke functies voor die wanneer nodig, maar probeer wel zo veel mogelijk volgens de ANSI SQL standaard te werken wanneer mogelijk.
Dat betekend bijvoorbeeld double quotes i.p.v. backticks gebruiken.
Voor MySQL betekend dit dat je connectie moet dan wel in de ANSI_QUOTES mode staan:
Code (php)
1
2
3
4
5
2
3
4
5
// stel de default modus in, voer uit als super user
SET GLOBAL sql_mode = 'ANSI_QUOTES,andere,opties,als,je,dat,wilt';
// stel de modus voor deze connectie in
SET SESSION sql_mode = 'ANSI_QUOTES,andere,opties,als,je,dat,wilt';
SET GLOBAL sql_mode = 'ANSI_QUOTES,andere,opties,als,je,dat,wilt';
// stel de modus voor deze connectie in
SET SESSION sql_mode = 'ANSI_QUOTES,andere,opties,als,je,dat,wilt';
Je zo jezelf leren om correctere SQL te schrijven. MySQL vindt veel goed, maar als je ooit eens met een andere database moet werken kan het heel irritant zijn als je niet weet wat ANSI SQL syntax is en wat MySQL syntax is.
Gewijzigd op 15/04/2014 16:11:05 door Dos Moonen
Quote:
ANSI-standard SQL specifies that each table name must be a single word comprised of alphanumeric characters and the underscore symbol (_)
Zolang je daar aan houdt heb ook niks van doen met double quotes, square brackets of wat dan ook.
Michael - op 15/04/2014 11:41:08:
Pipo, dan denk ik eerder integer. of zijn er ook mensen die 32,5 uur per week werken of zo?
Ja natuurlijk zijn deze er.
Wanneer ik de ene week 32,5 uur werk en de volgende week 47,5 uur dan hoor je mijn baas echt niet klagen.
En ik weet zeker dat er heel erg veel bedrijven zijn waar het zo geregeld is.
Overigens, bij veel bedrijven wordt er ook regelmatig over gewerkt waardoor je zo op 43,25 uur in de week kunt komen.
Ik zie dat het eenvoudig aan je verbinding kan toevoegen.
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
$pdo = new PDO(
$dsn,
$username,
$password,
array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET sql_mode="ANSI,TRADITIONAL"')
);
?>
$pdo = new PDO(
$dsn,
$username,
$password,
array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET sql_mode="ANSI,TRADITIONAL"')
);
?>
Ger; Wat bedoel je?
Pipo; Sorry, ja natuurlijk kan dat :) Ik bedoelde meer als ik vast uren contract van 32,5 uur of zo. Maar met opslaan van minuten als INTEGER is dat ook geen probleem.
Het is de non-profit organisatie die SQL standaardiseert. ANSI SQL is vergelijkbaar met Algemeen Beschaafd Nederlands, MySQL, MsSQL, PostgreSQL etc zijn dan allemaal dialecten.
Is de voorbeeld code die ik gaf door ANSI en TRADITIONAL te setten goed? Of heeft dat weinig zin.
http://dev.mysql.com/doc/refman/5.5/en/sql-mode.html#sqlmode_ansi
om te zien welke modes nu gebruikt worden.
Ik plaatste mijn opmerking op Dos zijn opmerking "double quotes i.p.v. backticks gebruiken"
Als je alleen alfanumierieke karakters en _ in table- en kolomnamen gebruikt én geen gereserveerde woorden, dan hoef je ze niet te omsluiten met wat dan ook.
om te zien welke modes nu gebruikt worden.
Ik plaatste mijn opmerking op Dos zijn opmerking "double quotes i.p.v. backticks gebruiken"
Als je alleen alfanumierieke karakters en _ in table- en kolomnamen gebruikt én geen gereserveerde woorden, dan hoef je ze niet te omsluiten met wat dan ook.
Ger van Steenderen op 16/04/2014 09:58:16:
http://dev.mysql.com/doc/refman/5.5/en/sql-mode.html#sqlmode_ansi
om te zien welke modes nu gebruikt worden.
Ik plaatste mijn opmerking op Dos zijn opmerking "double quotes i.p.v. backticks gebruiken"
Als je alleen alfanumierieke karakters en _ in table- en kolomnamen gebruikt én geen gereserveerde woorden, dan hoef je ze niet te omsluiten met wat dan ook.
om te zien welke modes nu gebruikt worden.
Ik plaatste mijn opmerking op Dos zijn opmerking "double quotes i.p.v. backticks gebruiken"
Als je alleen alfanumierieke karakters en _ in table- en kolomnamen gebruikt én geen gereserveerde woorden, dan hoef je ze niet te omsluiten met wat dan ook.
Verschillende RDMBs hebben verschillende reserved words.
SQL editors willen nog wel eens "identifier hier" een ander kleurtje geven, syntax coloring vind ik erg fijn.
De databases waar ik van tijd tot tijd mee te maken heb kunnen allemaal ingesteld worden om dubbele quotes volgens de ANSI standaard te behandelen.
Anyway, dit is een beetje het zelfde als een IDE war, we gaan het waarschijnlijk niet eens worden.
@Ger; Oke. Backticks gebruik ik sowieso niet en quotes bij tabel namen ook niet.
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
$pdo = new PDO(
$dsn,
$username,
$password,
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET sql_mode='ANSI,TRADITIONAL'")
);
?>
$pdo = new PDO(
$dsn,
$username,
$password,
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET sql_mode='ANSI,TRADITIONAL'")
);
?>
Dat is beter, single quotes zijn voor strings binnen SQL.
Voor de rest ziet het er goed uit.