Solved

Posted on 2014-10-01
Medium Priority
994 Views
I am trying to learn dateadd and datediff. To get the first day of the month, we use below.

SELECT DATEADD(DD, DATEDIFF(DD, 0, GETDATE()), 0) AS [Date Part Only]

Why this alone select DATEDIFF(DD, 0, GETDATE())  returns 41911?  And what this is , 0) at the end means?

DATEDIFF(datepart, start_date, end_date)
0
Question by:VBdotnet2005
• 2
• 2
• 2
• +1

LVL 15

Accepted Solution

Vikas Garg earned 2000 total points
ID: 40356307
In  SQL

'1900-01-01 00:00:00.000' is the default date so if you take any int value as date then if it is 0 it is consider as '1900-01-01 00:00:00.000'

So Datediff will return the difference between two dates which means that
DATEDIFF(DD, 0, GETDATE()) = DATEDIFF(DD, '1900-01-01', GETDATE()) hence gives value 41912

Same way dateadd will add defined unit (day, month) to the given date

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

Hope this would clear your doubts
0

Author Comment

ID: 40356313
I get it now. 0 = 1900-01-01 00:00:00.000

returns 2014-10-01 00:00:00.000

returns 2014-10-02 00:00:00.000

can I increment the last parameter? like , 1 or  2 or 3, etc)  or it does not work that way?
0

LVL 24

Expert Comment

ID: 40356321
Yes.
0

LVL 15

Expert Comment

ID: 40356324
Yes,
As you saw that 0 = '1900-01-01'
so
1 means '1900-01-02' and so on ...
0

Author Closing Comment

ID: 40356347
thank you
0

LVL 49

Expert Comment

ID: 40356350
There are some people who suggest not using zero, but to specify the date in those functions so the function calls are more "self-documenting"

The base date of the SQL Server calendar is (as already noted above) Jan 1st 1900 or in the safest string format: '19000101'

Replace the zeros in the function calls with that date literal:

SELECT DATEADD(DD,     DATEDIFF(DD, '19000101', GETDATE())     , '19000101') AS [Date Part Only]
^a                                            ^b

^a get the number of whole days from 1900-01-01 until today (and hence ignoring time of day)
^b add back the whole number of days from 1900-01-01 and we arrive at today at precisely 00:00:00+00000

But you could have done this:

CAST(getdate() AS DATE)

CAST( CAST(getdate() AS DATE)  AS DATETIME) -- if you specifically need a datetime
0

LVL 49

Expert Comment

ID: 40356362
for first on the current month:
SELECT

DATEADD(dd, -(DAY(GETDATE()) - 1), DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0)) AS 'm1 First Day of Current Month'

, DATEADD(dd, -(DAY(GETDATE()) - 1), CAST(GETDATE() AS date))                      AS 'm2 First Day of Current Month'

, CAST(DATEADD(dd, -(DAY(GETDATE()) - 1), CAST(GETDATE() AS date)) AS datetime)    AS 'm3 First Day of Current Month'
You need to find the "day" portion of today
then deduct (that number - 1)
to arrive at the 1st of the current month

e.g. if "today" was 22nd September
22 if the day number
22-1 = 21

deduct 21 days from 22nd September and we arrive at 1st of September
0

## Featured Post

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

In the first part of this tutorial we will cover the prerequisites for installing SQL Server vNext on Linux.
Microsoft provides a rich set of technologies for High Availability and Disaster Recovery solutions.
Via a live example, show how to extract information from SQL Server on Database, Connection and Server properties
Stellar Phoenix SQL Database Repair software easily fixes the suspect mode issue of SQL Server database. It is a simple process to bring the database from suspect mode to normal mode. Check out the video and fix the SQL database suspect mode problem.
###### Suggested Courses
Course of the Month4 days, 17 hours left to enroll