In SQL Server heb ik een kolom DATETIME
die een tijdselement bevat.
Voorbeeld:
'14 AUG 2008 14:23:019'
Wat is de bestemethode om alleen de records voor een bepaalde dag te selecteren en het tijdsgedeelte te negeren?
Voorbeeld: (niet veilig, omdat het niet overeenkomt met het tijdsgedeelte en geen rijen retourneert)
DECLARE @p_date DATETIME
SET @p_date = CONVERT( DATETIME, '14 AUG 2008', 106 )
SELECT *
FROM table1
WHERE column_datetime = @p_date
Opmerking: aangezien deze site ook gaat over het noteren van notities en technieken die je oppikt en vervolgens vergeet, ga ik mijn eigen antwoord op deze vraag posten, aangezien DATETIME-dingen in MSSQL waarschijnlijk het onderwerp zijn dat ik het meest zoek in SQLBOL.
UpdateVoorbeeld verduidelijkt om specifieker te zijn.
BewerkenSorry, maar ik moest VERKEERDE antwoorden downmodden (antwoorden die verkeerde resultaten opleveren).
@Jorrit: WHERE (date>'20080813' AND date<'20080815')
retourneert de 13e en de 14e.
@wearejimbo: Sluit, maar geen sigaar!badge aan jou toegekend. U heeft records gemist die zijn geschreven op 14/08/2008 23:59:001 tot 23:59:999 (d.w.z. minder dan 1 seconde voor middernacht.)
Antwoord 1, autoriteit 100%
Techniek 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)
Het voordeel hiervan is dat het elke index op ‘column_datetime’ zal gebruiken als deze bestaat.
Antwoord 2, autoriteit 53%
In SQL Server 2008 zou u het nieuwe datatype DATE kunnen gebruiken
DECLARE @pDate DATE='2008-08-14'
SELECT colA, colB
FROM table1
WHERE convert(date, colDateTime) = @pDate
@Guy. Ik denk dat je zult merken dat deze oplossing prima schaalt. Bekijk het plan voor het uitvoeren van query’svan uw originele vraag.
En voor mijn:
Antwoord 3, autoriteit 21%
Vergelijk gewoon de jaar-, maand- en dagwaarden.
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)
Antwoord 4, autoriteit 11%
Zoiets?
SELECT *
FROM table1
WHERE convert(varchar, column_datetime, 111) = '2008/08/14'
Antwoord 5, autoriteit 11%
Techniek 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
Als het veld column_datetime niet is geïndexeerd en het onwaarschijnlijk is dat dit het geval is (of de index zal waarschijnlijk niet worden gebruikt), is het gebruik van DATEDIFF() korter.
Antwoord 6, autoriteit 11%
Goed punt over de index in het antwoord dat je hebt geaccepteerd.
Toch, als je echt alleen zoekt op specifieke DATE
of DATE ranges
vaak, dan is de beste oplossing die ik heb gevonden, een andere persistente berekende kolom naar uw tabel die alleen de DATE
zou bevatten, en voeg een index toe aan deze kolom:
ALTER TABLE "table1"
ADD "column_date" AS CONVERT(DATE, "column_datetime") PERSISTED
Voeg index toe aan die kolom:
CREATE NONCLUSTERED INDEX "table1_column_date_nu_nci"
ON "table1" ( "column_date" ASC )
GO
Dan gaat je zoekopdracht nog sneller:
DECLARE @p_date DATE
SET @p_date = CONVERT( DATE, '14 AUG 2008', 106 )
SELECT *
FROM table1
WHERE column_date = @p_date
Antwoord 7, autoriteit 11%
Normaal gesproken converteer ik datum-tijd naar datum en vergelijk ze, zoals deze:
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
Antwoord 8, autoriteit 8%
Deze functie Cast(Floor(Cast(GetDate() As Floating)) As DateTime)retourneert een datetime datatype waarbij het tijdgedeelte is verwijderd en dat als zodanig kan worden gebruikt.
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
Antwoord 9, autoriteit 8%
Hoe het DATE-gedeelte van een DATETIME-veld in MS SQL Server te krijgen:
Een van de snelste en handigste manieren om dit te doen, is met
DATEADD(dd, DATEDIFF( dd, 0, @DAY ), 0)
Het vermijdt de CPU-busting “converteer de datum in een string zonder de tijd en converteer het dan weer terug”-logica.
Het onthult ook niet de interne implementatie dat het “tijdsgedeelte wordt uitgedrukt als een fractie” van de datum.
Krijg de datum van de eerste dag van de maand
DATEADD(dd, DATEDIFF( dd, -1, GetDate() - DAY(GetDate()) ), 0)
Krijg de datum van 1 jaar geleden
DATEADD(m,-12,DATEADD(dd, DATEDIFF( dd, -1, GetDate() - DAY(GetDate()) ), 0))
Antwoord 10, autoriteit 3%
Ik weet dat dit niet precies is hoe je dit wilt doen, maar het kan een begin zijn:
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'
Antwoord 11, autoriteit 3%
SELECT *
FROM table1
WHERE CONVERT(varchar(10),columnDatetime,121) =
CONVERT(varchar(10),CONVERT('14 AUG 2008' ,smalldatetime),121)
Hiermee worden de datatime en de string geconverteerd naar varchars met het formaat “JJJJ-MM-DD”.
Dit is erg lelijk, maar zou moeten werken
Antwoord 12, autoriteit 3%
Datum kan worden vergeleken in sqlserver met behulp van stringvergelijking:
bijv.
DECLARE @strDate VARCHAR(15)
SET @strDate ='07-12-2010'
SELECT * FROM table
WHERE CONVERT(VARCHAR(15),dtInvoice, 112)>= CONVERT(VARCHAR(15),@strDate , 112)
Antwoord 13, autoriteit 3%
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
Antwoord 14
De beste manier is om eenvoudig het datumdeel te extraheren met behulp van de functie SQL DATUM ():
SELECT *
FROM table1
WHERE DATE(column_datetime) = @p_date;
Antwoord 15
SELECT * FROM tablename
WHERE CAST(FLOOR(CAST(column_datetime AS FLOAT))AS DATETIME) = '30 jan 2012'
Antwoord 16
SELECT CONVERT(VARCHAR(2),DATEPART("dd",doj)) +
'/' + CONVERT(VARCHAR(2),DATEPART("mm",doj)) +
'/' + CONVERT(VARCHAR(4),DATEPART("yy",doj)) FROM emp
Antwoord 17
Er zijn veel indelingen voor datum in SQL die worden opgegeven. Verwijs https://msdn.microsoft.com/en-in/library/ms187928. aspx
VARCHAR-kolom converteren en vergelijken met geselecteerde data.
SYNTAX:
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
Antwoord 18
in SQLSERVER
DECLARE @p_date DATE
SELECT *
FROM table1
WHERE column_dateTime=@p_date
in c #
Passeer de korte reeks datumwaarde met behulp van ToshortDatestring () -functie.
steekproef:
DATEVARIBIERE.TOSHORTDATESTRING ();