Имя: Пароль:
1C
1C 7.7
v7: T-SQL: Преобразовать nvarchar в datetime
0 1Сергей
 
19.08.15
06:12
Cast('20150815' AS DateTime)
Преобразует в дату-время 2015-08-15 00:00:00.000

Какую строку передать, чтобы можно было получить ещё и время?
Типа, 2015-08-15 10:12:59.000
1 1Сергей
 
19.08.15
06:18
Cast('2015-08-15 10:12:59.000' AS DateTime)
так работает, но неужели нельзя красивее?
2 spock
 
19.08.15
06:21
{ts '2015-08-19 09:21:00 '}
3 spock
 
19.08.15
06:21
4 1Сергей
 
19.08.15
06:23
(2) спасибо, работает
никогда не видел такую конструкцию. По сути тот же CAST же?
5 spock
 
19.08.15
06:25
(4) да, но гарантирует независимость от SET DATEFORMAT <мойформат> и настроек sql-сервера.

Пояснять нужно?
6 1Сергей
 
19.08.15
06:42
(5) не нужно
7 ЧеловекДуши
 
19.08.15
07:26
8 1Сергей
 
19.08.15
07:28
(7) ты думаешь я это не читал, да?
9 ЧеловекДуши
 
19.08.15
07:36
(8) Я думаю, что Строка, должна быть в определенном формате, что бы преобразовать к типу Дата.
10 ЧеловекДуши
 
19.08.15
07:38
+(8) И да, если ты читал, то видимо не до конца, там все дело в коде "Стили даты и времени". Какой код, в таком формате должна быть и строка.

На SQL отладчике, можно поиграться и придти к правильному формату :)

Вопрос только, а в каком у вас формате, сама строка?

Типо "10.10.2015 00:00:00" ?
Тогда у вас проблема, сиквел такое не поймет :)
11 1Сергей
 
19.08.15
07:44
(10) "20151010" понимает же. И я спросил, как туда вставить ещё дату. Ответ: никак. Использовать другой формат строки
12 1Сергей
 
19.08.15
07:44
(11) *вставить ещё время
13 ЧеловекДуши
 
19.08.15
07:48
(11) Время T10:10:10 нет?
14 ЧеловекДуши
 
19.08.15
07:49
+(13)  Если значение миллисекунд (ммм) равно 0, оно не не отображается. Например, значение «2012-11-07T18:26:20.000» будет отображено как «2012-11-07T18:26:20».
15 ЧеловекДуши
 
19.08.15
07:50
Там в табличках, присмотрись :)
16 1Сергей
 
19.08.15
07:56
(13) "20151010Т10:10:10" не работает
17 ЧеловекДуши
 
19.08.15
08:01
А можно показать сам подзапрос конвертации?
18 1Сергей
 
19.08.15
08:05
(17) запрос делаю из 1с77

    КомандаАДО.CommandText = "
    |SELECT [CreationDate] CreationDate
    |      ,[ModificationDate] ModificationDate
    |      ,[ItemId] ItemId
    |      ,[Name] Name
    |      ,[AltSku] AltSku
    |      ,[PackKey] PackKey
    |      ,[status] status
    |      ,[error] error
    |      ,ISNULL([Name_Eng], '') Name_Eng
    |FROM [Bufer].[dbo].[ExpItemToWMS_AL]
    |WHERE [ModificationDate] >= " + ДатаSQL(НачДата) + "
    |      AND [ModificationDate] <= " + ДатаSQL(КонДата, 1) + "
    |";


Сама функция преобразования выглядит так

Функция ДатаSQL(ТекДата, КонецДня = 0)
    
    СтрокаШаблона =    "{ts '" +
                    "[ДатаГод(ТекДата)]-" +
                    "[Формат(ДатаМесяц(ТекДата), ""Ч(0)2.0"")]-" +
                    "[Формат(ДатаЧисло(ТекДата), ""Ч(0)2.0"")] ";
    
    Если КонецДня = 1 Тогда
        СтрокаШаблона = СтрокаШаблона + "23:59:59.997";
    Иначе
        СтрокаШаблона = СтрокаШаблона + "00:00:00.000";
    КонецЕсли;
    СтрокаШаблона = СтрокаШаблона + "'}";
    
    Возврат Шаблон(СтрокаШаблона);
    
КонецФункции
19 ЧеловекДуши
 
19.08.15
08:06
20 1Сергей
 
19.08.15
08:07
(19) ну, как я и говорил, в формате ГГГГММДД не получится
21 ЧеловекДуши
 
19.08.15
08:10
(20) Как то формат ГГГГММДД не содержит времени :)
...ты меня запутал...

Народ сводится к коду:

SELECT CONVERT(datetime, STUFF(STUFF('200411010006', 9, 0, ' '), 12, 0, ':'), 101)
22 ЧеловекДуши
 
19.08.15
08:11
STUFF -  Функция STUFF вставляет одну строку в другую. Она удаляет указанное количество символов первой строки в начальной позиции и вставляет на их место вторую строку.

https://msdn.microsoft.com/ru-ru/library/ms188043(v=SQL.120).aspx
23 ЧеловекДуши
 
19.08.15
08:12
А вообще должно работать вида "ГГГГ-ММ-ДДTЧЧ:мм:сс"
24 1Сергей
 
19.08.15
08:15
(22) как писал spock, лучше использовать конструкцию {ts '2015-08-19 09:21:00 '}, потому что нет привязки к локализации.
Как я уже и реализовал в (18)

(23) так работает, только добавь пробел между датой и временем.



Суть моего негодования проста:
Чтобы преобразовать простую строку из цифр (20151010) в дату, достаточно одной функции.
А преобразовать простой набор цифр (без всяких двоеточий, тире и прочего) в лоб не получится. Нужны танцы с бубном
25 1Сергей
 
19.08.15
08:16
*А преобразовать простой набор цифр (без всяких двоеточий, тире и прочего) в ДатаВремя в лоб не получится. Нужны танцы с бубном
26 ЧеловекДуши
 
19.08.15
08:42
Есть такое :)
27 spock
 
19.08.15
08:45
а проблема еще не решилась что ли? :)
28 ЧеловекДуши
 
19.08.15
08:48
(27) Чет мне подсказывает, что решилось. Просто остался осадок, что Время не воспринимается, как должное :)

...
Вот пройдет еще "немного" (или Много) времени, и в дату будут помещать и часовой пояс и положение в солнечной системе :)