сначала не храните эти даты в виде строк, используйте datetime (Transact-SQL) или smalldatetime (Transact-SQL) тип данных (SQL Server 2008 имеет date (Transact-SQL) только для дат), затем вы можете легко отформатировать ее, используя встроенный инструмент CONVERT (Transact-SQL) .
Сохраняя даты в виде строк, вы можете легко получить недействительные даты, такие как «2/29/2010» или «13/13/2010».Также для хранения 'mm / dd / yyyy' в строке требуется 10 байт, а для хранения даты и времени - 8 байт, а для хранения значения smalldatetime - всего 4 байта.Когда вы сохраняете строковые даты, у вас возникают трудности с манипулированием значениями (как проблема в этом вопросе).если вы используете datetime или smalldatetime, ваш код будет выглядеть следующим образом:
DECLARE @YourTable table (YourDate datetime)
INSERT @YourTable VALUES ('12/1/2010 13:45')
INSERT @YourTable VALUES ('20101201 8:00am')
INSERT @YourTable VALUES ('2010-12-01')
SELECT
CONVERT(char(10),YourDate,111) AS DateOnly
,CONVERT(char(23),YourDate,121) AS FullDateTime
,CONVERT(char(12),YourDate,107) AS MonthNameOf
,CONVERT(char(12),YourDate,114) AS TimeOnly
--there are many more output display formats
FROM @YourTable
OUTPUT:
DateOnly FullDateTime MonthNameOf TimeOnly
---------- ----------------------- ------------ ------------
2010/12/01 2010-12-01 13:45:00.000 Dec 01, 2010 13:45:00:000
2010/12/01 2010-12-01 08:00:00.000 Dec 01, 2010 08:00:00:000
2010/12/01 2010-12-01 00:00:00.000 Dec 01, 2010 00:00:00:000
(3 row(s) affected)
Чтобы исправить существующие строковые столбцы, выполните следующий пример:
setдо существующей таблицы (OP не должен делать это, поскольку эта таблица уже существует для них):
CREATE TABLE HasBadStringDates (DateOf varchar(10) null)
INSERT HasBadStringDates VALUES ('1986/08/07')
INSERT HasBadStringDates VALUES ('7/08/1986')
INSERT HasBadStringDates VALUES ('07/08/1986')
select * from HasBadStringDates
ВЫХОД:
DateOf
----------
1986/08/07
7/08/1986
07/08/1986
(3 row(s) affected)
исправить существующую таблицу:
ALTER TABLE HasBadStringDates
ALTER COLUMN DateOf datetime NULL
GO
select CONVERT(char(10),DateOf,111) AS DateOnly from HasBadStringDates
ВЫХОД:
DateOnly
----------
1986/08/07
1986/07/08
1986/07/08
(3 row(s) affected)