Learn.net37 Ответов: 1

Как я могу изменить этот тип даты формата


Здравствуйте, у меня есть имя столбца LicenseExpiry с условием показать, что все даты истекут через 45 дней, как вы видите, и я использую дату хиджири также дата имеет тип данных (дата) и его внешний вид выглядит следующим образом
05/28/32 12:00:00 AM 
это дата хиджры, так как я могу показать ее так 28/05/1432 или 28/05/32 и удалить или скрыть (время)

пожалуйста, не ссылайтесь ни на какие ссылки, потому что я все это читаю, если кто-то может решить эту проблему, я буду признателен

Что я уже пробовал:

<pre>ALTER PROCEDURE  [dbo].[Cars_E] 
	-- Add the parameters for the stored procedure here
	
as
begin


SELECT [Purchesdateen], [Purchesdate], [Selleren], [Seller], [Notes], [MoreInformation], [Total],
 [Inurancevalue], [OtherCharge], [ShippingCharge], [PurchesValue], [SpareKeys], convert(varchar, InsuranceExpiryen, 103) as InsuranceExpiryen,convert(varchar, InsuranceExpiry, 103) as InsuranceExpiry, [InsuranceCompany], 
 convert(varchar, LicenseExpiryen, 103) as LicenseExpiryen , 
 
  convert(date, [LicenseExpiry], 103) as LicenseExpiry, [Orignalen], [Orignal], [Statusen], [Status], [Locationen], [Location], [Userren], [Userr], [Owneren], 
 [Owner], [Colouren], [CustomerDuties], [Contractno],[Startcontract], [Startcontracten] , [Image] 
 , [Colour], [Yearen], [Year], [Typeen], [Type], [Platenoen], [Plateno], [No] FROM [ALL_VECH]
 
 where CONVERT(date,LicenseExpiry,103) <= CONVERT(nvarchar(10) ,GETDATE()+45,131)
 
 END

NotPolitcallyCorrect

https://www.codeproject.com/Questions/1183013/Convert-from-gregorian-to-hijri-date

Learn.net37

я уже удалил, но не буду удалять и его другой вопрос, если хотите помочь просто помогите , я не понимаю, что вы не хотите , чтобы мы учились или что, когда я публикую вопрос 80% нет ответов и когда я сделал какую-то ошибку, люди любят показывать из ниоткуда только для того, чтобы опубликовать это

спасибо тебе за то, что ты позволил мне ненавидеть это дерьмо.

1 Ответов

Рейтинг:
9

CHill60

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

CAST(LicenseExpiry AS DATE)
Вот пример того, что я имею в виду:
declare @demo DateTime = GetDate()
select @demo	           --2017-04-21 09:23:45.753
select CAST(@demo AS date) -- 2017-04-21
Для проверки даты + 45 дней вы действительно должны использовать функцию DATEADD, а не просто + 45, и определенно не делайте никаких преобразований в формате даты при сравнении.
WHERE CAST(LicenseExpiry AS date) <= dateadd(DD, 45, getdate())
Говоря о преобразовании дат, вы на самом деле не должны преобразовывать даты перед тем, как вернуть их в вызывающий процесс. Отображение дат в определенном формате должно быть оставлено на уровне представления.
Это (преобразование дат) может действительно замедлить процессы, и это означает, что вызывающему процессу, возможно, придется преобразовать varchar обратно в дату, чтобы использовать его!

Я перешел по ссылке из комментария @NotPoliticallyCorrect - Преобразование из Григорианской даты в дату хиджры[^] и похоже, что SQL Server не особенно хорошо обрабатывает даты хиджири.

Метод, который я использовал в прошлом при использовании негрегорианских дат, заключается в создании "календарной" таблицы, которая постоянно остается в моей базе данных в качестве ссылки.

Основная настройка такова
CREATE TABLE [dbo].[DateMapper](
	[GregDate] [date] NOT NULL,
	[MappedDate] [date] NULL,
	[Comments] [nvarchar](124) NULL
) ON [PRIMARY]

-- Populate the table with Gregorian dates for the next 10 years
;WITH Q AS
(
	SELECT CAST('2010-JAN-01' AS DATE) as datum
	UNION ALL
	SELECT DATEADD(dd, 1, datum) FROM Q
	WHERE DATEADD(dd, 1, datum) < DATEADD(yy, 10, GETDATE())
)
INSERT INTO DateMapper
SELECT datum, CAST(null AS date), null as [Comments]
FROM Q
OPTION (MAXRECURSION 0
Затем вы выполняете любое преобразование по датам в таблице-только один раз. Очевидно, не забудьте запланировать обновления таблицы по мере необходимости в будущем.

Чтобы использовать таблицу, которую вы соединяете с таблицей DateMapper, чтобы проверить, какие даты вы хотите (в предложении WHERE). например, ваш запрос select станет (принимая во внимание все комментарии выше)
SELECT [Purchesdateen], [Purchesdate], [Selleren], [Seller], [Notes], [MoreInformation], [Total], [Inurancevalue], [OtherCharge], [ShippingCharge], [PurchesValue], [SpareKeys], InsuranceExpiryen,InsuranceExpiry, [InsuranceCompany], LicenseExpiryen , LicenseExpiry, [Orignalen], [Orignal], [Statusen], [Status], [Locationen], [Location], [Userren], [Userr], [Owneren], 
 [Owner], [Colouren], [CustomerDuties], [Contractno],[Startcontract], [Startcontracten] , [Image], [Colour], [Yearen], [Year], [Typeen], [Type], [Platenoen], [Plateno], [No] 
FROM [ALL_VECH] AV
INNER JOIN DateMapper DM ON DM.GregDate = CAST(AV.LicenseExpiry AS date)
WHERE DM.MappedDate <= dateadd(DD, 45, getdate()) 


[Редактировать]
Сделав все это, я перечитал вопрос и думаю, что неправильно его понял. Вы можете найти этот фрагмент более полезным (но я оставлю и вышеприведенный совет):
declare @demo DateTime = GetDate()
select @demo	--2017-04-21 09:23:45.753
select CAST(@demo AS date) -- 2017-04-21
SELECT CONVERT(varchar, CAST(@demo AS date), 131) -- 25/07/1438