I'm going nuts trying to convert a string type column into date.
The column name is StartDate, which contains a string date format dd/mm/yyyy. The field type is varchar(3000).
I tried the following:
CONVERT(datetime, StartDate, 103)
CAST(CONVERT(VARCHAR(10), StartDate, 110) AS DATE)
CONVERT(DATE, RIGHT(StartDate, 4) + '-' + SUBSTRING(StartDate, 4, 2) + '-' + LEFT(StartDate, 2), 126)
and other similar combinations.
I keep getting "out of range" and "conversion failed" error messages.
Does anyone have a creative solution?
I suspect you have some bogus data. For example
Select try_convert(date, '15/07/2014', 103)
Returns
2014-07-15
If 2012+, I would suggest that you
Select *
From YourTable
Where try_convert(date, StartDate, 103) is null
This will identify your problem areas
Related
Below is a script i am trying to run in Presto; Subtracting today's date from an integer field I am attempting to convert to date. To get the exacts days between. Unfortunately, it seems the highlighted block does not always convert the date correctly and my final answer is not correct. Please does anyone know another way around this or a standard method on presto of converting integer values to date.
Interger value in the column is in the format '20191123' for year-month-date
select ms, activ_dt, current_date, date_diff('day',act_dt,current_date) from
(
select ms,activ_dt, **CAST(parse_datetime(CAST(activ_dt AS varchar), 'YYYYMMDD') AS date) as act_dt**, nov19
from h.A_Subs_1 where msisdn_key=23480320012
) limit 19
You can convert "date as a number" (eg. 20180527 for May 27, 2018) using the following:
cast to varchar
parse_datetime with appropriate format
cast to date (since parse_datetime returns a timestamp)
Example:
presto> SELECT CAST(parse_datetime(CAST(20180527 AS varchar), 'yyyyMMdd') AS date);
_col0
------------
2018-05-27
You can use below sample query for your requirement:
select date_diff('day', date_parse('20191209', '%Y%m%d'), current_timestamp);
I'm trying to concatenate a column's date to a fixed time of the day and then CAST the whole thing as DATETIME.
The fixed time is 5:30am.
The date column I'm using needs to be adjusted as it shows the end date/time of when something ran; I want to use the start date/time.
The start date/time time is not available as its own column, but I have another column that has the duration the process took in seconds, so I can use DATEADD to roll the end date/time back to the start date/time.
Here's the full statement:
CAST(CONVERT(VARCHAR(10), DATEADD(ss,-ConfTask.[LastExecutedDuration], ConfTask.[LastExecutedDate]), 103) + ' ' + '05:30' as DATETIME)
Here's the error message I'm receiving:
The conversion of a varchar data type to a datetime data type resulted
in an out-of-range value.
I've tried testing these statements to investigate the issue, but they all run OK on their own:
CAST(CONVERT(VARCHAR(10), GETDATE(), 103) + ' ' + '05:30' as DATETIME)
CAST('2017-03-02' + ' ' + '05:30' as DATETIME)
DATEADD(ss,-ConfTask.[LastExecutedDuration], ConfTask.[LastExecutedDate])
I'm a bit stuck on how to get round this issue. Any help would be much appreciated.
Clearly, you must have some unexpected values in the column.
I would suggest finding them using a query such as this:
SELECT LastExecutedDuration, LastExecutedDate
FROM ConfTask
WHERE TRY_CONVERT(datetime,
CONVERT(VARCHAR(10),
DATEADD(second,
-ConfTask.[LastExecutedDuration],
ConfTask.[LastExecutedDate]
)
103
) + ' ' + '05:30')
)
You can also simplify the logic, by just using date functions:
select dateadd(minute,
5 * 60 + 30,
convert(datetime,
convert(date,
dateadd(second,
- ConfTask.LastExecutedDuration
ConfTask.LastExecutedDate
)
)
)
)
This worked:
CONVERT(DATETIME, CONVERT(CHAR(8), DATEADD(ss,-ConfTask.[LastExecutedDuration], ConfTask.[LastExecutedDate]), 112)) + ' ' + CONVERT(CHAR(8), '05:30:00', 108)
I'm new to crystal report. I have a date in string format like 2015-03-25 (Wed) and I want to convert it to date format like 03/25/2015. I tried with CDate and DateValue but it returned bad date string format. Any suggestions to convert such date string to proper date format?
If you have a DateTime field in Crystal Reports, you will see Date and Time tab option on the Format Editor when you right click on the field and select Format Field menu item. From the Date and Time tab, you may select the desired format and select OK.
It would be recommended to use the formats you want to use.
For eg : if you are giving string format for money or decimal you may not be able to use it at its full,like you may not be able to auto sum and other properties related to the datatype you intend to use
Not to do any thing in the code, Crystal Report have facility to this type of simple format.
#utility, you are near to answer.
As above image, in last Custom Format option, where you just go in Date tab and give format as
http://www.c-sharpcorner.com/UploadFile/mahesh/DateFormatInCR06132007092248AM/DateFormatInCR.aspx
Updated : sorry for above answer, that will work if you have valid date string.
In your case, where any arbitrary string need to convert into other date format. There is 2 option. In both case you have to extract the date and then format as you need and again combined with other sub-string.
Second you already done ie. crsytal report side, grab the date , format it and concatenate. this will slow down as need to process for each row.
SqlServer side - This option is faster from first option.
declare #t nvarchar(16) = '2015-03-25 (Wed)'
--get the acual date select SUBSTRING ( #t, 1, charindex('(' , #t ) -1 )
--above result give the charter datatype, so you first convert into date and then convert into other format select cast( SUBSTRING ( #t,
1, charindex('(' , #t ) -1 ) as date) --convert into date select
convert (varchar(15) , cast( SUBSTRING ( #t, 1, charindex('(' , #t )
-1 ) as date) , 103) --convert into dd/mm/yyyy format
--Above is for your understand, this is the actual execution of your code (Only write the below line) select convert (varchar(15) , cast(
SUBSTRING ( #t, 1, charindex('(' , #t ) -1 ) as date) , 103) + ' ' +
datename(dw, getdate() )
I suggest, go with Sqlserver side.
Using the following sample query below in SSRS would return month as single number(1-12). What I want to is to display the date as is something like Jan 2000. How would I go about changing my code to be able to format from single number month to a MMM YYYY format? I tried the formatting in visual studio itself but it is currently returning as MMM YYYY.
select distinct count(*) as Count,
con.STATE,
month(con.sub_Date) as Month,
year(con.sub_Date) as Year
from contract con
group by con.STATE,month(con.sub_date),year(con.sub_date)
I strongly recommend that you perform the formatting of the date at the report level.
Return the date from your query as the first date of the desired period, but then set the format string for the placeholder/text box.
The reason to do this is so that sorting and data manipulation works as expected when the report is exported to Excel.
So I would use a query as:
SELECT DISTINCT
COUNT(*) AS Count ,
con.STATE ,
DATEADD(MONTH, DATEDIFF(MONTH, 0, con.sub_Date), 0) AS FirstOfMonth
FROM
contract con
GROUP BY
con.STATE ,
DATEADD(MONTH, DATEDIFF(MONTH, 0, con.sub_Date), 0)
and then use formatting codes in the report such as MMM, YYYY for display and break the date apart with =Month(fields!FirstOfMonth.Value) if you need the components for grouping. This will allow the users to pivot the data appropriately if needed.
Formatting of the dates is presentation logic, and should be kept out of SQL if possible.
You could add the following into the query to return the pre-formatted month/year as part of the report dataset - maybe easier than trying to reconstruct it at the report level:
select distinct count(*) as Count,
con.STATE,
month(con.sub_Date) as Month,
year(con.sub_Date) as Year,
left(datename(mm, sub_Date), 3) + ' ' + cast(year(sub_Date) as char(4)) as MonthYear
from contract con
group by con.STATE,
month(con.sub_date),
year(con.sub_date),
left(datename(mm, sub_Date), 3) + ' ' + cast(year(sub_Date) as char(4))
I usually prefer to use CONVERT to get partial dates, though I don't see any CONVERT date formats that would leave you cleanly with a MON YYYY output. However, format 106 will get you most of the way there. So combining that with RIGHT() will get you the date in the format you're looking for.
SELECT DISTINCT
COUNT(*) AS Count ,
[con].[STATE] ,
MONTH([con].[sub_Date]) AS Month ,
YEAR([con].[sub_Date]) AS Year ,
RIGHT(CONVERT(CHAR(11), [con].[sub_Date], 106), 8) AS MonthYear
FROM [dbo].[contract] AS con
GROUP BY [con].[STATE] ,
MONTH([con].[sub_Date]) ,
YEAR([con].[sub_Date]) ,
RIGHT(CONVERT(CHAR(11), [con].[sub_Date], 106), 8)
This is my first post so any mistakes apologies in advance.
I am trying to convert a character string into a date format. My string is in the format '20110709_000000'.
I have tried the following queries after research but both return me the following error:
'Conversion failed when converting datetime from character string.'
I have tried
Select CAST(REPLACE('20110709_000000','_', '') AS DATETIME)
and
SELECT CONVERT(DATETIME,REPLACE('20110709_000000','_', ''),109).
Any help would be appreciated.
Assuming that 000000 is hhmiss you can use substring to get the parts and build a string on the format yyyymmdd hhmiss that you can cast to datetime.
declare #ds varchar(15) = '20110709_102030'
select cast(substring(#ds, 1, 8)+' '+
substring(#ds, 10, 2)+':'+
substring(#ds, 12, 2)+':'+
substring(#ds, 14, 2) as datetime)
Result:
-----------------------
2011-07-09 10:20:30.000
Do you need the 000000 at the end? This should work:
Select CAST(REPLACE('20110709_000000','_000000', '') AS DATETIME)