inserting only date in a column in sql server - sql

Is there a way to insert only date in a datetime column in sql server without the time?
for example
date (datetime)
===============
12-01-2000
16-02-2000
or i should store this as a varchar and cast it when retriving so that i can convert to whatever form i need.

my solution is to store it as varchar and convert it to datetime whenever needed
SELECT CONVERT(VARCHAR(10),GETDATE(),111) -- get datepart only
or
also check this post about creating date type :
create user defined data types:
create type Date from dateTime
http://weblogs.sqlteam.com/jeffs/archive/2007/10/31/sql-server-2005-date-time-only-data-types.aspx

If you are using SQLServer 2008 you can use the date data type.
The following SQL will strip out any time values and set them all to zero. So you won't need to worry whether a time value is there or not.
Select Cast(Floor(Cast(MyDateColumn as float)) as DateTime) as MyDateColumn
From dbo.MyTable

Just use smalldatetime or date. Convert your dates to your format before you update your date values or after you select date values in your app.
You can change format of date format in sql queries or in your app.
Here is a list on date formats in sql
http://www.sql-server-helper.com/tips/date-formats.aspx
Here's a link on date data types
http://databases.about.com/od/sqlserver/a/date_time.htm
Good Luck!

Related

How to insert Datetime with offset in SQL server?

I have following value
2020-06-16T13:41:36.000Z
How Can I insert the value into table, What is the column datatype I should use?
I have tried with datetime datatype for column, but that did not work out
The correct data type is datetimeoffset -- although datetime and datetime2 would also work (assuming the values are all in the same time zone). SQL Server stores date/times using an internal format.
create table t (ts datetimeoffset);
insert into t (ts) values ('2020-06-16T13:41:36.000Z');
select * from t;
This returns:
ts
2020-06-16 13:41:36.0000000
This is equivalent to your value but formatted using an arbitrary format. If you want to control the format, then you need to convert the value to a string. One method uses convert() with option 127:
select convert(varchar(255), t.ts, 127) from t
format() provides more flexibility.
You can also add this logic into the table definition:
alter table t add ts_iso8601 as (convert(varchar(255), t.ts, 127));
Here is a db<>fiddle.

Date Format Issues SQL Server 2012

I have an application which imports a DAT file into some SQL Server tables.
The DAT file sometimes contains incorrect date formats.
Example:
DateCreated = 000100893
The DateCreated column in SQL Server is a datetime type.
The application fails when importing the data due to incorrect format and I have to manually null out these values so I can re-import.
Is there a way in SQL to have restrictions on the datetime column? For example, if the data is not in the correct format, automatically null out the column? I cannot change the datetime datatype for that column because most of the time the dates are correct and I am using this column for other calculations.
You are looking for the TRY_PARSE function:
SELECT TRY_PARSE(DateCreated AS datetime)
It returns null if DateCreated can't be cast into datetime
According to TRY_CONVERT (Transact-SQL), you can do :
SELECT TRY_CONVERT(datetime2, '000100893') AS Result;

converting varchar to date format in sql server

