Форматировать DateTime без преобразования в String в SQL Server?

У меня есть представление в SQL Server 2012, и есть столбец с датами и временем. Я пытался преобразовать столбец даты в формат '20.10.2018 18:00' (без секунды), используя эту функцию и множество подходов на Stackoverflow и других веб-сайтах:

 FORMAT(StartDate, 'dd.mm.yyyy hh:mm')

Однако, поскольку тип данных этого столбца - Varchar (String), а не DateTime, я столкнулся с некоторыми проблемами на стороне C# и хочу выполнить это преобразование на стороне базы данных без изменения типа данных сгенерированного формата). Есть ли способ добиться этого?

Проблема в том, что вы храните даты в виде строк. Это плохой подход. Также имейте в виду, что при использовании FORMAT на выходе получаются строковые данные. Если вы хотите отформатировать данные в клиенте определенным образом, вы должны заставить базу данных отправлять данные как дату и время и выполнять форматирование во внешнем интерфейсе.

Sean Lange 14.09.2018 18:05

Вы пытаетесь дд. {Минут} .yyyy попробуйте FORMAT (StartDate, 'dd.MM.yyyy hh: mm') HH для 24-часового формата

John Cappelletti 14.09.2018 18:05

Типы данных Date и time не имеют формата. Если вам нужна отформатированная дата, вам понадобится varchar. Что вам следует сделать, так это передать значение в виде datetime вашему приложению, а затем отформатировать данные на уровне представления. Затем ваше приложение сможет обрабатывать данные как datetime и отображать их в формате, подходящем для вашего бизнеса.

Larnu 14.09.2018 18:05

@SeanLange Я просто хочу отображать данные, и нет проблем с форматированием данных во время списка вместо редактирования данных.

Jack 14.09.2018 18:06

Я не понимаю вашего последнего комментария.

Sean Lange 14.09.2018 18:06

@JohnCappelletti Есть ли в этом смысл? Будет ли это по-прежнему nvarchar (строка) вместо DateTime?

Jack 14.09.2018 18:07

Чтобы использовать FORMAT, вам сначала нужно преобразовать вашу строку в дату и время, а затем отформатировать ее. Но на самом деле проблема в типе данных. sqlblog.org/2009/10/12/…

Sean Lange 14.09.2018 18:08

Строка - это строка, а дата - это дата. Нет "формата даты"

John Cappelletti 14.09.2018 18:08

Ни один из SQL Server ни C# не связывает формат отображения с DATETIME / DateTime. Это всего лишь число под крышкой, и то, как эти числа отображаются, зависит от клиента (ов) - Management Studio, Console.WriteLine и всего, с чем у вас сейчас проблемы. Посмотрите, что обрабатывает значения даты / времени и как вы настраиваете это, чтобы отображать вещи по-другому.

Jeroen Mostert 14.09.2018 18:11

Даты в таком формате, как правило, конвертируются на клиентах в зависимости от региональных настроек - если вы передаете их в виде строки, вы можете захотеть посмотреть на преобразование в формат iso8601, но вам нужно будет надежно преобразовать вашу строку даты в свидание первым. пример SELECT CONVERT (VARCHAR (33), GETDATE (), 126)

Cato 14.09.2018 18:43

Большое спасибо за вашу помощь, я признателен за ваши ценные комментарии ... С другой стороны, не могли бы вы прояснить мне следующие проблемы, чтобы решить проблему с помощью лучшего решения для этого сценария ??? >>>

Jack 18.09.2018 19:10

Я думаю, что один из лучших способов для меня - это форматирование DateTime как строки в конфигурации ViewModel или AutoMapper, но второй вариант не работает. Для стороны ViewModel я думаю использовать строку для поля DateTime, но я не уверен, будет ли это проблемой, поскольку свойство в файле model.ts имеет тип Date. Итак, как насчет создания дополнительного параметра в ViewModel и преобразования и форматирования моего значения DateTime в виде строки ??? Это самый подходящий сценарий для меня ???

Jack 18.09.2018 19:10

@Cato Вы смотрели мой последний комментарий?

Jack 19.09.2018 20:04

Не совсем уверен, с чем вам нужна помощь. Даже не уверен, что вы пытаетесь сделать. Единственное, что я знаю наверняка, это то, что вы не должны хранить даты как varchar.

Sean Lange 19.09.2018 20:49
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
14
765
2

Ответы 2

SQL Server не имеет "формата даты" как такового. Форматирование полей даты и времени выполняется только при представлении даты и времени на выходе, то есть при преобразовании ее в строку.

Существует формат по умолчанию для презентации, который контролируется настройками сопоставления сервера. Однако внутри дата хранится как числовое значение (фактический формат зависит от типа, поскольку datetime и datetime2 имеют разные внутренние форматы), и это значение не имеет связанного форматирования.

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

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

Jack 14.09.2018 18:15

Большое спасибо за ответ. На самом деле для меня одним из лучших способов является форматирование DateTime как строки в конфигурации ViewModel или AutoMapper, но второй вариант не работает. Для стороны ViewModel я думаю использовать строку для поля DateTime, но я не уверен, будет ли это проблемой, поскольку свойство в файле model.ts имеет тип Date. Итак, как насчет создания дополнительного параметра в ViewModel и преобразования и форматирования моего значения DateTime в виде строки ??? Это самый подходящий сценарий для меня ???

Jack 18.09.2018 19:08

Если возможно, я бы перенес этот столбец на datetime (или другой вариант). В качестве альтернативы, если это повлияет на слишком много вещей, вы можете создать вычисляемый столбец в таблице, который преобразует имеющуюся строку даты в datetime. Таким образом, базе данных вообще не нужно заботиться о форматировании; он просто работает с правильным типом данных DateTime.

Если ни один из этих вариантов не подходит, вы можете просто передать строку в C# и использовать DateTime.TryParse() для преобразования ее в объект C# DateTime.

В любом случае предпочтительно работать с датой как с DateTime до самой последней минуты, когда вам нужно отформатировать ее для отображения где-нибудь.

Большое спасибо за ответ. На самом деле для меня одним из лучших способов является форматирование DateTime как строки в конфигурации ViewModel или AutoMapper, но второй вариант не работает. Для стороны ViewModel я думаю использовать строку для поля DateTime, но я не уверен, будет ли это проблемой, поскольку свойство в файле model.ts имеет тип Date. Итак, как насчет создания дополнительного параметра в ViewModel и преобразования и форматирования моего значения DateTime в виде строки ??? Это самый подходящий сценарий для меня ???

Jack 18.09.2018 19:07

Другие вопросы по теме