it-swarm-eu.dev

Jak vrátit pouze datum z datového typu SQL Server DateTime

SELECT GETDATE()

Vrací: 2008-09-22 15:24:13.790

Chci tuto datovou část bez časové části: 2008-09-22 00:00:00.000

Jak to mohu získat?

1544
eddiegroves

Na stránce SQL Server 2008 a vyšší byste měli mít CONVERT k dnešnímu dni:

SELECT CONVERT(date, getdate())

Ve starších verzích můžete provádět následující akce:

SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @your_date))

například

SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))

dává mi 

2008-09-22 00:00:00.000

Klady: 

  • Nejsou požadovány žádné varchar <-> datetime konverze
  • Není třeba myslet na locale
2234
aku

SQLServer 2008 má nyní datový typ 'date', který obsahuje pouze datum bez časové složky. Každý, kdo používá SQLServer 2008 a další, může provést následující:

SELECT CONVERT(date, GETDATE())
679
BenR

Pokud používáte SQL 2008 a vyšší:

select cast(getdate() as date)
154
abatishchev

DATEADD a DATEDIFF jsou lepší než CONVERT pro varchar. Oba dotazy mají stejný prováděcí plán, ale prováděcí plány jsou primárně o přístupových strategiích data a ne vždy odhalují implicitní náklady spojené s časem CPU potřebným k provedení všech kusů. Pokud jsou oba dotazy spuštěny proti tabulce s miliony řádků, může být čas procesoru pomocí funkce DateDiff blízký 1/3 času převodu CPU!

Zobrazení plánů provádění dotazů:

set showplan_text on
GO 

DATEADD i DATEDIFF provedou CONVERT_IMPLICIT.

Ačkoliv je řešení CONVERT jednodušší a snadněji čitelné pro některé, pomalejší je is. Není třeba vracet zpět do datetime (to je implicitně provedeno serverem). Neexistuje také žádná skutečná potřeba metody DateDiff pro DateAdd poté, protože výsledek celé číslo bude také implicitně převeden zpět na datetime.


SELECT CONVERT (varchar, MyDate, 101) FROM DatesTable

  |--Compute Scalar(DEFINE:([Expr1004]=CONVERT(varchar(30),[TEST].[dbo].[DatesTable].[MyDate],101)))
       |--Table Scan(OBJECT:([TEST].[dbo].[DatesTable]))

SELECT DATEADD (dd, 0, DATEDIFF (dd, 0, MyDate)) FROM DatesTable

  |--Compute Scalar(DEFINE:([Expr1004]=dateadd(day,(0),CONVERT_IMPLICIT(datetime,datediff(day,'1900-01-01 00:00:00.000',CONVERT_IMPLICIT(datetime,[TEST].[dbo].[DatesTable].[MyDate],0)),0))))
       |--Table Scan(OBJECT:([TEST].[dbo].[DatesTable]))

Použití FLOOR () jako @digi navrhl má výkon blíže k DateDiff, ale nedoporučuje se, protože casting datetime datového typu na float a zpět ne vždy přinese původní hodnotu.

Pamatujte na kluky: nikomu nevěřte. Podívejte se na statistiky výkonu a vyzkoušejte to sami!

Při testování výsledků buďte opatrní. Výběrem mnoha řádků klienta se skryje rozdíl výkonu, protože odeslání řádků přes síť trvá déle než provedení výpočtů. Ujistěte se tedy, že práce pro všechny řádky provádí server, ale klientovi není odeslána žádná sada řádků.

Zdá se, že u některých lidí dochází k nejasnostem, když optimalizace mezipaměti ovlivňuje dotazy. Spuštění dvou dotazů ve stejné dávce nebo v samostatných dávkách nemá žádný vliv na ukládání do mezipaměti. Takže můžete buď vypršet platnost mezipaměti ručně nebo jednoduše spouštět dotazy vícekrát. Jakákoli optimalizace pro dotaz č. 2 by také ovlivnila všechny následné dotazy, takže pokud chcete, proveďte provedení # 1.

