2013-08-27 19 views
2

我寫了一個查詢,以獲得每月的第一,如何在datetime,00月00:00:00獲取?

SELECT DATEADD(DAY, -(DATEPART(DAY,GETDATE())-1), GETDATE()) as First_Of_Month; 

對於這一點我得到相應的輸出,但我的時間標記顯示當前時間。

這是我在查詢中所做的,希望我有道理。

使用datepart我計算了no。第一天到今天之間的天數(int)(27-1 = 26) 然後使用dateadd函數,我添加了「-datepart」以獲得本月的第一個月。

這只是改變日期,我應該看看或閱讀有關改變時間。我假設,這將有東西一個月就做19000101

+0

謝謝馬克用正確的方式編輯它。 :) – TanmoyDB

+0

什麼版本的SQL Server?另外你會使用這個? –

+0

@AaronBertrand:正在使用SS-2008R2 – TanmoyDB

回答

5

對於SQL Server 2012(感謝漂泊和i-一個)

DECLARE @now DATETIME = CURRENT_TIMESTAMP; 

SELECT DATEADD(DAY, 1, EOMONTH(@now, -1)); 

-- or 

SELECT DATEFROMPARTS(YEAR(@now), MONTH(@now), 1); 

對於SQL Server 2008+

DECLARE @now DATETIME = CURRENT_TIMESTAMP; 

-- This shorthand works: 

SELECT CONVERT(DATE, @now+1-DAY(@now)); 

-- But I prefer to be more explicit, instead of relying on 
-- shorthand date math (which doesn't work in all scenarios): 

SELECT CONVERT(DATE, DATEADD(DAY, 1-DAY(@now), @now)); 

對於SQL Server 2005

SELECT DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()),0); 

如果您使用的是SQL Server 2005方法,則需要注意:在查詢中使用涉及DATEDIFF的表達式時需要注意。 SQL Server can transpose the arguments and lead to horrible estimates - as seen here。採取效率稍低的字符串方法可能更安全一些:

SELECT CONVERT(DATETIME, CONVERT(CHAR(6), GETDATE(), 112) + '01'); 
+0

+1,只是爲了好玩'DATEADD(DAY,1,EOMONTH(GETDATE(),-1))'for 2012+? –

+0

@adrift好吧,我會添加它,雖然我會承認我不是那個功能的巨大粉絲。 「BOMONTH()」會更有用。 –

1
SELECT convert(varchar(10),DATEADD(DAY, - (DATEPART(DAY,GETDATE())-1), GETDATE()),120)+' 00:00:00' as First_Of_Month; 
+0

讓我檢查我是否得到這個權利, 1)第一個月被轉換爲格式代碼120, 2)爲什麼+ '00:00:00'?這只是添加「空間00:00:00」嗎? – TanmoyDB

1

只是日期

DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0) 

所以:

DATEADD(mm, DATEDIFF(mm, 0, GETDATE()), 0) AS FirstDatetimeOfMonthmm, 
+0

根據使用方式的不同,[與某一列比較時,要非常小心'DATEDIFF'](http://connect.microsoft.com/SQLServer/feedback/details/630583/incorrect-estimate-with-condition-that - 包括-DATEDIFF)。 –

1
SELECT DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0) as First_Of_Month; 
+1

這給我今天的日期時間戳00:00:00,謝謝你。 :) 現在我需要尋找一種方式來使它,使我得到月的第一。 – TanmoyDB

+0

請不要宣傳使用速記。你可能已經記住M是月份,但是你是否曾經被例如'SELECT DATEPART(Y,GETDATE());'或'SELECT DATEPART(W,GETDATE());'?輸入'MONTH'並不需要很多努力,它會讓你的代碼自動生成文檔。 –

1

我認爲最簡單的方式是將結果施加日期:

SELECT cast(DATEADD(DAY, -(DATEPART(DAY,GETDATE())-1), GETDATE()) as date) as First_Of_Month 
1

一種選擇:

SELECT cast(
    cast(datepart(yyyy, getdate()) as varchar) 
    + '-' 
    + cast(datepart(mm, getdate()) as varchar) + '-01 00:00:00' 
as datetime) 

樹立從年/月部件日期,然後釘在1號和午夜。

相關問題