2015-06-10 32 views
5

如何在Microsoft SQL Server表中保存Hijri日期(0000/01/01-9999/01/01)?什麼類型的列?
我選擇datetime2,是不是?如何在sql服務器表中保存Hijri日期?什麼類型的列?

CREATE TABLE [dbo].[MyDates](
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [Title] [nvarchar](50) NULL, 
    [Date] [datetime2](0) NULL, 
CONSTRAINT [PK_MyDates] PRIMARY KEY CLUSTERED 
(
    [ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
+0

@dotctor這是非常大的.. –

+0

你是什麼非常大的呢? – dotctor

+0

@dotctor char(17)是17byte,但DateTime2(n)是8byte。我也想在這個列上使用sql中的'datepart'函數。 –

回答

3

我不知道爲什麼人們downvote這一點,但如果你曾經撰文指出,與波斯日期交互的程序,你需要基於日期和時間報告,你就會明白爲什麼你應該保存它作爲純字符串值。 SQL Server的缺乏UTC轉換爲不同的時區的能力,你應該使用CLR做到這一點,許多託管環境不允許你這樣做

,我建議你向他們喜歡yyyy/MM/dd HH:mm:ss存儲在固定格式char(19)列如果您希望獲得基於Hijri日期的報告,請將UTC時間另存爲另一列以供進一步使用或全球化。

如果他們存儲與我上面提到的,你可以很容易地只是通過提取價值的一部分加以比較並同時獲得的日期時間特定部分(年,小時,...)通過使用SUBSTRING

模式

請記住,您始終可以將UTC時間與時區一起存儲在數據庫中,但我的經驗表明,您不久將會遇到報告困難。

另一點是,永遠不要試圖在日期時間存儲Hijri日期,因爲你不能這樣做。例如1394/02/31是Hijri日期,但不能在DateTime中有2月31日。

假設您想要生成每天創建的項目的報告。如果您將日期存儲爲UTC,則必須將每個日期時間轉換爲Hijri,方法是按照特定的時區差異和夏令時節約時間,然後按照它進行分組,您將面臨巨大的性能下降。例如,嘗試計算1393/12/201394/01/10的報告,然後您就會明白爲什麼不使用UTC日期時間來處理這類報告。

+0

經過多次編輯,這是現在的答案.. tnx .. –

+1

做得好...... –

2

將它們存儲在datetime2中 - 它們應該以utc日期進入。如果你有一個字符串,使用CONVERT傳遞樣式代碼131

DECLARE @HijriDateString VARCHAR(10) = '02/02/1435'; 
declare @HijriDate datetime2 = CONVERT(DATETIME, @HijriDateString, 131); 
declare @FormattedOuput varchar(255) = convert(nvarchar(255), @HijriDate, 131); 
select @HijriDateString as [original string], @HijriDate as [parsed datetime2], @FormattedOuput as [formatted output] 

-- original string parsed datetime2    formatted output 
-- 02/02/1435  2013-12-05 00:00:00.0000000 2/02/1435 12:00:00.0000000AM 

然後,當你提出的日期到用戶將它們轉換,格式化回來了作爲回曆。

通過保持它在DATETIME2,你可以做適當的日期計算,使用像

MyDateColumn < getutcdate() 

事情做正確的比較。

@ Dotctor的問題編輯白天的正常分組不正常嗎?還有每一個機會,我失去了一些東西的關鍵,所以我很樂意學習

begin tran 

create table #hijriDateExample (id int, d datetime2) 

insert into #hijriDateExample values 
(1, CONVERT(DATETIME, '02/02/1435 01:00' , 131)), 
(2, CONVERT(DATETIME, '02/02/1435 22:00' , 131)), 
(3, CONVERT(DATETIME, '03/02/1435 04:00' , 131)) 

select dateadd(DAY,0, datediff(day,0, d)), count(*) as [numberOfDays] from #hijriDateExample 
group by dateadd(DAY,0, datediff(day,0, d)) 

-- 2013-12-05 00:00:00.000 2 
-- 2013-12-06 00:00:00.000 1 

rollback tran 
+0

當你想有按日期分組的項目Hijri日曆你會做什麼? – dotctor

+0

嗨,@dotctor。我已經用一個問題更新了答案 - 我可能錯過了一些重要的東西 - 我猜的假設是午夜變化 - 但我很想學習。 –

+0

是可能使用linq或C# – Khalil

相關問題