I have a table with two date column. However the columns are in varchar. I need to covert them as date format.
The sample data is like this:
Account Number | Registration Date | System Status Change Date
01740567715 | 10-JUL-13 | 30-JUL-13 12.53.32.000000000 PM
I want both of these columns like this: 10-Jul-2013.
For Registration Date, I am using this code:
Update [dbo].[SysDataV2]
Set ["REGISTRATION_DATE"]= convert(datetime, (["REGISTRATION_DATE"]), 106)
But it is shwoing the result as varchar and also showing erroneous format.
For System Status Change Date I am using following code:
update [dbo].[SysData]
Set ["KYC_STATUS_CHANGED_DATE"]= REPLACE(CONVERT(datetime,convert(datetime,left(["KYC_STATUS_CHANGED_DATE"],9),103),106),' ' ,'-')
Both are changing to date format of some type (not my expected format) but in table structure they are still shown as varchar.
What am I doing wrong here?
The table's data type is still varchar. An update merely changes the string, it doesn't change the data type. What you should do is (assuming all of the dates are valid and this format is 100% consistent):
UPDATE dbo.SysData SET REGISTRATION_DATE =
CONVERT(CHAR(10), CONVERT(DATE, REGISTRATION_DATE, 106), 120);
UPDATE dbo.SysData SET KYC_STATUS_CHANGED_DATE =
CONVERT(CHAR(10), CONVERT(DATETIME, LEFT(KYC_STATUS_CHANGED_DATE, 9), 106), 120)
+ REPLACE(SUBSTRING(KYC_STATUS_CHANGED_DATE, 10, 9), '.',':')
+ RIGHT(KYC_STATUS_CHANGED_DATE, 2);
ALTER TABLE dbo.SysData ALTER COLUMN REGISTRATION_DATE DATE;
ALTER TABLE dbo.SysData ALTER COLUMN KYC_STATUS_CHANGED_DATE DATETIME;
And then stop inserting regional and potentially problematic strings. String literals representing dates / datetimes should be:
-- date only
YYYYMMDD
-- with time:
YYYY-MM-DDThh:mm:ss.nnn
But best is to simply make sure they are date or datetime values before you ever hand them off to SQL Server. Your application should be able to do this without ever converting to some arbitrary string format. Never, ever, ever store date or datetime values as strings in SQL Server. You gain nothing and you lose quite a lot.
You need to change the data type of the column from a varchar to store it as a Date. Then when you select it you can format it any way that you like. One way to do this would be to create a new column of the correct datatype and convert the data, then remove the old column. Make sure the the old column doesn't have and foreign key relationships or you will also need to transfer those over as well.
ALTER TABLE [dbo].[SysData] ADD ConvertedDate DateTime
UPDATE [dbo].[SysData] SET ConvertedDate = CAST(VarCharDate as DateTime)
ALTER TABLE [dbo].[SysData] DROP COLUMN VarCharDate

SELECT min date for a varchar column

The date column of my table is VARCHAR not datetime.
Eg
entry
'03/01/2011'
'03/22/2011'
'05/22/2010'
when I do a
SELECT min(entry) FROM table
I will get '03/01/2011' as it is the min in alphabetical order. I want to retrieve '05/22/2010' instead which is the min date. How do I convert the column to datetime and get the min.
Thanks
Assuming all entries are 'castable' as datetime:
SELECT MIN(CAST(entry as datetime))
FROM table
Assuming there might be some cases where entry isnt a datetime:
SELECT MIN(CAST(ISNULL(NULLIF(ISDATE([entry]),0),'31/12/9999') as datetime))
FROM table
If all records are a date column, as #Steve Wellens recommended, I would change the datetype to a datetime field to save future problems
I would fix your database schema. Change the column type to a datetime. Otherwise you'll have problems forever.
Make your varchar a date (or datetime) by using CAST or CONVERT of course.
Try CASTing it.
SELECT min(CAST(entry AS DATETIME)) FROM table
Hope this helps.

extract date from datetime stamp

Anyone know how to extract the date from a datetime stamp as part of the where clause?
eg.
select *
from tableA
where date between '01/08/2009' and '31/08/2009'
(Date is a timestamp!)
Many thanks,
Fiona
If this is sql server, it's not possible. The timestamp data type's name is misleading, as it does not store any date information of any kind. All it holds is a sequential value that allows you to establish record order (eg, item A was created before item B), and therefore you don't have enough information in that column alone to know on what day the row was created.
Since the link I provided is Sql Server 2000 specific, also check this link for information on SQL Server 2008:
http://msdn.microsoft.com/en-us/library/ms182776.aspx
timestamp is the synonym for the rowversion data type and is subject to the behavior of data type synonyms. In DDL statements, use rowversion instead of timestamp wherever possible.
To build a real timestamp column in Sql Server, use a DateTime (or DateTime2) data type and set it's default value to getdate() or current_timestamp.
If a real datetime value, not TIMESTAMP/ROWVERSION which is binary(8)...
SELECT DATEADD(DAY, DATEDIFF(DAY, 0, #MyValue), 0)