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

Was dit nuttig?

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".

skakel

Dit 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 ();

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top