Zde je plný test skript a výkon výsledky , které dokazují, že DateDiff je podstatně rychlejší než konverze na varchar.

70
Ricardo C

Zkuste to:

SELECT CONVERT(VARCHAR(10),GETDATE(),111)

Výše uvedené prohlášení převádí váš aktuální formát na YYYY/MM/DD, prosím, podívejte se na tento odkaz a vyberte si preferovaný formát.

41
Nescio
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))
37
Cade Roux

Pomocí funkce CONVERT můžete vrátit pouze datum. Podívejte se na níže uvedené odkazy:

Manipulace s datem a časem v SQL Serveru 2000

CAST a CONVERT

Syntaxe pro použití funkce převodu je: 

CONVERT ( data_type [ ( length ) ] , expression [ , style ] ) 
19
DaveK

Pro návrat ve formátu data  

CAST (datum objednávky AS datum)

Výše uvedený kód bude fungovat v serveru sql 2010

Vrátí se jako 12/12/2013

Pro SQL Server 2012 použijte níže uvedený kód

CONVERT(VARCHAR(10), OrderDate , 111)
17
Mahesh ML

Pomocí FLOOR () - jen časová část.

SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
13
DiGi
SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),103) --21/09/2011

SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),101) --09/21/2011

SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),111) --2011/09/21

SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),107) --Sep 21, 2011
12
Rushda

Pokud chcete použít CONVERT a získat stejný výstup jako v původní položené otázce, tj. Yyyy-mm-dd, pak použijte CONVERT(varchar(10),[SourceDate as dateTime],121) stejný kód jako předchozí pár odpovědí, ale kód pro převod na yyyy-mm-dd s pomlčkami je 121.

Pokud se mohu dostat na mýžku na sekundu,tento druh formátování nepatří do datové vrstvy, a to je důvod, proč nebylo možné bez hloupých high-overhead 'triků' až do SQL Server 2008, kdy jsou zavedeny skutečné typy dat datapart. Provedení takových konverzí v datové vrstvě je obrovským plýtváním režijními náklady na váš DBMS, ale co je důležitější, v druhém případě, že něco takového uděláte, jste v podstatě vytvořili osamocená data v paměti, která předpokládám, že se pak vrátíte do programu. Nemůžete ho vrátit zpět do jiného sloupce 3NF + nebo jej porovnat s ničím, co bylo napsáno bez vrácení, takže vše, co jste udělali, je představeno body selhání a odstraněny relační odkazy. 

Měli byste vždy jít dopředu a vrátit datový typ dataTime volajícímu programu av úrovni PRESENTATION, provést jakékoli úpravy jsou nezbytné.Jakmile začnete konvertovat věci před jejich vrácením volajícímu, odstraníte z aplikace veškerou naději na referenční integritu. To by opět zabránilo operaci UPDATE nebo DELETE, pokud neprovedete nějaký ruční návrat, který opět vystavuje svá data lidské/kódové/gremlin chybě, když není potřeba.

11
Focusyn

Pokud používáte SQL Server 2012 nebo vyšší verze,

Použít Format() funkce.

Pro SQL server již existuje více odpovědí a typů formátování. Ale většina metod je poněkud nejednoznačná a bylo by pro vás obtížné zapamatovat si čísla pro formát nebo funkce ve vztahu ke specifickému formátu data. To je důvod, proč je v dalších verzích serveru SQL lepší volba.

FORMAT ( value, format [, culture ] )

Možnost Kultura je velmi užitečná, protože můžete zadat datum podle vašich diváků.

Musíte si pamatovat d (pro malé vzory) a D (pro dlouhé vzory).

1. "d" - Krátký vzor vzoru.

2009-06-15T13:45:30 -> 6/15/2009 (en-US)
2009-06-15T13:45:30 -> 15/06/2009 (fr-FR)
2009-06-15T13:45:30 -> 2009/06/15 (ja-JP)

2. "D" - Dlouhé datum.

