Solved

Function and Getdate()

Posted on 2011-03-01
8
500 Views
Last Modified: 2012-05-11
I have a table that holds cutoffhours like this:
--
1900-01-01 15:00:00.000
1900-01-01 17:00:00.000--


Below SQL works and I get values like this:
2011-03-01 15:00:00.000
2011-03-01 17:00:00.000
select  convert(varchar(10), getdate(), 111) + cutoffhour
from cutoff

---Now, i want to have this in a function and I cant use getdate() in a function. I need to pass getdate() to it. I tried this but get an error to use "convert" . I know i need to use "convert" around cutoffhour ...did that but dont get the "time" part of cutoffhour field
Create function dbo.test
(
  @CurrentTime datetime
)
RETURNS DATETIME
As
Begin

select @cutoff = convert(varchar(10), @CurrentTime, 111) + cutoffhour --somehow need to use convert with cutoffhour to get 2011-03-01 15:00:00.000 (today's date plus the time in that table)
   from cutoff 

...
end

Open in new window

0
Comment
Question by:Camillia
8 Comments
 
LVL 39

Expert Comment

by:BrandonGalderisi
ID: 35009427
What data type is cutoff hour?
0
 
LVL 32

Expert Comment

by:ewangoya
ID: 35009461

Create function dbo.test
RETURNS DATETIME
As
Begin

select @cutoff = convert(varchar(10), GETDATE(), 111) + cutoffhour
   from cutoff

...
end
0
 
LVL 29

Expert Comment

by:Olaf Doschke
ID: 35009465
No, you don't need to pass in getdate(), but cutoffhour. Also your convert creates a varchar string, not a datetime. This varchar string then may be implictly converted, as the string format is a valid datetime, but lookup convert in the t-sql helpfile, you'll see that convert(varchar(10),...) converts to varchar(10).

Within the user defined function you're not in the context of the table and cannot adress table fields. But you can make use of any standard/syste T-SQL function within your function.

Create Function dbo.cutoffstring
(
  @cutoffhour varchar(13)
)
RETURNS varchar(23)
As
Begin
   return convert(varchar(10), getdate(), 111) + @cutoffhour
End

Open in new window


Then can use this function via
Select dbo.cutoffstring(cutoffhour) from cutoff

Open in new window


Bye, Olaf.
0
Best Practices: Disaster Recovery Testing

Besides backup, any IT division should have a disaster recovery plan. You will find a few tips below relating to the development of such a plan and to what issues one should pay special attention in the course of backup planning.

 
LVL 7

Author Comment

by:Camillia
ID: 35010193
You cannot have getdate() in a function.

cutoffhour is datetime...Brandon....
0
 
LVL 7

Author Comment

by:Camillia
ID: 35010450
this is the solution;

convert(char(10), @currentTime, 111) + CONVERT(VARCHAR(8),cutoffhour,108)

0
 
LVL 40

Accepted Solution

by:
Sharath earned 500 total points
ID: 35011235
Finally convert it to datetime from varchar.

CONVERT(DATETIME,CONVERT(VARCHAR(10),@currentTime,111) + ' ' + CONVERT(VARCHAR(8),currentTime,108))
0
 
LVL 29

Expert Comment

by:Olaf Doschke
ID: 35011267
Yes, if cutoffhour is not varchar, you cannot add it to another varchar.  I'd choose 112 style over 111 for the date portion and style 114 over 108 for the time portion. And finally do a explicit conversion via cast.

cast(datetime,convert(char(8), @currenttime, 112) + CONVERT(char(12), cutoffhour,114) as datetime)

Bye, Olaf.

PS: in SQL2008 you can use getdate() in a UDF, as usage of nondeterministi functions is relaxed there. How do I know what version of SQL Server you are using, Farzadw?

 
0
 
LVL 29

Expert Comment

by:Olaf Doschke
ID: 35011658
This is a full functional example:

IF OBJECT_ID (N'dbo.overridetime') IS NOT NULL
   DROP FUNCTION dbo.overridetime;
GO

CREATE FUNCTION dbo.overridetime(@currenttime datetime, @cutoffhour datetime)
RETURNS datetime
WITH EXECUTE AS CALLER
AS
BEGIN
  return convert(char(8), @currenttime, 112)+' '+convert(char(12), @cutoffhour,114)
END;
GO

IF OBJECT_ID(N'tempdb.dbo.#tmp') IS NULL
BEGIN
   create table #tmp (cutoffhour datetime);  
   insert into #tmp values ('19000101 15:00:00.000');
END;

select dbo.overridetime(getdate(),cutoffhour) as 'mydatetime' from #tmp

Open in new window


Bye, Olaf.
0

Featured Post

PRTG Network Monitor: Intuitive Network Monitoring

Network Monitoring is essential to ensure that computer systems and network devices are running. Use PRTG to monitor LANs, servers, websites, applications and devices, bandwidth, virtual environments, remote systems, IoT, and many more. PRTG is easy to set up & use.

Question has a verified solution.

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

Suggested Solutions

Title # Comments Views Activity
MS SQL with ODBC 5 36
export sql results to csv 6 36
[SQL server / powershell] bulk delete table from CSV 8 33
always on switch back after failover 2 35
When you hear the word proxy, you may become apprehensive. This article will help you to understand Proxy and when it is useful. Let's talk Proxy for SQL Server. (Not in terms of Internet access.) Typically, you'll run into this type of problem w…
Let's review the features of new SQL Server 2012 (Denali CTP3). It listed as below: PERCENT_RANK(): PERCENT_RANK() function will returns the percentage value of rank of the values among its group. PERCENT_RANK() function value always in be…
Via a live example, show how to shrink a transaction log file down to a reasonable size.
Viewers will learn how to use the SELECT statement in SQL to return specific rows and columns, with various degrees of sorting and limits in place.

777 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question