Я работаю в SQL Server 2014 Management Studio со сценариями SQL.
Моя проблема: у меня есть 2 переменные, которые возвращают дату и время, то есть 2019-04-01 00:00:00.000, я пытаюсь добавить эти переменные в строку SQL, но когда я это делаю, формат теряется, и он преобразуется в это: 1 апреля 2019 г., 00:00. Дата в этом формате не работает в моем сценарии SQL
Я пробовал несколько кодов преобразования и приведения, но это вообще не работает. Ниже показано, что я получаю в переменной @InvoiceTrue:
left join table1 payment on l.LedgerID = payment.LedgerID
left join table2 i on payment.InvoiceID = i.InvoiceID
where l.BusinessDate between 'Apr 1 2019 12:00AM' and 'Apr 7 2019 12:00AM'
order by l.LedgerID
Если вы посмотрите выше, формат даты и времени теряется.
Это мой код SQL:
Declare
@innerBeginDate datetime = '2019-04-01'
, @innerEndDate datetime = '2019-04-07'
, @InvoiceTrue varchar(max)
Select @InvoiceTrue = N'
left join table1 payment on l.LedgerID = payment.LedgerID
left join table2 i on payment.InvoiceID = i.InvoiceID
where l.BusinessDate between ''' + CAST(@innerBeginDate as varchar) + ''' and ''' + CAST(@innerEndDate as varchar) + ''' order by l.LedgerID'''
select @InvoiceTrue
Мне нужно сохранить тот же формат даты и времени после передачи параметра в строку, чтобы он всегда был похож на 2019-04-01 00:00:00.000. Что я делаю неправильно?
какая-то причина, по которой вам нужно использовать dynamic query?
Я использую динамический запрос, чтобы уменьшить код строки sql, потому что позже я выполняю условие if, в котором я добавляю результат переменной @InvoiceTrue к другой строке sql.
Плохая привычка, от которой нужно избавиться — объявление строк без указания длины (например, «cast (... as varchar)».
Плохие привычки, от которых нужно избавиться - приведение даты (и связанных типов данных) к varchar без стиля приведет к непоследовательному выводу, поскольку он зависит от настроек среды выполнения. Поэтому всегда указывайте стиль, который можно правильно интерпретировать в зависимости от вашей цели. Прочтите подробное обсуждение тип данных даты и времени Тибором здесь - да ПРОЧИТАЙТЕ - нет tl/dr.
Спасибо, Смор, теперь буду иметь это в виду :)


Вы можете использовать следующее:
DECLARE @date DATETIME = '2019-04-01'
select convert(varchar, @date, 13);
Output is: 01 Apr 2019 00:00:00:000
Если вы хотите увидеть различные форматы преобразования в действии, вы можете использовать следующий фрагмент:
DECLARE @counter INT = 0
DECLARE @date DATETIME = '2019-04-01'
CREATE TABLE #dateFormats (dateFormatOption int, dateOutput varchar(40))
WHILE (@counter <= 150 )
BEGIN
BEGIN TRY
INSERT INTO #dateFormats
SELECT CONVERT(varchar, @counter), CONVERT(varchar,@date, @counter)
SET @counter = @counter + 1
END TRY
BEGIN CATCH;
SET @counter = @counter + 1
IF @counter >= 150
BEGIN
BREAK
END
END CATCH
END
SELECT * FROM #dateFormats;
Ссылка: https://www.mssqltips.com/sqlservertip/1145/дата-и-время-преобразования-использование-sql-сервера/
Большое спасибо, я заменил бросок на convert плюс счетчик и возвращаю нужные мне данные. Я просто получаю сообщение об ошибке: Незакрытые кавычки после строки символов ''.
Вы используете динамический SQL? Из ваших вопросов не ясно, что вы пытаетесь сделать. В любом случае, если вам нужно отформатировать дату и время как строку, просто проверьте справочные документы, для какого формата вам нужен docs.microsoft.com/en-us/sql/t-sql/functions/…