Declare a date variable from month and year SQL - sql

I want to make a new variable of type Date by passing the Month and Year
I don't know the syntax, but maybe something like:
DECLARE #Date Date
SET #Month(Date) = #Month
SET #Year(Date) = #Year
The Month and Year are some parameters of my application.

Do you mean DATEFROMPARTS ?
DECLARE #Date Date = DATEFROMPARTS ( #Year, #Month, #Day )
EDIT: This function only available after SQL Server 2012.
For SQL Server 2008. You may use the following
SET #Date = CAST(CONVERT(VARCHAR, #year) + '-' + CONVERT(VARCHAR, #month) + '-' + CONVERT(VARCHAR, #day) AS DATE)

you can do a number of things to accomplish this task...
an easy way is to just declare the variables, then in the select statement where clause you can add them. so:
declare #year as int (or whatever data type you need to use)
as
select * from yourtable
where year = #year and month = #month

Related

Compare the date if the columns (day, month and year) are stored separately in SQL Server

I have 3 columns Day, Month and Year of type INT that are totally separate. What I need is to pass a date (format: yyyy-mm-dd) into a WHERE clause to check if this following date is matched or not. What would be the best approach to handle this issue?
In 2012 it would be DateFromParts(Year,Month,Day), but you have tagged 2008 which means we have to fall back to the older tricks.
dateadd(mm, (#YourYearValue - 1900) * 12 + #YourMonthValue- 1 , #YourDayValue - 1)
Put your 3 ints into that (via columns from a join or parameters as appropriate) and you have a date returned you can work with.
SQL Fiddle : http://www.sqlfiddle.com/#!18/9eecb/19988
For SQL Server 2008
declare #Day int = 29, #Month int = 5, #Year int = 2018
select t.*
from [table] t
where t.[Date] = cast(cast(#Year as char(4))+ '-' + cast(#Month as char(2)) + '-' + cast(#Day as char(2)) as date)
Only for 2012 and later use DATEFROMPARTS:
where t.[Date] = DATEFROMPARTS(#Year, #Month, #Day)
Maybe this solution:
where cast(cast(#yyyy as varchar(4))+'-'+cast(#mm as varchar(2))+'-'+cast(#dd as
varchar(2)) as date) ...
and replace #yyyy,#mm,#dd with your fields
I would suggest the following, Instead of making a date using separated values we can take part from the complete date using SQL functions and compare with accordingly, which I think the best way of comparison
DECLARE #Day INT=29, #Month INT=05, #Year INT = 2018,
#Date DATE = '2018-05-29'
SELECT * FROM yourTable
WHERE YEAR(#Date) = #Year
AND MONTH(#Date) = #Month
AND DAY(#Date) = #Day

How to get the last day of the month using only month and year?

I want to find out how to find the last day of the month if I only have a year and a month (and no day).
I tried using EOMONTH(), but this function needs the date consisted of year, month and day. I can only use year and month values.
How do I do something like this?
If you are using Sql Server 2012 then I'd use DATEFROMPARTS.
DECLARE #year SMALLINT = 2016
,#month TINYINT= 02
SELECT EOMONTH(DATEFROMPARTS(#year,#month,1))
You can still use EOMONTH even if you do not have a day of the month, just use the first of the month as the day of month is not significant in the input.
-- incoming parameters (assuming string but could be int and you could cast them)
DECLARE #month VARCHAR(2) = '11', #year VARCHAR(4) = '2016'
DECLARE #date DATETIME
DECLARE #lastDayOfMonth INT
SELECT #date = CONVERT(date, #year + #month + '01', 101) -- this first part is what you know (year + month), the 01 is just the first day of whatever month appended so the date is valid
-- get the last day of month as a date using EOMONTH and then use DATEPART to get the day of the month
SELECT #lastDayOfMonth = DATEPART(dd, EOMONTH(#date))
SELECT #lastDayOfMonth -- your output on the screen
VARCHAR TYPES
DECLARE #D DATE
DECLARE #YearV VARCHAR(4) = '2016'
DECLARE #MonthV VARCHAR(2) = '12'
SET #D = DATEADD(dd,-1,DATEADD(mm,1,CAST(#YearV + #MonthV + '01' AS DATE)))
SELECT #D
INT TYPES
DECLARE #D DATE
DECLARE #Year INT = '2016'
DECLARE #Month INT = '11'
SET #D = DATEADD(dd,-1,DATEADD(mm,1,CAST(CAST(#Year AS VARCHAR(4)) + CAST(#Month AS VARCHAR(2)) + '01' AS DATE)))
SELECT #D
COMBINED TYPES
some SUBSTRING code depending on the format... :)

How to create a Date in SQL Server given the Day, Month and Year as Integers

FOR Example if I have:
DECLARE #Day int = 25
DECLARE #Month int = 10
DECLARE #Year int = 2016
I want to return
2016-10-25
As Date or datetime
In SQL Server 2012+, you can use datefromparts():
select datefromparts(#year, #month, #day)
In earlier versions, you can cast a string. Here is one method:
select cast(cast(#year*10000 + #month*100 + #day as varchar(255)) as date)
In SQL Server 2012+, you can use DATEFROMPARTS():
DECLARE #Year int = 2016, #Month int = 10, #Day int = 25;
SELECT DATEFROMPARTS (#Year, #Month, #Day);
In earlier versions, one method is to create and convert a string.
There are a few string date formats which SQL Server reliably interprets regardless of the date, language, or internationalization settings.
A six- or eight-digit string is always interpreted as ymd. The month
and day must always be two digits.
https://learn.microsoft.com/en-us/sql/t-sql/data-types/datetime-transact-sql
So a string in the format 'yyyymmdd' will always be properly interpreted.
(ISO 8601-- YYYY-MM-DDThh:mm:ss-- also works, but you have to specify time and therefore it's more complicated than you need.)
While you can simply CAST this string as a date, you must use CONVERT in order to specify a style, and you must specify a style in order to be deterministic (if that matters to you).
The "yyyymmdd" format is style 112, so your conversion looks like this:
DECLARE #Year int = 2016, #Month int = 10, #Day int = 25;
SELECT CONVERT(date,CONVERT(varchar(50),(#Year*10000 + #Month*100 + #Day)),112);
And it results in:
2016-10-25
Technically, the ISO/112/yyyymmdd format works even with other styles specified. For example, using that text format with style 104 (German, dd.mm.yyyy):
DECLARE #Year int = 2016, #Month int = 10, #Day int = 25;
SELECT CONVERT(date,CONVERT(varchar(50),(#Year*10000 + #Month*100 + #Day)),104);
Also still results in:
2016-10-25
Other formats are not as robust. For example this:
SELECT CASE WHEN CONVERT(date,'01-02-1900',110) = CONVERT(date,'01-02-1900',105) THEN 1 ELSE 0 END;
Results in:
0
As a side note, with this method, beware that nonsense inputs can yield valid but incorrect dates:
DECLARE #Year int = 2016, #Month int = 0, #Day int = 1025;
SELECT CONVERT(date,CONVERT(varchar(50),(#Year*10000 + #Month*100 + #Day)),112);
Also yields:
2016-10-25
DATEFROMPARTS protects you from invalid inputs. This:
DECLARE #Year int = 2016, #Month int = 10, #Day int = 32;
SELECT DATEFROMPARTS (#Year, #Month, #Day);
Yields:
Msg 289, Level 16, State 1, Line 2 Cannot construct data type date,
some of the arguments have values which are not valid.
Also beware that this method does not work for dates prior to 1000-01-01. For example:
DECLARE #Year int = 900, #Month int = 1, #Day int = 1;
SELECT CONVERT(date,CONVERT(varchar(50),(#Year*10000 + #Month*100 + #Day)),112);
Yields:
Msg 241, Level 16, State 1, Line 2 Conversion failed when converting
date and/or time from character string.
That's because the resulting string, '9000101', is not in the 'yyyymmdd' format. To ensure proper formatting, you'd have to pad it with leading zeroes, at the sacrifice of some small amount of performance. For example:
DECLARE #Year int = 900, #Month int = 1, #Day int = 1;
SELECT CONVERT(date,RIGHT('000' + CONVERT(varchar(50),(#Year*10000 + #Month*100 + #Day)),8),112);
Results in:
0900-01-01
There are other methods aside from string conversion. Several are provided in answers to "Create a date with T-SQL". A notable example involves creating the date by adding years, months, and days to the "zero date".
(This answer was inspired by Gordon Linoff's answer, which I expanded on and provided additional documentation and notes.)
Old Microsoft Sql Sever (< 2012)
RETURN dateadd(month, 12 * #year + #month - 22801, #day - 1)
The following code should work on all versions of sql server I believe:
SELECT CAST(CONCAT(CAST(#Year AS VARCHAR(4)), '-',CAST(#Month AS VARCHAR(2)), '-',CAST(#Day AS VARCHAR(2))) AS DATE)
Simple and most flexible solution
Use FORMAT function to make any type of format you like.
Here is copy paste working example:
DECLARE #year int = 2021, #month int = 12, #day int = 16
DECLARE #date varchar(20)
SET #date = cast((format(#year,'####') +'-'+format(#month,'##')+'-'+format(#day,'##')) as date)
SELECT #date
It will also display leading zeros for days and months.
So, you can try this solution:
DECLARE #DAY INT = 25
DECLARE #MONTH INT = 10
DECLARE #YEAR INT = 2016
DECLARE #DATE AS DATETIME
SET #DATE = CAST(RTRIM(#YEAR * 10000 + #MONTH * 100 + #DAY) AS DATETIME)
SELECT REPLACE(CONVERT(VARCHAR(10), #DATE, 102), '.', '-') AS EXPECTDATE
Or you can try this a few lines of code:
DECLARE #DAY INT = 25
DECLARE #MONTH INT = 10
DECLARE #YEAR INT = 2016
SELECT CAST(RTRIM(#YEAR * 10000 +'-' + #MONTH * 100+ '-' + #DAY) AS DATE) AS EXPECTDATE
select convert(varchar(11), transfer_date, 106)
got me my desired result of date formatted as 07 Mar 2018
My column 'transfer_date' is a datetime type column and I am using SQL Server 2017 on azure
CREATE DATE USING MONTH YEAR IN SQL::
DECLARE #FromMonth int=NULL,
#ToMonth int=NULL,
#FromYear int=NULL,
#ToYear int=NULL
/**Region For Create Date**/
DECLARE #FromDate DATE=NULL
DECLARE #ToDate DATE=NULL
SET #FromDate=DateAdd(day,0, DateAdd(month, #FromMonth - 1,DateAdd(Year, #FromYear-1900, 0)))
SET #ToDate=DateAdd(day,-1, DateAdd(month, #ToMonth - 0,DateAdd(Year, #ToYear-1900, 0)))
/**Region For Create Date**/
For SQL Server 2008 users, I made a custom function:
CREATE FUNCTION sql2012_datefromparts
(
#Year int, #Month int, #Day int
)
RETURNS DATETIME
AS
BEGIN
RETURN convert(datetime,convert(varchar,#year)+right('0'+convert(varchar,#month),2)+right('0'+convert(varchar,#day),2))
END
GO
To use it:
DECLARE #day int=29, #month int=10, #year int=1971
SELECT dbo.sql2012_datefromparts(#year,#month,#day)

Setting specific dates for a variable in SQL

I would lake to specify a specific datetime variable to be used. The code would look something like this:
Declare #Year = int
Declare #JanDate = Datetime
Set #JanDate = ???
I would like to set #JanDate to Month=1, Day =25, Year = #Year. Not sure what to put in for that?
For those who are using SQL Server 2012, use one of the DATEFROMPARTS, DATETIMEFROMPARTS, DATETIME2FROMPARTS, OR SMALLDATETIMEFROMPARTS functions. You are on SQL 2005, so these functions are not available, but I am including them anyway in case someone on 2012 or higher finds this question in the future.
For example:
declare #Year int = 2014
declare #JanDate datetime
select #JanDate = DATETIMEFROMPARTS(#Year, 1, 25, 0, 0, 0, 0)
For the poster and those of us still using SQL Server 2005, you can concatenate a string together and convert that to a date:
declare #Year int = 2014
declare #JanDate datetime
select #JanDate = CAST(CAST(#Year as varchar) + '-1-25' as varchar)
Or, see the answer to this question for a possibly more efficient way using multiple DATEADD functions.
I don't like casting strings to dates. Neither should you.
If you using SQL Server 2012 or later then you can use the answersuggested by Paul Williams i.e. DateFromParts or similar functions.
For earlier versions here's the method I would use:
DECLARE #Year int;
DECLARE #JanDate datetime;
SET #Year = 2014;
SET #JanDate = DateAdd(dd, 25 - 1, DateAdd(yy, #Year - 1900, '1900-01-01'));
SELECT #JanDate;
It might seem overly complicated to some, but the way in which it performs the action is much more pleasing [to me] as it uses nothing but dates and integers.
Starting at SQL Servers base date 1900-01-01 we add on the number of years supplied (correcting by 1900 years ;-))
Then we add on the number of days (again, a correction of 1 day is required as the date we're working with is already the 1st of the month so adding 25 = 26, not the 25 we want).
Here's some supplementary code that you might find useful. Supply it any year, month and day it it will work it out for you.
If a user supplies "invalid" values (e.g. 2014-02-31 - there is no 31st of February) then the function will not fail, unlike a text to date casting. Instead it will provide the result 2014-03-03 which is 31 days after 1st Feb.
This logic might not please some people but it has always worked for me.
Enough waffling, here's the code:
DECLARE #y int
, #m int
, #d int;
SET #y = 2014;
SET #m = 6;
SET #d = 22;
SELECT DateAdd(dd, #d - 1, DateAdd(mm, #m - 1, DateAdd(yy, #y - 1900, '1900-01-01')));
-End transmission-
Your DECLARE statements may be incorrect depending on your version of SQL. The following should work (you'll just need to change #Year for the year you want):
DECLARE #Year int
DECLARE #JanDate Datetime
SET #Year=2013
SET #JanDate='1/25/'+CAST(#Year AS VARCHAR)
Declare #Year int;
SET #Year = 2013;
Declare #JanDate Datetime;
SET #JanDate = CAST(
CAST(#Year AS NVARCHAR(4)) + CAST('01' AS NVARCHAR(2)) + CAST('25' AS NVARCHAR(2))
AS DATETIME)
SELECT #JanDate
RESULT: 2013-01-25 00:00:00.000
Or simply
Declare #Year int;
SET #Year = 2013;
Declare #JanDate Datetime;
SET #JanDate = CAST(
CAST(#Year AS NVARCHAR(4)) + '01' + '25'
AS DATETIME)
SELECT #JanDate
RESULT: 2013-01-25 00:00:00.000

Return Static date using SQL Function

I have a situation where i need to return a date.Here for this function i will be supplying month number and i need to return result like "3/13/2012".
declare #date varchar(20)
select #date=datepart(month,getdate())+'/13/'+datepart(year,getdate())
return #date(#date)
This should do it for ya.
CREATE FUNCTION dbo.fnStaticDate(#month varchar(2))
RETURNS DATETIME
AS
BEGIN
DECLARE #year VARCHAR(4)
SET #year = DATEPART(year, GETDATE())
RETURN CONVERT(DATETIME, #year + '-' + #month + '-' + '13')
END
Here is the working solution which i have used for one of my project.
created a store procedure with input parameter of month
declare #mon varchar(2)
set #mon = '3'
select CONVERT(varchar, #mon + '/13/' + convert(varchar, datepart(year, getdate())), 111 )
execute the above lines in SQL server you will get the result.
test by changing the #mon value in set statement.
Hope it helps you.
conversion error it gives
declare #date varchar(20)
select #date=convert(varchar(2),datepart(month,getdate()))+'/13/'+convert(varchar(4),datepart(year,ge tdate()))
print (#date)