INT to hh:mm:ss tt in SQL Server - sql-server

I will have an integer calculated from datediff()
let's say.. it is..
declare #earliestTime int;
set #earliestTime=50000000;
I want to convert to hh:mm:ss tt
I have this code to convert that int to HH:mm:ss
CONVERT(varchar(6), (#earliestTime)/60)+ ':' + RIGHT('0' + CONVERT(varchar(2), ((#earliestTime) % 60) ), 2)+ ':' + RIGHT('0' + CONVERT(varchar(2), ((#earliestTime) %60)*0), 2)
How can I modify it to hh:mm:ss tt (AM or PM)
I modified like this..
CONVERT(varchar(6),
case
when
((#earliestTime)/60)<=12
then
((#earliestTime)/60)
else
(((#earliestTime)/60)-12)
end )
--CONVERT(varchar(6), case when((#earliestTime)/60)<=12 then (#earliestTime)/60 else ((#earliestTime)/60)-12)
+
':'
+
RIGHT('0' + CONVERT(varchar(2), ((#earliestTime) % 60) ), 2)
+
':'
+
RIGHT('0' + CONVERT(varchar(2), ((#earliestTime) %60)*0), 2
+
' '
+
convert(varchar(2),(case when ((#earliestTime)/60)<12 then 'am' else 'pm' end)))
But it gives me this error..
Conversion failed when converting the
varchar value 'pm' to data type int.
I already convert 'pm' or 'am' to varchar(2). why the system still gives me that error?
How to make it correct or is there a better way?

You don't explain what your integer represents so it is difficult to give an answer.
It's best to use a proper data type for times. I'd use DATETIME - it will allow to you to perform calculations, sort, and format as required. Storing time as text is going to cause headaches later on.
Store a time by adding the time to the SQL epoch (1900-01-01 00:00:00), like so
SELECT DATEADD(SECOND, 50000, CONVERT(DATETIME, 0.0))
SELECT DATEADD(MINUTE, 50000, CONVERT(DATETIME, 0.0))
Then format the DATETIME object accordingly.
To get HH:mm:ss, use format 108.
To get the AM/PM flag, use 100 and take the two rightmost characters.
Try the below:
DECLARE #date DATETIME
SET #date = DATEADD(SECOND, 50000, CONVERT(DATETIME, 0.0))
SELECT CONVERT(VARCHAR, DATEPART(HOUR, #date)%12)
+ ':' + RIGHT(CONVERT(VARCHAR, #date, 108),5)
+ RIGHT(CONVERT(VARCHAR, #date, 100), 2)
I should also point out that you are working in a database, not a presentation layer. There should be no need to worry about formatting dates and times in a database; it is about data storage and retrieval. Presumably you are returning this time to an application or webpage to be put onto a screen, into a report or whatever - best practice is to keep the data as a complete DATETIME and let the top layer format it. By converting to a VARCHAR you are just removing information and limiting yourself; no benefit, lots of cost.

Related

timestamp from sap into datetime in sql

from the beginning. I extracted data from Sap to MYSQL DB. In some tables, there are columns that were extracted as FLOAT and looks like this: 20131009012152.
As you can see it's like the string but float.
If I try to convert it into datetime, I get errors or overload etc.
I have tried CAST, CONVERT, SRT, SUBSTRING, nothing works.
Last try:
SELECT top 10 CREATED_AT,
SUBSTRING(CAST(STR(CREATED_AT, 25, 5) as varchar), 1, 4)
from databank.tablename;
-- wanted to substract parts (here, year) but I get just empty column as result.
Cast to nvarchar to datetime doesn't work. as well as nvarchar- bigint - datetime.
Hope, somebody can help me, thanks
One option, rather ugly, uses the CONVERT function with a series of string concatenations. I first get your numeric timestamp over to a string using a CTE.
WITH cte AS (
SELECT CAST(20131009012152 AS VARCHAR) num
)
SELECT
CONVERT(datetime, SUBSTRING(num, 1, 4) + '-' + SUBSTRING(num, 5, 2) + '-' +
SUBSTRING(num, 7, 2) + ' ' + SUBSTRING(num, 9, 2) + ':' +
SUBSTRING(num, 11, 2) + ':' + SUBSTRING(num, 13, 2), 120) AS the_date
FROM cte;
The verbosity of this query and your data makes me think that you probably did not export properly. Use this only if SAP really has no ability to export a proper timestamp (which I doubt).
Output:
09.10.2013 01:21:52
Demo
Found the similar way that can be directly used in SELECT:
CONVERT(datetime,
SUBSTRING(CAST(STR(COLUMN, 15) as varchar), 1,5) + '-' +
SUBSTRING(CAST(STR(COLUMN, 15) as varchar),6, 2) + '-' +
SUBSTRING(CAST(STR(COLUMN, 15) as varchar), 8, 2) + ' ' +
SUBSTRING(CAST(STR(COLUMN, 15) as varchar),10, 2) + ':' +
SUBSTRING(CAST(STR(COLUMN, 15) as varchar), 12, 2) + ':' +
SUBSTRING(CAST(STR(COLUMN, 15) as varchar), 14, 2), 120) as [COLUMN]
Result: 2017-01-01 15:33:15.000
Besides an old threat I want to share my solution:
Normally the SAP-Timestamps come like this in a char or varchar: 20220620081129
To bring it into a usable SQL format you need to stretch it into a date/datetime
format with dashes and colons.
This can be easily achieved by converting the text into a int/bigint and then
formatting this number into an output format that looks like a date.
Next step is just converting this resulting text into a datetime.
/*Code:*/
convert(datetime,format(convert(bigint,<fieldname>),'##-##-## ##:##:##'),120)
/*Example*/
DECLARE #SAPTable AS TABLE ([/BIC/XCREATE] VARCHAR(30))
INSERT INTO #SAPTable ([/BIC/XCREATE])
VALUES ('20220822144737');
SELECT convert(DATETIME, format(convert(BIGINT, [/BIC/XCREATE]), '##-##-## ##:##:##'), 120)
FROM #SAPTable
As easy as this.
Just adjust the fieldname [/BIC/XCREATE] and the output format to your needs.
In case you have other (shorter or longer) datetime values then, for sure, some things are needed to be adjusted but the principle is the same.
At the end the result is a real date value in terms of the SQL-Server and can be used anyhow.
I think that way it's easier than fiddling with substrings.

Convert hh:mm:ss to hh:mm in SQL Server

I have time as 04:02:00, I want it only as 4:02 using SQL Server
I have tried this code:
#time time
set #time ='04:02:00'
SELECT RIGHT(convert(varchar, #time, 100), 8)
It produces output:
4:02AM
please help ..
Thanks
You can use:
DECLARE #dt DATETIME
SET #dt = GETDATE()
SELECT CONVERT(varchar(5),#dt,108)
This query gives result in the format 'HH:mm'.
Hope it helps.
DECLARE #time datetime
set #time ='04:02:00'
SELECT LEFT(RIGHT(convert(varchar, #time, 100), 8), 6)
You can use DATEPART and concatenate from there:
SELECT
RIGHT('00' + CONVERT(VARCHAR(2), DATEPART(HOUR, #time)), 2) + ':'
+ RIGHT('00' + CONVERT(VARCHAR(2), DATEPART(MINUTE, #time)), 2)
Notice the RIGHT('00' + ..., 2), this is to pad the hour or minute part with leading zeroes so that it'll be two characters long, e.g 4 becomes 04.

Convert decimal time to hours and minutes

Been struggling with this and can't seem to find the right answer, although there are plenty of mentions for converting, but nothing specific is working.
I need to convert a time with data type of float into hours and minutes. So 13.50 as 13.30. The data type as fixed as float in DB so cannot change. DB is SQL Server 2008R2
Have tried:
cast(cast(floor(fdsViewTimesheet.perStandardHours) as
float(2))+':'+cast(floor(100*(
fdsViewTimesheet.perStandardHours - floor(fdsViewTimesheet.perStandardHours)))as
float(2)) as time) AS STANDARD_HOURS
But I get error message "Explicit conversion from data type real to time is not allowed" Have tried as char instead of as float but query hangs.
What am I doing wrong? I just want to convert a float value into hours and minutes.
Would be grateful if someone could point me in the right direction.
You can try:
DECLARE #HOURS decimal(7,4) = 20.5599
SELECT CAST(CONVERT(VARCHAR,DATEADD(SECOND, #HOURS * 3600, 0),108) AS TIME)
output : 20:33:35
But remember : Type Time in MSSQL only under 24hrs
If you want greater than 24hrs, try:
DECLARE #HOURS decimal(7,4) = 25.5599
SELECT
RIGHT('0' + CAST (FLOOR(#HOURS) AS VARCHAR), 2) + ':' +
RIGHT('0' + CAST(FLOOR((((#HOURS * 3600) % 3600) / 60)) AS VARCHAR), 2) + ':' +
RIGHT('0' + CAST (FLOOR((#HOURS * 3600) % 60) AS VARCHAR), 2)
output : 25:33:35
-- Update
Decimal minutes to more than 24hrs
DECLARE #MINUTES decimal(7,4) = 77.9
SELECT
RIGHT('0' + CAST (FLOOR(COALESCE (#MINUTES, 0) / 60) AS VARCHAR (8)), 2) + ':' +
RIGHT('0' + CAST (FLOOR(COALESCE (#MINUTES, 0) % 60) AS VARCHAR (2)), 2) + ':' +
RIGHT('0' + CAST (FLOOR((#MINUTES* 60) % 60) AS VARCHAR (2)), 2);
output: 01:17:54
This should work for you
DECLARE #f [real]
SET #f = 13.50
SELECT DATEADD(mi, (#f - FLOOR(#f)) * 60, DATEADD(hh, FLOOR(#f), CAST ('00:00:00' AS TIME)))
DECLARE #f FLOAT = 13.5;
SELECT CONVERT(TIME(0), DATEADD(MINUTE, 60*#f, 0));
Or if you just want hh:mm as a string:
SELECT CONVERT(CHAR(5), DATEADD(MINUTE, 60*#f, 0), 108);
Just be careful if you have values >= 24.
How about you convert to minutes and add to the 00:00 time like so:
DECLARE #c datetime
select #c = dateadd(mi,fdsViewTimesheet.perStandardHours*60,'00:00')
If you wanted to do it in the statement with Time only:
select CONVERT(TIME,dateadd(mi,fdsViewTimesheet.perStandardHours*60,'00:00') )
If you have values that are larger than 24 hours, then the standard datetime and time types in sql cannot hold these. They are limited to holding 24 hour ranges.
What you would need to do is store the time representation in a string for example like so:
select cast(floor(fdsViewTimesheet.perStandardHours) as varchar(10)) + ':' + cast(FLOOR( (fdsViewTimesheet.perStandardHours - floor(fdsViewTimesheet.perStandardHours))*60)as varchar(2))

Date format in dd/MM/yyyy hh:mm:ss

I need to convert datetime from 2012-07-29 10:53:33.010 to
29/07/2012 10:53:33.
I tried using
select CONVERT(varchar(20), GETDATE(), 131)
but its showing date according to Hijri calendar
11/09/1433 10:53:33:
Please help?
SELECT FORMAT(your_column_name,'dd/MM/yyyy hh:mm:ss') FROM your_table_name
Example-
SELECT FORMAT(GETDATE(),'dd/MM/yyyy hh:mm:ss')
This can be done as follows :
select CONVERT(VARCHAR(10), GETDATE(), 103) + ' ' + convert(VARCHAR(8), GETDATE(), 14)
Hope it helps
You could combine 2 formats:
3 dd/mm/yy (British/French)
8 hh:mm:ss
according to CONVERT() function, and using + operator:
SELECT CONVERT(varchar(10),GETDATE(),3) + ' ' + CONVERT(varchar(10),GETDATE(),8)
SELECT CONVERT(CHAR(10),GETDATE(),103) + ' ' + RIGHT(CONVERT(CHAR(26),GETDATE(),109),14)
The chapter on CAST and CONVERT on MSDN Books Online, you've missed the right answer by one line.... you can use style no. 121 (ODBC canonical (with milliseconds)) to get the result you're looking for:
SELECT CONVERT(VARCHAR(30), GETDATE(), 121)
This gives me the output of:
2012-04-14 21:44:03.793
Update: based on your updated question - of course this won't work - you're converting a string (this: '4/14/2012 2:44:01 PM' is just a string - it's NOT a datetime!) to a string......
You need to first convert the string you have to a DATETIME and THEN convert it back to a string!
Try this:
SELECT CONVERT(VARCHAR(30), CAST('4/14/2012 2:44:01 PM' AS DATETIME), 121)
Now you should get:
2012-04-14 14:44:01.000
All zeroes for the milliseconds, obviously, since your original values didn't include any ....
CREATE FUNCTION DBO.ConvertDateToVarchar
(
#DATE DATETIME
)
RETURNS VARCHAR(24)
BEGIN
RETURN (SELECT CONVERT(VARCHAR(19),#DATE, 121))
END
select DATE_FORMAT(NOW(),'%d/%m/%Y %h:%m:%s')
from dual
Try this wherever required, I have used this in JpaRepository in SpringBoot Project.
This will be varchar but should format as you need.
RIGHT('0' + LTRIM(DAY(d)), 2) + '/'
+ RIGHT('0' + LTRIM(MONTH(d)), 2) + '/'
+ LTRIM(YEAR(d)) + ' '
+ RIGHT('0' + LTRIM(DATEPART(HOUR, d)), 2) + ':'
+ RIGHT('0' + LTRIM(DATEPART(MINUTE, d)), 2) + ':'
+ RIGHT('0' + LTRIM(DATEPART(SECOND, d)), 2)
Where d is your datetime field or variable.

get custom date time format

I want to display date time as eg. Dec 1, 09 11:22:45 PM using SQL query
Currently my format is :
DATENAME(Month, (((MachineGroups.TimeAdded*10000000)+ 621355968000000000) -599266080000000000) / 864000000000) + SPACE(1) + DATENAME(d, (((MachineGroups.TimeAdded*10000000)+ 621355968000000000) - 599266080000000000) / 864000000000) +', ' + DATENAME(year, (((MachineGroups.TimeAdded*10000000)+621355968000000000) - 599266080000000000) /864000000000) + SPACE(1)+DATENAME (hour,(((MachineGroups.TimeAdded*10000000)+621355968000000000) - 599266080000000000) / 864000000000) + ':' +DATENAME (minute,(((MachineGroups.TimeAdded*10000000)+ 621355968000000000) - 599266080000000000) / 864000000000) + ':' +DATENAME (second,(((MachineGroups.TimeAdded*10000000)+ 621355968000000000) - 599266080000000000) / 864000000000) AS Expr2
Ussing the above i get eg. December 1, 2009 23:22:45
I tries using the cuatom formata of "MMM" and "yy" but it did not work
any suggestions???
thanks
Is there no way i can use the Datename property above to get my desired format??
It is much easier and more efficient to return the value as a generic datetime object and format it in your UI.
What is your motivation for returning a formatted date from the database?
This will get you everything but AM/PM:
declare #myDate datetime
set #myDate = getdate()
select LEFT(DATENAME(MM, #myDate),3) + ' ' +
RIGHT('0'+DATENAME(DD, #myDate),2) + ', ' +
RIGHT(DATENAME(YY, #myDate),2) + ' ' +
convert(varchar,(DATEPART(hour, #myDate))) + ':' + convert(varchar,(DATEPART(minute, #myDate))) + ':' + convert(varchar,(DATEPART(second, #myDate)))
There are various ways to achieve the AM/PM values, among them would be a substring of:
SELECT convert(varchar, getdate(), 109)
As well as MONTHNAME (which you're already using), check out DATEPART. It's also not far from the CONVERT format of 9 [via CONVERT (VARCHAR(20), #datetime, 9)], so you could manipulate this as well.
Yet another option is using two CONVERTs ... this gives you what you want, but the time's in 24hr format:
SELECT CONVERT(VARCHAR(20), #datetime, 107) + ' ' + CONVERT (VARCHAR(20), #datetime, 108)
Use a different conversion function and a bit of string manipulation to get you 12 hour with AM/PM. Or do something like this:
SELECT CAST(DATEPART(hh, #datetime) - 12 AS VARCHAR)
+ ':' + CAST(DATEPART(mi, #datetime) AS VARCHAR)
+ ':' + CAST(DATEPART(ss, #datetime) AS VARCHAR)
+ CASE WHEN DATEPART(hh, #datetime) BETWEEN 0 AND 11 THEN ' AM' ELSE ' PM' END
Neither this or manipulating the output of CONVERT is pretty, but they're your best options.
HOWEVER: as others have pointed out though, this is normally better done client/UI-side rather than SQL-side.
You can find all supported SQL Server formats here.
To select in a format equivalent to Dec 1, 09 11:22:45 PM, you could use the date from format 7: Mon dd, yy. The time can be assembled from format 109: mon dd yyyy hh:mi:ss:mmmAM (or PM). Combined:
select
convert(varchar(10), getdate(), 7) +
' ' +
stuff(
substring(
convert(varchar(32), getdate(), 109)
,13,14) -- Substring HH:mi:ss.mmmAM
,9,4,' ') -- Replace .mmm by one space
This should print:
Nov 24, 09 4:58:36 PM
The second of the two spaces between 09 and 4 is reserved for a two-number hour, like 11:59:59 PM. :)

Resources