2015-06-12 87 views
0

如何在SQL中將日期值轉換爲格式dd-MM-yyyy?我已將日期存儲在數據庫中,格式爲varchar(10)。現在想比較日期從1-05-201531-06-2015如何比較SQL Server 2005中的兩個日期?

查詢:

select date 
from dates 
where date >='1-05-2015' and date <='10-06-2015' 

我需要Crystal報表的幫助。 如何刪除水晶報表2008中的空白行?

它只返回(在使用中的相同的間結果)

  1. 2015年1月6日
  2. 2015年10月6日
  3. 2015年1月7日

我不能使用Format Method因爲2005不支持。我試過Convert方法但沒有幫助。

+0

請回復我 – pankaj

+7

爲什麼您首先將字符存儲爲字符串? – abatishchev

回答

0

你應該使用這個,如果你存儲日期字符串,將其轉換爲DATE

https://msdn.microsoft.com/de-de/library/ms187928.aspx

+0

他的情況並不簡單。看看「day」組件是如何格式化的... –

+1

然後他必須檢查字符串是10個字符還是9 ...如果9,然後將0加到開頭。 – Tobi

+0

是的,可以工作。 –

0

記不得是否CONVERT酷似現在,但你可以嘗試

SET DATEFORMAT dmy -- Needed if date format on database server is different so the start and end date string values 01-05-2015 and 10-06-2015 can be converted automatically with the custom format 
select date from dates where CONVERT(Date, date, 105) >='01-05-2015' and CONVERT(Date, date, 105) <='10-06-2015' 

我建議不要將日期存儲爲varchar(10),而是存儲日期或日期時間。 此外,我會使用yyyy-MM-dd格式,無論設置如何,都可以解釋,因此您不需要SET DATEFORMAT。 所以,如果你總是存儲日期的日期,你可以做(​​除其他功能):

select date from dates where date >= '2015-05-01' and date <= '2015-06-10' 
+0

非常正確,你說。順便說一句,看看他如何存儲一天的組件:它的1或2位數字。這對轉換語句不起作用。你需要先清理這些日子。 –

+0

我無法想象這是一項要求,因爲白天是1位數,月份是2位數。難道你不使用nvarchar(10)只是因爲你不知道使用日期有多容易,並且認爲nvarchar(10)更容易?您可以在將日期設置爲'2015-06-10'時看到,如果SQL Server知道它需要日期,它會自動將其轉換爲日期。 – Dacker

+0

如果您確實需要將日期存儲爲varchar(10),那麼請始終將其保存爲10天,因此請使用2位數的日期。將日期另存爲yyyy-MM-dd,以便您可以同時使用CAST作爲CONVERT生成日期,以便您可以輕鬆應用所有日期函數/比較。 – Dacker

0

我與日期,保存在適當的日期格式的其他意見一致是最好的方法,但有時改變數據庫是不可行的。

這裏有一些代碼會將日期從字符串格式轉換爲日期時間,假定月份和年份始終爲2個字符和4個字符,並且日期是唯一的變量長度。

請注意,我將where語句中的日期從'1-05-2015'更改爲'2015-05-01'和'10-06-2015'爲'2015-06-10'。

select date 
     , cast(right(date, 4)+'-'+SUBSTRING(date, charindex('-', date)+1, 2)+'-'+left(date, charindex('-', date)-1) as datetime) as converted_date 
from dates 
where 
    cast(right(date, 4)+'-'+SUBSTRING(date, charindex('-', date)+1, 2)+'-'+left(date, charindex('-', date)-1) as datetime) 
     >= cast('2015-05-01' as datetime) 
    and cast(right(date, 4)+'-'+SUBSTRING(date, charindex('-', date)+1, 2)+'-'+left(date, charindex('-', date)-1) as datetime) 
     <= cast('2015-06-10' as datetime) 
+0

感謝您的回覆。但通過數據庫提交的一些更改來解決它。我將數據類型varchar(30)更改爲datetime。並解決問題。它會改變所有的源代碼。我會嘗試你的代碼謝​​謝。再見 – pankaj

+0

當我嘗試它給我一個錯誤「---將char數據類型轉換爲日期時間數據類型導致超出範圍的日期時間值.--」 – pankaj

+0

它可能是某天或某月被解析不正確。您可以刪除演員陣容並將年份 - 月份分成若干列,然後檢查數據以確保其正確。像這樣:select split(date,4)as split_year,SUBSTRING(date,charindex(' - ',date)+1,2)as split_month,left(date,charindex(' - ',date)-1)as split_day 起始日期 – Dan

0

我可以用下面的代碼

ALTER TABLE table_you_want ALTER COLUMN column_you_want DATETIME

的varchar轉換爲datetime在SQL 2014好吧,我不知道2005年是否支持與否。 希望它有幫助.. !! 1

0

幸運的是我在我的機器上安裝了2005年,我得到了結果。

看到這個SQL Fiddle

讓我知道這並不能幫助你。

0

可以轉換爲日期類型與風格:

select date 
from dates 
where convert(date, date, 103) between '20150501' and '20150610' 

絕不能將日期爲字符串,數值作爲字符串等使用適當的類型,這將讓你遠離這樣的問題。