2009-06-15T13:45:30 -> Monday, June 15, 2009 (en-US)
2009-06-15T13:45:30 -> 15 июня 2009 г. (ru-RU)
2009-06-15T13:45:30 -> Montag, 15. Juni 2009 (de-DE)

Další příklady v dotazu.

DECLARE @d DATETIME = '10/01/2011';
SELECT FORMAT ( @d, 'd', 'en-US' ) AS 'US English Result'
      ,FORMAT ( @d, 'd', 'en-gb' ) AS 'Great Britain English Result'
      ,FORMAT ( @d, 'd', 'de-de' ) AS 'German Result'
      ,FORMAT ( @d, 'd', 'zh-cn' ) AS 'Simplified Chinese (PRC) Result'; 

SELECT FORMAT ( @d, 'D', 'en-US' ) AS 'US English Result'
      ,FORMAT ( @d, 'D', 'en-gb' ) AS 'Great Britain English Result'
      ,FORMAT ( @d, 'D', 'de-de' ) AS 'German Result'
      ,FORMAT ( @d, 'D', 'zh-cn' ) AS 'Chinese (Simplified PRC) Result';

US English Result Great Britain English Result  German Result Simplified Chinese (PRC) Result
----------------  ----------------------------- ------------- -------------------------------------
10/1/2011         01/10/2011                    01.10.2011    2011/10/1

US English Result            Great Britain English Result  German Result                    Chinese (Simplified PRC) Result
---------------------------- ----------------------------- -----------------------------  ---------------------------------------
Saturday, October 01, 2011   01 October 2011               Samstag, 1. Oktober 2011        2011年10月1日

Pokud chcete více formátů, můžete přejít na adresu:

  1. Standardní formát datumu a času
  2. Vlastní řetězce formátu data a času
10
Somnath Muluk
SELECT DATEADD(DD, DATEDIFF(DD, 0, GETDATE()), 0)

SELECT DATEADD(DAY, 0, DATEDIFF(DAY,0, GETDATE()))

SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 101))

Úpravy: První dvě metody jsou v podstatě stejné a konvertovat na varchar metodu.

10
Gordon Bell

Pro získání uvedeného výsledku používám následující příkaz.

SELECT CONVERT(DATETIME,CONVERT(DATE,GETDATE()))

Je to užitečné.

9
Anderson Silva

Pokud potřebujete výsledek v datovém typu varchar, měli byste projít

SELECT CONVERT(DATE, GETDATE()) --2014-03-26
SELECT CONVERT(VARCHAR(10), GETDATE(), 111) --2014/03/26

který je již zmíněn výše 

Pokud potřebujete výsledek ve formátu data a času, měli byste projít některým z níže uvedených dotazů

1) SELECT CONVERT(DATETIME,CONVERT(VARCHAR(10), GETDATE(), 111)) jako OnlyDate --2014-03-26 00: 00: 00.000

2) SELECT CONVERT(DATETIME,CONVERT(VARCHAR(10), GETDATE(), 112)) jako OnlyDate --2014-03-26 00: 00: 00.000

3)

 DECLARE  @OnlyDate DATETIME
   SET @OnlyDate = DATEDIFF(DD, 0, GETDATE())
   SELECT @OnlyDate AS OnlyDate

--2014-03-26 00: 00: 00.000

9
Stephon Johns
 Convert(nvarchar(10), getdate(), 101) --->  5/12/14

 Convert(nvarchar(12), getdate(), 101) --->  5/12/2014
8
Ankit Khetan

Pokud přiřadíte výsledky sloupci nebo proměnné, zadejte typ DATE a převod je implicitní.

DECLARE @Date DATE = GETDATE()   

SELECT @Date   --> 2017-05-03
7
Art Schmidt

Dobře, i když jsem trochu pozdě :), tady je další řešení.

SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) as DATETIME)

Výsledek

2008-09-22 00:00:00.000

Pokud používáte SQL Server 2012 a vyšší, můžete použít funkci FORMAT() jako je tato -

