如何僅從SQL Server DateTime數據類型返回日期



Answers

SQLServer 2008現在有一個'date'數據類型,它只包含一個沒有時間分量的日期。 任何使用SQL Server 2008及更高版本的人都可以執行以下操作:

SELECT CONVERT(date, GETDATE())
Question
SELECT GETDATE()

返回: 2008-09-22 15:24:13.790

我希望沒有時間部分的日期部分: 2008-09-22 00:00:00.000

我怎麼弄到的?




如果你需要結果varchar數據類型,你應該通過

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

這已經在上面提到過了

如果您需要日期和時間格式的結果,您應該通過以下任何查詢

1) SELECT CONVERT(DATETIME,CONVERT(VARCHAR(10), GETDATE(), 111))作為唯一日期--2014-03-26 00:00:00.000

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

3)

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

- 2014年4月26日00:00:00.000




為什麼不使用DATE_FORMAT(your_datetiem_column,'%d-%m-%Y')?

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

你可以通過重新安排'%d-%m-%Y'部分來改變m,d和年份的順序




DATEADD和DATEDIFF優於CONVERTing到varchar。 兩種查詢都有相同的執行計劃,但執行計劃主要是關於數據訪問策略,並不總是顯示執行所有部分所花的CPU時間中涉及的隱含成本。 如果兩個查詢都針對具有數百萬行的表運行,則使用DateDiff的CPU時間可能接近轉換CPU時間的1/3!

查看查詢的執行計劃:

set showplan_text on
GO 

DATEADD和DATEDIFF都將執行CONVERT_IMPLICIT。

儘管CONVERT解決方案比較簡單,但對於某些人來說更容易閱讀,但速度較慢。 沒有必要轉換回日期時間(這是由服務器隱式完成的)。 之後DateData方法中也沒有真正的需要,因為整數結果也會隱式轉換回日期時間。

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]))

建議使用FLOOR()作為@digi的性能接近於DateDiff,但不建議將日期時間數據類型轉換為浮點數,並且返回並不總是產生原始值。

記住傢伙:不要相信任何人。 查看性能統計信息,並自行測試!

測試結果時要小心。 向客戶端選擇多行將隱藏性能差異,因為通過網絡發送行所需的時間比執行計算所需的時間更長。 因此,確保所有行的工作都由服務器完成,但沒有將行集發送到客戶端。

有些人對緩存優化何時影響查詢似乎存在困惑。 在同一批次或分批運行兩個查詢對緩存沒有影響。 因此,您可以手動過期緩存,或者只需多次來回查詢。 查詢#2的任何優化都會影響後續的任何查詢,因此如果您願意,可以拋出執行#1。

這裡是完整的測試腳本和性能結果 ,證明DateDiff比轉換為varchar快得多。




日期:

SELECT CONVERT(date, GETDATE())
SELECT CAST(GETDATE() as date)

時間:

SELECT CONVERT(time , GETDATE() , 114)
SELECT CAST(GETDATE() as time)



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



好吧,雖然我有點遲了:),這是另一種解決方案。

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

結果

2008-09-22 00:00:00.000

如果您使用SQL Server 2012及更高版本,則可以使用這樣的FORMAT()函數 -

SELECT FORMAT(GETDATE(), 'yyyy-MM-dd')



SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))



如果您將結果分配給列或變量,則將其賦予DATE類型,並且轉換是隱式的。

DECLARE @Date DATE = GETDATE()   

SELECT @Date   --> 2017-05-03



如果你想使用CONVERT並得到與原來問題相同的輸出,即yyyy-mm-dd,那麼使用與前面幾個答案相同的代碼CONVERT(varchar(10),[SourceDate as dateTime],121) ,但用破折號轉換為yyyy-mm-dd的代碼是121。

如果我可以繼續使用我的soapbox,那麼這種格式不屬於數據層 ,這就是為什麼在沒有愚蠢的高開銷“技巧”的情況下才能實現,直到SQL Server 2008實際的日期部分數據類型為止介紹。 在數據層中進行這樣的轉換是數據庫管理系統開銷的巨大浪費,但更重要的是,第二次你做了這樣的事情,你基本上創建了內存中的孤立數據,我假設你將返回到程序。 你不能將它放回到另一個3NF +列中,或者將它與沒有恢復的類型進行比較,因此你所做的所有事情都會引入失敗點並刪除關係參考。

您應該總是繼續並將您的dateTime數據類型返回到調用程序,然後在PRESENTATION層中進行必要的調整。 只要你在將它們返回給調用者之前進行轉換,就會從應用程序中消除所有參照完整性的希望。 這樣可以防止UPDATE或DELETE操作,除非您執行某種手動回复操作,而在沒有必要時,它又將數據暴露給人/ code / gremlin錯誤。




以日期格式返回

CAST(OrderDate AS日期)

上述代碼將在sql server 2010中工作

它將像12/12/2013一樣返回

對於SQL Server 2012,請使用下面的代碼

CONVERT(VARCHAR(10), OrderDate , 111)



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

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



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

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

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

編輯:前兩個方法基本相同,並執行轉換為varchar方法。




您可以使用以下日期部分並格式化日期:

DATENAME =>返回表示指定日期的指定日期部分的字符串

DATEADD => DATEPART()函數用於返回日期/時間的單個部分,如年,月,日,小時,分鐘等。

DATEPART =>返回一個表示指定日期的指定日期部分的整數。

CONVERT() => CONVERT()函數是將一種數據類型的表達式轉換為另一種數據類型的通用函數。 CONVERT()函數可用於以不同格式顯示日期/時間數據。




在SQL Server 2000上

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



Related