Неправильный тип в столбце даты и времени SQL Server - PullRequest
0 голосов
/ 10 февраля 2012

У меня есть приложение в asp.Я вставляю данные в SQL Server в столбец типа datetime.

Позвольте привести пример моего вопроса:

, когда у меня есть дата 10/02/2012, и я вставляю ее вSQL Server Я вижу такие данные:

 2012-10-02

, но мне бы хотелось, чтобы они были такими: 2012-02-10

Когда у меня есть дата 29/02/2012, и я вставляю ее вSQL Server Я вижу данные в правильном формате: 2012-02-29.

Как мне управлять правильным типом, который я хочу?

Сортировка базы данных и таблицы - Greek_CI_AS, на моем языке

есть идеи как это исправить?

Ответы [ 2 ]

1 голос
/ 14 февраля 2012

Вы можете использовать CONVERT() для управления форматом даты и указать меньшую целевую строку для обрезки результата:

SELECT CONVERT(NVARCHAR(10), GETDATE(), 21) -- YYYY-MM-DD
SELECT CONVERT(NVARCHAR(10), GETDATE(), 102) -- YYYY.MM.DD
SELECT CONVERT(NVARCHAR(10), GETDATE(), 105) -- DD-MM-YYYY
SELECT CONVERT(NVARCHAR(10), GETDATE(), 110) -- MM-DD-YYYY
SELECT CONVERT(NVARCHAR(5), GETDATE(), 105) -- DD-MM
SELECT CONVERT(NVARCHAR(5), GETDATE(), 110) -- MM-DD
SELECT CONVERT(NVARCHAR(4), GETDATE(), 102) -- YYYY

 -- To get YYYY-DD-MM, put two of the above together:
SELECT CONVERT(NVARCHAR(4), GETDATE(), 102)
       + '-' + CONVERT(NVARCHAR(5), GETDATE(), 105)

Чтобы принудительно вставить формат даты для вставки, вы можете сделать аналогичную вещь:

-- Insert in Italian dd-mm-yy (e.g. 10th February 2012)
INSERT INTO user_table VALUES (CONVERT(DATETIME, '10-02-12', 5));
-- Insert in USA mm-dd-yy (2nd October 2012)
INSERT INTO user_table VALUES (CONVERT(DATETIME, '10-02-12', 10));

См. Справочник Microsoft MSDN CAST и CONVERT (Transact-SQL) .

---- ОТВЕТ НА ДОПОЛНИТЕЛЬНЫЙ ВОПРОС ----

Я считаю ваш последний комментарий немного двусмысленным.Если вы спрашиваете, как искать в поле datetime между двумя датами, имеющимися в строковом формате, попробуйте что-то вроде этого:

SELECT *
FROM   user_table
WHERE  mydate BETWEEN convert(Datetime,'20/02/2012',103)
              AND     convert(Datetime,'01/03/2012')

, тогда как, если вы пытаетесь выполнить поиск поnvarchar поле с двумя датами в строковом формате, затем попробуйте что-то вроде этого:

SELECT *
FROM   user_table
WHERE  convert(Datetime, mynvarchar, 103)
       BETWEEN convert(Datetime,'20/02/2012',103)
       AND     convert(Datetime,'01/03/2012')

Однако это ужасно неэффективно.Если вы собираетесь много выполнять поиск по дате, я настоятельно рекомендую сохранить ваше поле даты в формате datetime.Если у вас есть бизнес-требования для хранения версии nvarchar, это нормально, но вы можете использовать динамические столбцы, такие как:

CREATE TABLE user_table
(
     mynvarchar   NVARCHAR(10),      -- Date as a String in DD/MM/YYYY format
     mydatetime   AS CONVERT(DATETIME, mynvarchar, 103) PERSISTED
);

Преимуществом этого является то, что поле mydatetime автоматически обновляется и может бытьиспользуется в индексах и ограничениях, если вы этого хотите, но вы можете управлять им, манипулируя бизнес-столбцами mynvarchar.

В будущем, могу ли я попросить, чтобы, задавая вопрос, вы предоставили более конкретныйпримеры, то есть имя вашей таблицы, название ваших столбцов, так что мне не нужно их изобретать.

1 голос
/ 10 февраля 2012

Существует несколько возможностей, но все они относятся к настройкам формата даты системных компонентов, через которые проходят строки (т. Е. Как среда выполнения ASP, так и ваш SQL Server).

Существует формат датынастройка в SQL Server http://msdn.microsoft.com/en-us/library/ms189491.aspx

В ASP синтаксический анализ строк в VBScript зависит от настроек, действующих во время анализа - в основном, http://support.microsoft.com/kb/306044

...