SELECT FORMAT(GETDATE(), 'yyyy-MM-dd')
6
Krishnraj Rana

Myslím, že by to fungovalo ve vašem případě:

CONVERT(VARCHAR(10),Person.DateOfBirth,111) AS BirthDate
//here date is obtained as 1990/09/25
6
bishnu karki

I při použití starověkého MSSQL Serveru 7.0 mi tento kód (s laskavým svolením tohoto link ) umožnil získat v jakémkoli formátu datum, který jsem hledal: 

PRINT '1) Date/time in format MON DD YYYY HH:MI AM (OR PM): ' + CONVERT(CHAR(19),GETDATE())  
PRINT '2) Date/time in format MM-DD-YY: ' + CONVERT(CHAR(8),GETDATE(),10)  
PRINT '3) Date/time in format MM-DD-YYYY: ' + CONVERT(CHAR(10),GETDATE(),110) 
PRINT '4) Date/time in format DD MON YYYY: ' + CONVERT(CHAR(11),GETDATE(),106)
PRINT '5) Date/time in format DD MON YY: ' + CONVERT(CHAR(9),GETDATE(),6) 
PRINT '6) Date/time in format DD MON YYYY HH:MM:SS:MMM(24H): ' + CONVERT(CHAR(24),GETDATE(),113)

Produkoval tento výstup: 

1) Date/time in format MON DD YYYY HH:MI AM (OR PM): Feb 27 2015  1:14PM
2) Date/time in format MM-DD-YY: 02-27-15
3) Date/time in format MM-DD-YYYY: 02-27-2015
4) Date/time in format DD MON YYYY: 27 Feb 2015
5) Date/time in format DD MON YY: 27 Feb 15
6) Date/time in format DD MON YYYY HH:MM:SS:MMM(24H): 27 Feb 2015 13:14:46:630
5
Matt O'Brien
DECLARE @yourdate DATETIME = '11/1/2014 12:25pm'    
SELECT CONVERT(DATE, @yourdate)
5
etni

Počínaje SQL SERVERem 2012 to můžete provést:

SELECT FORMAT(GETDATE(), 'yyyy-MM-dd 00:00:00.000')

4
xbb

Upřednostňuji následující:

DATEFROMPARTS(DATEPART(yyyy, @mydatetime), DATEPART(mm, @mydatetime), DATEPART(dd, @mydatetime))

Také se nestará o lokální nebo o dvojí konverzi - i když každá 'datapart' pravděpodobně matematiku. Takže to může být o něco pomalejší než metoda datediff, ale pro mě je to mnohem jasnější. Zvláště když chci seskupit jen rok a měsíc (nastavte den na 1).

4
Gerard ONeill

Na serveru SQL Server 2000

CAST(
(
    STR( YEAR( GETDATE() ) ) + '/' +
    STR( MONTH( GETDATE() ) ) + '/' +
    STR( DAY( GETDATE() ) )
)
AS DATETIME)
4
kaub0st3r

Datum:

 SELECT CONVERT (datum, GETDATE ()) 
 SELECT CAST (GETDATE () jako datum) 

Čas:

 SELECT CONVERT (čas, GETDATE (), 114) 
 SELECT CAST (GETDATE () jako čas) 
4
Kris Khairallah

Jednoduše to můžete udělat takto:

SELECT CONVERT(date, getdate())
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @your_date))
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))

Výstupy jako:

2008-09-22 00:00:00.000

Nebo to prostě udělejte takto:

SELECT CONVERT (DATE, GETDATE()) 'Date Part Only'

Výsledek:

Date Part Only
--------------
2013-07-14
3
Amar Srivastava

proč nepoužíváte DATE_FORMAT (your_datetiem_column, '% d-% m-% Y')?

EX: select DATE_FORMAT( some_datetime_column, '%d-%m-%Y' ) from table_name

můžete změnit pořadí m, d a rok přeuspořádáním '%d-%m-%Y' části

3

