#sql #sql-server #sql-server-2008 #nvarchar #smalldatetime
#sql #sql-сервер #sql-server-2008 #nvarchar #smalldatetime
Вопрос:
В настоящее время я обновляю нашу систему баз данных, в которой поле даты находится в nvarchar (20), однако я изменил это на smalldatetime. При этом, однако, некоторые даты меняются с 11/12/2014-------> 12/11/2014
Old Date ------------------------ New Date
11/12/2014------------------------ 2014-11-12 00:00:00.000
12 December 2014------------------ 2014-12-12 00:00:00.000
15/12/2014------------------------ 2014-12-15 00:00:00.000
15/12/2014------------------------ 2014-12-15 00:00:00.000
15 December 2014------------------ 2014-12-15 00:00:00.000
15/12/2014------------------------ 2014-12-15 00:00:00.000
15/12/2014------------------------ 2014-12-15 00:00:00.000
15/12/2014------------------------ 2014-12-15 00:00:00.000
16 December 2014------------------ 2014-12-16 00:00:00.000
16 December 2014------------------ 2014-12-16 00:00:00.000
The following is the code which i am using;
WITH CreateDt1
AS
(
SELECT '14 DEC 12' AS OriginalDate
UNION ALL
SELECT '13/10/2005'
UNION ALL
SELECT '12/14/2012'
UNION ALL
SELECT '24/04/2006 17:17:19'
UNION ALL
SELECT '28/02/2011'
)
SELECT CreateDt1,
CASE WHEN ISDATE(CreateDt1) = 1
THEN CAST(CreateDt1 AS datetime)
ELSE
CASE WHEN SUBSTRING(CreateDt1, 3, 1) = '/'
THEN
CASE WHEN ISDATE(SUBSTRING(CreateDt1, 4, 2) '/' LEFT(CreateDt1, 2) '/' RIGHT (CreateDt1, 4)) = 1
THEN CAST(SUBSTRING(CreateDt1, 4, 2) '/' LEFT(CreateDt1 , 2) '/' RIGHT (CreateDt1, 4) AS datetime)
WHEN ISDATE(SUBSTRING(CreateDt1, 4, 2) '/' LEFT(CreateDt1, 2) '/' RIGHT (LEFT(CreateDt1,10), 4)) = 1
THEN CAST(SUBSTRING(CreateDt1, 4, 2) '/' LEFT(CreateDt1 , 2) '/' RIGHT (LEFT(CreateDt1,10), 4) AS datetime)
END
END
END AS NewDate
FROM fct_Project;
Есть ли какой-либо способ, которым это можно изменить?
Комментарии:
1. определенные даты? Как узнать, какие даты нужно исправить?
2. Добавьте еще несколько примеров табличных данных, а также ожидаемый результат. Все в виде форматированного текста, а не изображений!
3. Используйте
convert
с определенным форматом, чтобы избежать двусмысленности.4. @UCDA2919 . . . Я получаю сообщение об ошибке при попытке преобразования. Вам следует отредактировать свой вопрос и показать код, который вы используете.
5. Ваш второй пример делает ваш первый пример неясным, что делает неясным весь вопрос. Как вы узнаете, что
11/12/2014
преобразуется неправильно, если ваша база данных имеет несовместимые форматы? Откуда вы знаете первоначальное назначение записи? Откуда вы знаете,2014-11-12
что преобразование неверное?
Ответ №1:
Приведите свои данные в соответствие, затем примените приведение / преобразования.
DECLARE @dates TABLE (
DateString VARCHAR(50)
,[Date] DATE
)
INSERT INTO @dates (DateString) SELECT '11/12/2014'
INSERT INTO @dates (DateString) SELECT '12 December 2014'
INSERT INTO @dates (DateString) SELECT '15/12/2014'
UPDATE @dates
SET [Date]=
CONVERT(DATE,
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(DateString,
' January ','/01/'),
' February ','/02/'),
' March ','/03/'),
' April ','/04/'),
' May ','/05/'),
' June ','/06/'),
' July ','/07/'),
' August ','/08/'),
' September ','/09/'),
' October ','/10/'),
' November ','/11/'),
' December ','/12/')
,103)
SELECT * FROM @dates