Конвертировать строку YYYYMM в дату YYYY-MM-DD с днем ​​1 - PullRequest
0 голосов
/ 16 апреля 2019

У меня есть этот столбец Startmonth из таблиц, которым нравятся следующие даты: ГГГГМ , поэтому 201801 , 201707 и т. Д.

Я хочу создать этот столбец в своем представлении, которое я создаю, но преобразовать в дату, например ГГГГ-ММ-ДД с указанием дня в качестве первого числа месяца, поэтому **201801> 2018-01-01 и 201707> 2017-07-01.**

Я получаю сообщение об ошибке:

Не удалось выполнить преобразование при преобразовании даты и / или времени из строки символов.

Может кто-нибудь мне помочь?

Я пробовал это:

select convert (DATE, concat (s.StartMonth,'01'), 102) as SubscriptionStart

from incident i

left join imcustomerid cid on i.accountid = cid.accountid
left join billing_subscription s on cid.imcustomerid = s.idcustomer
left join billing_subscriptiontype st on s.idsubscriptiontype = st.id

Ответы [ 3 ]

2 голосов
/ 16 апреля 2019

Попробуйте использовать

select convert (DATE, concat (s.StartMonth,'01'), 112) as SubscriptionStart

или

select cast(concat (s.StartMonth,'01') as date) as SubscriptionStart

CAST и CONVERT (Transact-SQL)

Я думаю, что лучше использовать TRY_CONVERT здесь, как сказано @Larnu:

select try_convert(date, s.StartMonth+'01', 112) as SubscriptionStart

и + вместо CONCAT для правильного преобразования значений NULL.

1 голос
/ 16 апреля 2019

Проблема в том, что вы выполняете левое соединение таблицы со строкой, что означает, что иногда она может быть нулевой, если для строки incident нет подходящей строки, а затем происходит сбой преобразования

Здесьодин из способов решить эту проблему

SELECT CASE WHEN s.StartMonth IS NOT NULL THEN convert(DATE, concat (s.StartMonth,'01'), 112)
       ELSE null -- Or return some default value, otherwise this row can be removed
       END  as SubscriptionStart
FROM incident i
LEFT JOIN imcustomerid cid ON i.accountid = cid.accountid
LEFT JOIN billing_subscription s ON cid.imcustomerid = s.idcustomer
LEFT JOIN billing_subscriptiontype st ON s.idsubscriptiontype = st.id

, другой - использовать TRY_CONVERT вместо CASE, как указано в другом ответе, это зависит от того, что вы хотите вернуть, когда ноль.

0 голосов
/ 16 апреля 2019

Я думаю, что самый ясный метод - datefromparts():

select datefromparts(year(s.StartMonth),
                     month(s.StartMonth),
                     1) as SubscriptionStart

Более традиционный способ - просто вычесть количество дней:

select dateadd(day,
               (1 - day(s.StartMonth)),
               s.StartMonth
              ) as SubscriptionStart

Я делаю нет рекомендуем для этой цели преобразовать дату в строку.Это определенно не обязательно, и даты отличаются от строк.

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