To chybělo ve všech odpovědích, nemusí být nejúčinnější, ale velmi snadno psatelné a srozumitelné, žádný styl není nutný, žádné složité funkce data.

SELECT CONVERT(DATETIME,CONVERT(DATE,((GETDATE()))))
3
Imad

Datum (pole datum a čas) a DATE_FORMAT (datum a čas, '% Y-% m-% d') obojí vrátí pouze datum od data a času 

2
Surekha
SELECT * FROM tablename WHERE CAST ([my_date_time_var] AS DATE)= '8/5/2015'
2
Binitta Mary

Můžete použít následující část pro datum a formátování data:

DATENAME => Vrátí řetězec znaků, který představuje zadané datum zadaného data

DATEADD => Funkce DATEPART() se používá k vrácení jedné části data/času, například roku, měsíce, dne, hodiny, minuty atd.

DATEPART => Vrátí celé číslo, které představuje zadané datum zadaného data.

CONVERT() => Funkce CONVERT() je obecná funkce, která převádí výraz jednoho datového typu na jiný. Funkce CONVERT() může být použita k zobrazení dat data/času v různých formátech.

2
user1151326

Vím, že je to staré, ale nevím, kde to někdo takto řekl. Z toho, co mohu říci, je to standard ANSI.

SELECT CAST(CURRENT_TIMESTAMP AS DATE)

Bylo by dobré, kdyby společnost Microsoft mohla také podporovat proměnnou CURRENT_DATE standard ANSI.

2
lit

Pokud používáte SQL 2008 a vyšší: SELECT CONVERT(DATE ,GETDATE())

1
Morteza Sefidi

Zkuste to:

SELECT CONVERT(date, GETDATE()) as date
1
Rafiqul Islam

Můj společný přístup k získání data bez časové části. 

 SELECT CONVERT(VARCHAR(MAX),GETDATE(),103)

 SELECT CAST(GETDATE() AS DATE)
1
Spider

select convert (getdate () jako daselect CONVERT (datetime, CONVERT (datum, getdate ())) te)

0
mokh223

můžete použít jako níže pro jiný typ výstupu pouze pro datum

  1. SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 103)) ----- dd/mm/rrrr

  2. SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))------ mm/dd/rrrr

  3. SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 102))

0
ankit soni
select cast(createddate as date) as derivedate from table 

createate je váš datetime sloupec, to funguje pro sqlserver

0
karthik kasubha

SELECT CONVERT (datum, getdate ())

0
Shiraj Momin

Můžete jednoduše použít níže uvedený kód pro získání pouze datové části a vyhnout se časové části v SQL:

SELECT SYSDATE TODAY FROM DUAL; 
0
Shyam Bhimani

Nejjednodušší způsob by bylo použít: SELECT DATE(GETDATE())

0
Jithin Joy

Wow, dovolte mi spočítat způsoby, jak to udělat. (není určena žádná slovní hříčka)

Chcete-li získat výsledky, které chcete v tomto formátu, konkrétně:

2008-09-22

Zde je několik možností.

SELECT CAST(GETDATE() AS DATE) AS 'Date1'
SELECT Date2  = CONVERT(DATE, GETDATE())
SELECT CONVERT(DATE, GETDATE()) AS 'Date3'
SELECT CONVERT(CHAR(10), GETDATE(), 121) AS 'Date4'
SELECT CONVERT(CHAR(10), GETDATE(), 126) AS 'Date5'
SELECT CONVERT(CHAR(10), GETDATE(), 127) AS 'Date6'

Takže bych navrhl vychystávání jeden jste spokojeni s, a použití této metody přes palubu ve všech vašich stolů.

Všechny tyto možnosti vrátí datum ve stejném formátu. Proč má SQL Server takovou redundanci?

Nemám tušení, ale dělají to. Možná, že někdo chytřejší než já může odpovědět na tuto otázku.

Doufám, že to někomu pomůže.

0
Aubrey Love

Můj styl

      select Convert(smalldatetime,Convert(int,Convert(float,getdate())))
0
CAGDAS AYDIN