Vergelyk 'n datum string na Datum tyd in SQL Server?
-
08-06-2019 - |
Vra
In SQL Server Ek het 'n DATETIME
kolom wat 'n tyd element sluit.
Voorbeeld:
'14 AUG 2008 14:23:019'
Wat is die beste metode om net die rekords te kies vir 'n spesifieke dag, ignoreer die tyd deel?
Voorbeeld: (Nie veilig, as dit nie ooreenstem met die tyd deel en terug geen rye)
DECLARE @p_date DATETIME
SET @p_date = CONVERT( DATETIME, '14 AUG 2008', 106 )
SELECT *
FROM table1
WHERE column_datetime = @p_date
Nota: Gegewe hierdie webblad is ook oor jotting notas en tegnieke wat jy optel en dan vergeet, ek gaan my eie antwoord te plaas op hierdie vraag as DATETIME dinge in MSSQL is waarskynlik die onderwerp ek die meeste lookup in SQLBOL.
Update uitgeklaar voorbeeld om meer spesifiek te wees.
Edit Jammer, maar ek het om af-mod verkeerde antwoorde (antwoorde wat verkeerd resultate terugkeer).
@Jorrit:. WHERE (date>'20080813' AND date<'20080815')
sal die 13de en die 14de terug
@wearejimbo: Close, maar geen sigaar badge aan jou toegeken. Jy gemis het rekords geskryf op 14/08/2008 23: 59: 001-23: 59: (. Maw Minder as 1 sekonde voor middernag) 999
Oplossing
Ingenieurswese 1:
DECLARE @p_date DATETIME
SET @p_date = CONVERT( DATETIME, '14 AUG 2008', 106 )
SELECT *
FROM table1
WHERE column_datetime >= @p_date
AND column_datetime < DATEADD(d, 1, @p_date)
Die voordeel hiervan is dat dit 'n indeks gebruik op 'column_datetime' indien dit bestaan.
Ander wenke
In SQL Server 2008, kan jy die nuwe DATUM data type gebruik
DECLARE @pDate DATE='2008-08-14'
SELECT colA, colB
FROM table1
WHERE convert(date, colDateTime) = @pDate
@Guy. Ek dink jy sal vind dat hierdie oplossing skale net mooi. Het jy 'n blik op die navraag uitvoering plan van jou oorspronklike navraag.
En vir myn :
Net vergelyk die jaar, maand en dag waardes.
Declare @DateToSearch DateTime
Set @DateToSearch = '14 AUG 2008'
SELECT *
FROM table1
WHERE Year(column_datetime) = Year(@DateToSearch)
AND Month(column_datetime) = Month(@DateToSearch)
AND Day(column_datetime) = Day(@DateToSearch)
Iets soos hierdie?
SELECT *
FROM table1
WHERE convert(varchar, column_datetime, 111) = '2008/08/14'
Ingenieurswese 2:
DECLARE @p_date DATETIME
SET @p_date = CONVERT( DATETIME, '14 AUG 2008', 106 )
SELECT *
FROM table1
WHERE DATEDIFF( d, column_datetime, @p_date ) = 0
As die veld column_datetime is nie geïndekseer en is dit onwaarskynlik te wees (of die indeks is onwaarskynlik om gebruik te word) dan met behulp van DATEDIFF () is korter.
Goeie punt oor die indeks in die antwoord wat jy aanvaar.
Maar as jy regtig soek net op spesifieke DATE
of DATE ranges
dikwels , dan is die beste oplossing wat ek gevind is om by te voeg 'n ander volgehou berekende kolom om jou tafel wat net die DATE
sou bevat, en voeg indeks op hierdie kolom:
ALTER TABLE "table1"
ADD "column_date" AS CONVERT(DATE, "column_datetime") PERSISTED
indeks Voeg op daardie kolom:
CREATE NONCLUSTERED INDEX "table1_column_date_nu_nci"
ON "table1" ( "column_date" ASC )
GO
Dan sal jou soektog wees selfs vinniger:
DECLARE @p_date DATE
SET @p_date = CONVERT( DATE, '14 AUG 2008', 106 )
SELECT *
FROM table1
WHERE column_date = @p_date
Hierdie funksie Cast (Floor (Cast (GetDate () As Float)) Soos Datum tyd) gee 'n date time data type met die tyd gedeelte verwyder en kan gebruik word as so.
Select
*
Table1
Where
Cast(Floor(Cast(Column_DateTime As Float)) As DateTime) = '14-AUG-2008'
of
DECLARE @p_date DATETIME
SET @p_date = Cast('14 AUG 2008' as DateTime)
SELECT *
FROM table1
WHERE Cast(Floor(Cast(column_datetime As Float)) As DateTime) = @p_date
Hoe om die datum gedeelte van 'n DATETIME veld kry in MS SQL Server:
Een van die vinnigste en netjiesste maniere om dit te gebruik nie
DATEADD(dd, DATEDIFF( dd, 0, @DAY ), 0)
Dit vermy die CPU breker "omskep die datum in 'n string sonder die tyd en dan die omskakeling dit weer terug" logika.
Dit is ook nie die interne implementering bloot dat die "tyd gedeelte word uitgedruk as 'n breuk" van die datum.
Kry die datum van die eerste dag van die maand
DATEADD(dd, DATEDIFF( dd, -1, GetDate() - DAY(GetDate()) ), 0)
Kry die datum rfom 1 jaar gelede
DATEADD(m,-12,DATEADD(dd, DATEDIFF( dd, -1, GetDate() - DAY(GetDate()) ), 0))
Ek normaalweg omskep datum-time to date en vergelyk kan word, soos hierdie:
SELECT 'Same Date' WHERE CAST(getDate() as date) = cast('2/24/2012 2:23 PM' as date)
of
SELECT 'Same Date' WHERE DATEDIFF(dd, cast(getDate() as date), cast('2/24/2012 2:23 PM' as date)) = 0
Ek weet dit is nie presies hoe jy wil om dit te doen, maar dit kan 'n begin wees:
SELECT *
FROM (SELECT *, DATEPART(yy, column_dateTime) as Year,
DATEPART(mm, column_dateTime) as Month,
DATEPART(dd, column_dateTime) as Day
FROM table1)
WHERE Year = '2008'
AND Month = '8'
AND Day = '14'
SELECT *
FROM table1
WHERE CONVERT(varchar(10),columnDatetime,121) =
CONVERT(varchar(10),CONVERT('14 AUG 2008' ,smalldatetime),121)
Dit sal die datatime en die string in varchars van die formaat "YYYY-MM-DD".
skakelDit is baie lelik, maar moet werk
Datum vergelyk kan word in SQL Server behulp string vergelyking: EGP>
DECLARE @strDate VARCHAR(15)
SET @strDate ='07-12-2010'
SELECT * FROM table
WHERE CONVERT(VARCHAR(15),dtInvoice, 112)>= CONVERT(VARCHAR(15),@strDate , 112)
DECLARE @Dat
SELECT *
FROM Jai
WHERE
CONVERT(VARCHAR(2),DATEPART("dd",Date)) +'/'+
CONVERT(VARCHAR(2),DATEPART("mm",Date)) +'/'+
CONVERT(VARCHAR(4), DATEPART("yy",Date)) = @Dat
Die beste manier is om eenvoudig te onttrek die datum deel met behulp van die SQL DATUM () funksie:
SELECT *
FROM table1
WHERE DATE(column_datetime) = @p_date;
SELECT * FROM tablename
WHERE CAST(FLOOR(CAST(column_datetime AS FLOAT))AS DATETIME) = '30 jan 2012'
SELECT CONVERT(VARCHAR(2),DATEPART("dd",doj)) +
'/' + CONVERT(VARCHAR(2),DATEPART("mm",doj)) +
'/' + CONVERT(VARCHAR(4),DATEPART("yy",doj)) FROM emp
Daar is baie formate vir datum in SQL wat word vermeld. Verwys https://msdn.microsoft.com/en-in/library/ms187928. ASPX
Die omskakeling en vergelyk varchar kolom met geselekteerde datums.
Sintaks:
SELECT * FROM tablename where CONVERT(datetime,columnname,103)
between '2016-03-01' and '2016-03-03'
In CONVERT(DATETIME,COLUMNNAME,103) "103" SPECIFIES THE DATE FORMAT as dd/mm/yyyy
In SQLServer
DECLARE @p_date DATE
SELECT *
FROM table1
WHERE column_dateTime=@p_date
In C # Slaag die kort reeks datum waarde met behulp van ToShortDateString () funksie. monster: DateVariable.ToShortDateString ();