2013-06-12 2 views
4

У меня есть страница ASP Classic, чтобы вставить запись в таблицу. Я использую элемент формы для 5 полей, а именно. [ABC] ([code], [updateate], [flag], [Mfdate]). Используя элемент управления датой, чтобы получить выбранную пользователем дату в Mdate, когда пользователь не выбирает Mdate, запрос, который он формирует в моем ASP страница нижеSQL Server inserting Date как 1/1/1900

INSERT INTO [ABC] ([code], [updatedate], [flag], [Mfdate]) 
VALUES('203 ', '6/12/2013', 'N/A', '') 

при запуске в SQL Server он вставляя дату 1/1/1900 для Mfdate, но пользователь не выбрал любое значение.

Почему это происходит, как это?

данные тип для Mfdate: datetime.

+4

Значение '' передается для Mfdate. То же самое, что и NULL. – StingyJack

+0

Есть ли триггер на этой таблице? – RBarryYoung

+2

Кроме того, 1990 "или" 1900 "? – StingyJack

ответ

10

Вы не указали его как null, вы пытаетесь вставить пустую строку (''). Вам нужно:

INSERT INTO [ABC] ([code],[updatedate],[flag],[Mfdate]) 
VALUES ('203', '6/12/2013','N/A', NULL) 

Хотя на самом деле, если вы собираетесь вставить даты, лучше всего, чтобы вставить их в формате ГГГГММДД, как:

INSERT INTO [ABC] ([code],[updatedate],[flag],[Mfdate]) 
VALUES ('203', '20130612','N/A', NULL) 
+0

Почему вы говорите «лучше»? Я бы подумал, что один из форматов ISO будет лучше, поскольку они не смущены различиями в культуре. – StingyJack

+0

@StingyJack - согласно [ISO 8601] (http://en.wikipedia.org/wiki/ISO_8601), YYYY-MM-DD является принятым форматом даты, как я предложил. Но Аарон Бертран мог в любой момент показать, что я ошибаюсь. – LittleBobbyTables

+3

Да, Аарон настаивает на том, что '' YYYYMMDD'' следует использовать, поскольку есть (редкие) настройки, где даже ГГГГ-ММ-ДД не будет работать в SQL-Server: ** [Плохие привычки к удару: неправильная обработка даты/диапазона запросов] (HTTP: // sqlblog.com/blogs/aaron_bertrand/archive/2009/10/16/bad-habits-to-kick-mishandling-date-range-queries.aspx) ** –

6

The эпохи, или нулевой точке, из SQL-сервера календарь - 1 января 1900 года в начале дня (00: 00: 00.000).

Внутреннее представление datetime состоит из 2 32-разрядных знаковых целых чисел. Высшее целое число - это граф дней с эпохи; младшее целое число - это количество миллисекунд с начала дня. Все, что приводит к представлению Значения по datetime равно нулю, такие как:

select convert(datetime,0) 
select convert(datetime,'') 
select convert(datetime,0x0000000000000000) 

даст эпохальное datetime значения 1 January 1900 00:00:00.000.

A null, однако, преобразован в & hellip; well & hellip; null, так как стандарт SQL требует, чтобы любое выражение или тест вовлекая null (за исключением явного тест для недействительности использованием is [not] null сам должен вычисляться null.

Ото, если у вас есть варианты SQL Server, настроить для лечения null и нулевые строки в значительной степени взаимозаменяемо, вы, возможно, закончите с датой эпохи.