VBA CDate не соответствует Convert (datetime,) в SQL Server 2005 - PullRequest
3 голосов
/ 30 марта 2009

В Access 2003 VBA (используется немедленное окно)

? CDate(39870) 

Возвращает: 2/26/2009

В SQL Server 2005 (среда SQL Server Management Studio)

SELECT CONVERT(DATETIME, 39870)

Возвращает: 2009-02-28 00: 00: 00.000

Они всегда отличаются на 2 или есть какие-то другие настройки даты, которые я пропускаю?

Сортировка серверов = SQL_Latin1_General_CP1_CI_AS

Ответы [ 2 ]

6 голосов
/ 30 марта 2009

Разные языки и системы используют разные числовые представления дат.

SQL 2005 считает количество дней с 01.01.1900:

SELECT CONVERT(DATETIME, 1)
1900-01-02 00:00:00.000

Excel и Access VBA подсчитывают количество дней с 30.12.1899:

? CDate(1) 
12/31/1899 

Другие считают количество дней, секунд или иногда миллисекунд от некоторой другой, казалось бы, случайной начальной точки. Я думаю, что MS DOS использовала 31 декабря 1990 года. UNIX использует 1/1/1970.

Так что не пытайтесь переводить их напрямую (то есть численно). Вам придется перевести на фактическое представление даты (01-03-2009), а затем вернуться в другую среду.

Редактировать: В VBA есть несколько забавных нюансов о обратной совместимости и вычислениях високосного года. См. Первое знакомство Джоэла с Биллом Гейтсом для хорошего чтения.

1 голос
/ 30 марта 2009

Они используют разные отправные точки.

Access начинает считать даты с 12/30/1899

SQL Server начинается с 1/1/1900

Вот почему вы получаете разницу в два дня.

Как правило, нельзя полагаться на одно и то же внутреннее представление в разных системах.

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