конвертирование формата поля даты - PullRequest
0 голосов
/ 02 сентября 2010

У меня есть поле с днем ​​рождения как «7/08/1986» или «07/08/1986».

Я хочу преобразовать значение в подобное «1986/08/07».Простое преобразование из ДД / ММ / ГГГГ в ГГГГ / ММ / ДД .Пожалуйста, обратите внимание, что это все в SQL Server 2005.

Кроме того, если дата в одной цифре означает, что все же вывод shd будет отображаться в виде двух цифр, как «07», а не «7».* Как мне сделать это преобразование?

Ваши добрые ответы помогут мне.Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 02 сентября 2010

сначала не храните эти даты в виде строк, используйте 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)
0 голосов
/ 02 сентября 2010
CONVERT(nvarchar(30), GETDATE(), 111)

Вы получите YYYY/MM/DD

0 голосов
/ 02 сентября 2010

Вы можете преобразовать входной день рождения в поле даты и времени, а затем немедленно снова преобразовать его в varchar. Попробуйте это:

select convert(varchar(10), convert(datetime, '7/8/1986'), 111)

Вывод должен быть '1986/07/08', varchar.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...