webForumDet fria alternativet

Använda Left() i ett villkor?

Databaser & SQL

17 svar · 549 visningar · startad av evilaid

Medlem sedan apr. 2009433 inlägg
Frågan#1

Hej igen

Ska man inte kunna använda left()funktionen i ett villkor?

Provade

SELECT     * 
FROM hits
WHERE  LEFT(c_date,10) = '2009-10-13'

c_date har formatet date/time så de första 10 tecknen är ju datumet..

Medlem sedan juni 200032 967 inlägg
#2

Du ska inte använda strängfunktioner som LEFT på datum - du vet inte hur datumet är lagrat. Använd datumfunktioner istället.

Medlem sedan mars 20007 896 inlägg
#3

Med andra ord;

select
    *
from
    hits
where
    date_format(c_date, '%y-%m-%d') = '2009-10-13'

I MySQL.

Medlem sedan apr. 2009433 inlägg
#4

klantigt av mig att inte skriva med att det är MS sql som används... Hur skulle det se ut?

@nders: Förstår inte vad du menar med att jag inte vet hur dte är lagrat? Jag har ju sj angett i databasen formatet, eller?

Medlem sedan mars 20007 896 inlägg
#5

Jag är lite osäker då jag inte sitter så mycket vid SQL Server. SQL Server har sämre utbud av datumfunktioner som jag har förstått det, men det borde kunna lösas med 'convert'.

select
    *
from
    hits
where
    convert(char(8), c_date, 112) = '20091013'

Det verkar inte som att 'convert' kan hantera speciellt många datumformat, YYYY-mm-dd verkar inte finnas tillgängligt.

Medlem sedan juni 200032 967 inlägg
#6

Hur har du angett formatet?

Jag hoppas bara att du inte menar att du lagrar datum i varchar-fält eller liknande. :)

Medlem sedan apr. 2009433 inlägg
#7

hahahha, jag blir osäker nu...

Jag har ju valt date/time format i tabellen så det sparas ju i formatet 2009-09-10 12:00:00.. Tror ja?

Medlem sedan apr. 2009433 inlägg
#8

Hittade en funktion som heter format på wschools men får bara felmeddealnde i visual studio att det inte känner igen funktionen??

Medlem sedan juni 200032 967 inlägg
#9

evilaid skrev:

hahahha, jag blir osäker nu...

Jag har ju valt date/time format i tabellen så det sparas ju i formatet 2009-09-10 12:00:00.. Tror ja?

Nej, datum sparas internt av SQL server som två 4-bytes integers.

http://www.sql-server-performance.com/articles/dev/datetime_datatype_p1.aspx

Medlem sedan apr. 2009433 inlägg
#10

Ok ok...

känner du till funktionen format då som inte vill fungera? eller någon anna funktionen så att jag få fram ett specifikt datum?

Medlem sedan juni 200032 967 inlägg
#11

Fungerade inte LarsGs förslag?

Medlem sedan apr. 2009433 inlägg
#12

DATETIME Data is Stored in a Readable Format
Sure!

SELECT CAST(GETDATE() AS BINARY(8)) AS WhatIsReallyStored

WhatIsReallyStored
------------------
0x00009620016CE3A8

(1 row(s) affected)

Lite kul!!

Medlem sedan apr. 2009433 inlägg
#13

hittar inget förslag från LarsG

Medlem sedan mars 20007 896 inlägg
#14

:'( Jag tror (och hoppas!) att @nders menar mig, och inte LarsG.

Självklart är det inte läsligt om du kastar om det till binär representation. Kasta om det till en sträng så kan du antagligen läsa det.

Fungerade inte convert()? _Måste_ du ha det i formatet yyyy-mm-dd, yyyymmdd fungerar inte eller? Du kan plocka ut all information med 'year()', 'month()' eller 'day()' och sätta ihop det till en sträng annars - och jämföra mot in-parametern. 'convert()' är ju däremot mycket smidigare att använda.

Medlem sedan juni 200032 967 inlägg
#15

SPiN skrev:

:'( Jag tror (och hoppas!) att @nders menar mig, och inte LarsG.

Vafan!

Självklart, jag skrev fel - förlåt, Björnis! :'(

Medlem sedan apr. 2009433 inlägg
#16

jag som missade lite... Provade ditt exempel nu och det fungerade fint... Konstigt att det inte går då det i yyyy-mm-dd??

Det är ju det formatet som automatiskt används överallt i min kod...

Medlem sedan mars 20007 896 inlägg
#17

Nu hittade jag till MSDNs referenslista över funktioner, och det går att få i s.k. italiensk stil (yyyy-mm-dd).

select
    *
from
    hits
where
    convert(char(8), c_date, 105) = '2009-10-13'

@nders - no hard feelings. ;)

Medlem sedan apr. 2009433 inlägg
#18

Oj fan va bra!!!
Jag använder session.LCID =1053 så då blir dte ju alltid i det formatet? Trodde det var att man ställde om serverna till svenska formatet?

Tack grabbar för hjälppen...

257 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
127 ms — deklarationer (db)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)