Convert datetime and divide into 2 column in SQL server - sql

I'm working in a SQL table which contains a column called 'DATETIME' and it contains values like '201701011730'. The first 8 character is the date and last 4 characters is the time. Now I need to create a column called 'TIME' and also a column called 'DATE' to replace 'DATETIME'. The example has shown below:
DATETIME(201701011730)--> DATE(20170101) and TIME(1730)
I'm trying to work with a update statement with CONVERT function but it doesn't worked. Is there any suggestion to work with?

Assuming your combined column is called dattimCol you can do the following:
select convert(date, left(dattimCol,8)) [date],
convert(time, stuff(substring(dattimCol,9,4),3,0,':')) [time]
from yourTable;
It is important to insert the ':' into the time-string before converting it.
As an update statement this transforms to:
update yourTable SET
dateCol=convert(date, left(dattimCol,8)),
timeCol=convert(time, stuff(substring(dattimCol,9,4),3,0,':'));
OK, here are some short explanations, first substring():
substring(dattimCol,9,4)
(I could have used right(dattimCol,4) instead) will get us the 4 last digits of the datetime string representing the time of day ("1730"). I then "stuff" a colon (":") in the middle of that resultant string by using the stuff() function (available since at least SQL-server 2005)
stuff( sourceString, beginInsertionAtPosition, countOfCharsToDelete, insertionString )

Try as follows:
CREATE TABLE DATES(DATETIME VARCHAR(20))
INSERT INTO DATES VALUES('201701011730')
INSERT INTO DATES VALUES('201801011740')
SELECT * FROM DATES
ALTER TABLE DATES ADD [DATE] VARCHAR(8)
ALTER TABLE DATES ADD [TIME] VARCHAR(4)
DECLARE #DATETIME VARCHAR(MAX)
DECLARE C CURSOR FOR
SELECT DATETIME FROM DATES
OPEN C
FETCH NEXT FROM C INTO #DATETIME
WHILE ##FETCH_STATUS=0
BEGIN
UPDATE DATES SET DATE=(SELECT SUBSTRING(DATETIME,0,9) FROM DATES WHERE DATETIME=#DATETIME) WHERE DATETIME=#DATETIME
UPDATE DATES SET TIME=(SELECT SUBSTRING(DATETIME,9,LEN(DATETIME)) FROM DATES WHERE DATETIME=#DATETIME) WHERE DATETIME=#DATETIME
FETCH NEXT FROM C INTO #DATETIME
END
CLOSE C
DEALLOCATE C
SELECT * FROM DATES

I have used the below code for showing the example you can use the below code
Create Table #ABC(T1 NVARCHAR(500),date nvarchar(255),Time nvarchar(255))
Insert Into #ABC(T1) Values ('201701011730')
Update #ABC
SET date=SUBSTRING(T1,0,9), Time=SUBSTRING(T1,9,LEN(t1))
I think you are using string format rather then date and time format for more information you can go to the following links
http://www.w3schools.com/sql/func_convert.asp
https://msdn.microsoft.com/en-us/library/ms187928.aspx

-----Declare #datetime_str variable where set datetime in string format
Declare #datetime_str varchar(20);
set #datetime_str='201701011730';
select SUBSTRING(#datetime_str,0,9) as date, SUBSTRING(#datetime_str,9,12) as time
--------------------or-------------------
select SUBSTRING('201701011730',0,9) as date, SUBSTRING('201701011730',9,12) as time

Related

UPDATE SET FORMAT not working in SQL Server 2016?

FORMAT instruction works in a SELECT but has no effect in an UPDATE:
SELECT ##VERSION
DROP TABLE IF EXISTS #t;
CREATE TABLE #t(DateMin datetime);
INSERT INTO #t VALUES ('2019-13-01 00:00:00')
SELECT * FROM #t
UPDATE #t SET DateMin = FORMAT(DateMin, 'dd/MM/yyyy');
SELECT * FROM #t;
SELECT #DateMin AS a, FORMAT(#DateMin, 'dd/MM/yyyy') AS b
A type like DATETIME isn't stored with a format.
So if one updates a DATETIME with a string in a certain format, it doesn't matter for the stored value in the DATETIME field.
The formatted string is implicitly converted to a datetime. At least if it's in a format that's valid.
The function FORMAT, which returns a NVARCHAR is rather used for representation of the datetime field in a query.
Or if one wants to INSERT/UPDATE a string field with a datetime in a certain format. But that should be avoided, because it's much easier to work with a datetime than a string.
If you want to change that format for the user use this:
set dateformat dmy;
By running this statement:
DBCC USEROPTIONS;
you will see your dateformat is ydm so you can alway back it up to that if this is not what you wanted :)
You cannot set the output format of a datetime in the datetime itselfs.
If you need to output the datetime as formatted char/varchar, you need to use the convert-function when you select the data:
SELECT CONVERT(char(10), CURRENT_TIMESTAMP, 101) -- format: MM/dd/yyyy
SELECT CONVERT(char(10), CURRENT_TIMESTAMP, 103) -- format: dd/MM/yyyy
In your case:
SELECT #DateMin AS a, CONVERT(char(10), #DateMin, 103) AS b
That works as expected.
If you want to have a mutable data-type, you need to declare it as sql_variant:
DROP TABLE IF EXISTS #t;
CREATE TABLE #t(DateMin sql_variant);
INSERT INTO #t VALUES ('2019-01-13T00:00:00')
UPDATE #t SET DateMin = FORMAT(CAST(DateMin AS datetime), 'dd''/''MM''/''yyyy');
SELECT * FROM #t;
Also, your format-expression needs to explicitly put the / into quotation marks, aka 'dd''/''MM''/''yyyy', otherwise sql-server replaces it with the date-separator specific to the current culture, which would be . in my case.
Just use convert with option 103 instead, it works on all versions of sql-server and it's probably faster.
Also, your insert-statement fails on some versions of sql-server, because iso-date-format is 2019-01-13T00:00:00 and not 2019-13-01 00:00:00
Correct is:
INSERT INTO #t VALUES ('2019-01-13T00:00:00')
Also
DROP TABLE IF EXISTS #t;
is sql-server 2016+ only, otherwise you need
IF OBJECT_ID('tempdb..#t') IS NOT NULL DROP TABLE #t
And post sql-server 2005, you should use datetime2 instead of datetime.
You shouldn't use datetime anymore, because datetime uses float, and as such is imprecise - if you insert an iso datetime value, it can do funny things because of the float-point-machine-epsilon, e.g. set it to the next day if you have 23:59:59.999, just as a scary example.
I advise you to never use the sql_variant type. If you have a temp-table with defined columns, just create another column where you will write the char/varchar value to.

Temporarily change format of a date column in SQL Query output MM/YY -> MM/DD/YYYY

I have data on my SQL Server that is formatted like so:
06/21
MM/YY
I would like to manipulate it so that all the dates are displayed as MM/DD/YYYY. So as the previous example it would look like:
06/01/2021
I was wondering if there is some sort of function that I can run in my query to display the date column differently in my output? I don't want to actually alter the way in which the Column is formatted on the back end, I just want to change how it is presented to the user in the results of a single query.
Thank you for your help!
Using STUFF
declare #var varchar(64) = '06/21 '
select stuff(#var,4,0,'01/20')
So for your table.
select stuff(yourColumn,4,0,'01/20')
From yourTable
Just replace / with 01/20:
declare #yourDate varchar(10) = '06/21'
select replace(#yourDate ,'/','/01/20')
Result:
But it is probably wiser to cast it to a proper date type:
declare #yourDate varchar(10) = '06/21'
select cast(replace(#yourDate ,'/','/01/20') as date)
you can use this solution
it works with all years 1998, .. 2000,2001 ...
declare #theDate varchar(10) = '06/21'
select convert(date,'01/'+ #theDate ,3)

Convert date string to date sql server

I have a table tbl with column cln varchar(50).
Data is stored in format 'January-2008', February-2009, March-2010 etc(full month name)
I want to convert it to date (for comparison, sort etc).
please try below query
DECLARE #v varchar(20)
SET #v='January-2008'
SELECT CAST('01-'+#V as DATE)
Since you don't get the day data and only -, we'll add '01-' to complete the date day part.
sql fiddle link: http://sqlfiddle.com/#!6/6f326/7
Use Convert with Style to avoid errors in different date settings
DECLARE #v varchar(20)
SET #v='January-2008'
SELECT CONVERT(DATETIME,'01-'+#v,13)

Date Extracted from datetime in sql server 2008

I have a column of DateTime and I give only the date to a stored procedure and check it against the column in SQL table. But entries in column also contains time with date but I have to compare the only date part of column with the given input. Please reply
alter procedure [dbo].[db]
#date DateTime
As
begin
select * from [dbo].[production_schedule]
where DATEPART('YYYY',date)= DATEPART('YYYY-MM-DD',#date)
end;
EXEC [dbo].[db] '2002-07-01',1,0
I have to give only date in the procedure but I have to select those rows which have the same date in the column date.
Try this
select * from [dbo].[production_schedule]
where convert(date,date)= convert(date,#date)
Write as:
alter procedure [dbo].[db]
#date DateTime
As
begin
select * from [dbo].[production_schedule]
where convert ( varchar(10), date, 111) = convert (varchar(10),#date,111)
end
Go
-- When there's only one input parameter in the sproc then why have 3 comma separated
-- inputs in exec statement?
EXEC [dbo].[db] '2002-07-01'
check demo here.

Converting Varchar into Date in data type

I am relatively new to SQL Server so I was wondering how to convert the data type from varchar to date format? I have a few thousands records so I need a query to help to convert the varchar to date in a single query.
I have the date in this format: yyyymmdd, in varchar(8) and I want to convert this into yyyymmdd, in date format.
Is there any queries to help me with this?
For various conversions between VARCHAR and DATETIME have a look at this link.
Actually in your case, since your VARCHAR is in yyyymmdd format, you could just:
convert(datetime, YourVarcharDateField, 112)
Simply Use this Inbuilt CONVERT Function, and Check this Link for formatting Dates
-- Use 101 if you have divider in your date
SELECT convert(datetime, '2014-01-02',101) as [DateTime]
-- Use 112 if you don't have divider in your date
SELECT convert(datetime, '20140131',112) as [DateTime]
Edited:
UPDATE yourTable SET field = convert(datetime, 'yourFieldName',112)
--This will update all of your field regardless of any particular row
--If you want to update any particular set of rows use `WHERE` clause
if you have more various formats goto to the given link.
Data types can be converted either implicitly or explicitly.
Implicit conversions are not visible to the user. SQL Server automatically converts the data from one data type to another. For example, when a smallint is compared to an int, the smallint is implicitly converted to int before the comparison proceeds.
Explicit conversions use the CAST or CONVERT functions.
The CAST and CONVERT functions convert a value (a local variable, a column, or another expression) from one data type to another
convert(datetime, '2013-05-04',101)
CAST ( expression AS data_type )
ALTER TABLE [dbo].[table] ADD ConvertedDate Date
UPDATE [dbo].[SysData] SET ConvertedDate = CAST(VarCharDate as Date)
ALTER TABLE [dbo].[table] DROP COLUMN VarCharDate
Use CAST OR CONVERT function to convert string to date
Try this:
SELECT CAST('20140102' AS DATE) AS convertedDate;
SELECT CAST(colName AS DATE) AS convertedDate FROM tableA; -- Replace column name and table name
OR
SELECT CONVERT(DATE, '20140102', 112) AS convertedDate;
SELECT CONVERT(DATE, colName, 112) AS convertedDate FROM tableA; -- Replace column name and table name
OUTPUT of both queries:
|convertedDate|
|-------------|
|2014-01-02 |
In SQL SERVER, there are two types of built in conversion techniques.
Convert
Cast
Convert having its own defaults so it will be outdated in upgraded version of SQL SERVER
better make use of CAST Conversion technique
In your scenario.Already having the date with datatype of Varchar(8) trying to Convert into Date
Solve in systematic manner.
Adding the one new Column in the existing table.
Alter Table Table_name Add changedDataTypeDate Date
Update the values in varchar datatype to Date Datatype
UpDate Table_name Set ChangedDataTypeDate = CAST(OriginalDataTypeDate as Date)
Again change the new column name into old column name.
Sp_Rename 'Tablename.changedDataTypeDate','OriginalDataTypeDate','COLUMN'
Its done.
Based on u r requirement.
Alter Table customer Add Purchase_Changedtype Date
Update Customer set Purchase_changedtype = CAST(Purchase_date as Date)
(If u need Time also replace Datetime istead of Date)
Alter table Customer Drop column Purchase_date
Sp_Rename 'Customer.Purchase_ChangedType','Purchase_Date','Column'