2014-12-19 96 views
-2

我已經閱讀了關於如何解決這個問題的堆棧溢出的大多數鏈接,但我仍然需要一些清晰的說明,我正在使用C#來選擇時間戳(12/19/2014 2:34:09.808151 PM +03:00),我只想以這種格式選擇日期YYYYMMDD(20141214)。這是我有:如何從我的數據庫中提取YYYYMMDD

string datepaid = ""; 

然後我執行查詢

String SQL = String.Format("SELECT TRANSACTION_CASH_ID,SOURCE_MSISDN,AMOUNT,REFERENCE_ID, CREATED_TIMESTAMP, STATUS_DESCRIPTION,CASH_INFORMATION,(SELECT FIRST_NAME|| ' ' ||SECOND_NAME||' '||LAST_NAME FROM TAX_ACCOUNT_DATA WHERE AUTHORIZED_MOBILE_NUMBER = SOURCE_MSISDN) AS TAX_PAYER_NAME FROM TRANSACTION_CASH WHERE DEST_MSISDN = '12345678923'"); 

然後我給它分配做一個DataTable

foreach (DataRow row in table.Rows) 
{ 
    datepaid = row["CREATED_TIMESTAMP"].ToString(); 
} 

然後登錄值。

我的問題是如何將我得到YYYYMMDD日起,將其分配給字符串datepaid然後用它在我的數據表中的C#

+0

你的一天是'19'。 '14'從哪裏來?你有'12/19/2014 2:34:09.808151 PM +03:00'作爲數據庫中的字符串? 'timestamp'類型可以保存這個值嗎?我不這麼認爲。即使'datetime'類型也無法保存它。 – 2014-12-19 11:42:37

+0

這是一個錯誤,它應該是19 – Lawrence 2014-12-19 11:45:12

+2

永遠不要,我重複*永遠*,使用'String.Format'將參數放入SQL查詢。改用參數化查詢。不,沒有任何理由用'String.Format'來做這件事。 – 2014-12-19 11:45:19

回答

2

日期沒有格式。日期時間值的日期部分由Date property返回,就像時間部分由TimeOfDay屬性返回一樣。不要試圖將日期轉換爲字符串,這是進入轉換和國際化錯誤,浪費內存,更復雜等肯定的方式。

一般來說,當存在具體類型時,您絕不應該使用字符串如datenumeric,因爲這會使您面臨無法完全解決的轉換和國際化問題。

你可以閱讀從CREATED_TIMESTAMP列日這樣的:

DateTime datepaid = (row["CREATED_TIMESTAMP"] as DateTime).Date; 

只提取從甲骨文或MySQL datetime值的日期部分,摔在DATE類型。這種類型的不具有時間部分,例如:

SELECT CAST(CREATED_TIMESTAMP AS Date) as CREATED_DATE, ... 

這被映射到的日期時間對C#側。

在任何情況下,您都應該將日期轉換爲字符串,只有用於顯示目的,絕不用於計算,比較或傳回數據庫。這很容易混淆格式,最終會導致異常或更糟的數據。想象一下,例如,將數值'10/1/2014'存儲在英國的數據庫中,該數據庫具有Latin1排序規則。你最終會得到10月1日,而不是1月10日。

0

不指定您正在使用的RDBMS,但由於使用||爲了連接,我將假設Oracle或MySQL。

如果您不需要在任何地方使用比你的數據表中的其他日期,你可以改變你的查詢,在查詢中使用TO_CHAR(created_timestamp,'YYYYMMDD') as created_timestamp

+1

Bot Oracle和MySQL有一個'日期'類型。它更好地投入它比轉換/從字符串 – 2014-12-19 11:57:02

0
從各地參數評論

預留正確的格式返回數據,以獲得MS SQL(如果這是你使用的是什麼)轉換日期時間到年月日,你可以使用以下語句:

SELECT replace(convert(varchar(10),SYSDATETIME(),112) ,'/','') 
+1

鑄造到日期更容易,更安全,並且不作任何關於用戶的區域設置的假設 – 2014-12-19 11:56:26

+0

這是一個好點:) – user2845943 2014-12-19 11:59:28

0

首先提取DateTime對象形成你行。 然後格式化日期時間爲一個字符串

foreach (DataRow row in table.Rows) 
{ 
    // prbably some error handling here 
    DateTime dt = (DateTime)row["CREATED_TIMESTAMP"]; 
    datepaid = dt.ToString("yyyyMMdd"); 
} 
+1

不需要玩字符串,DateTime.Date返回日期部分 – 2014-12-19 11:57:18

1

您需要調用toString時對數據進行格式化。

但是,您需要訪問在DateTime上定義的ToString重載,並且這裏有許多缺陷。首先,如果您知道或可以確保從您的數據庫中不會返回任何NULL標記,即。列類型爲DateTime,而不是DateTime?,你可以這樣做:

foreach (DataRow row in table.Rows) 
{ 
    datepaid = row.Field<DateTime>("CREATED_TIMESTAMP").ToString("yyyyMMdd"); 
} 

如果它可以是NULL:

foreach (DataRow row in table.Rows) 
{ 
    DateTime? value = row.Field<DateTime?>("CREATED_TIMESTAMP"); 
    datepaid = value.HasValue ? value.Value.ToString("yyyyMMdd") : null; 
} 
+0

沒有理由轉換爲字符串,DateTime.Date返回日期部分 – 2014-12-19 11:55:59

+0

但它本身沒有格式。當他說格式和顯示我假設字符串的格式。 – 2014-12-19 12:07:24

1

首先總是使用命令參數,這將阻止你從SQLInjection,在這種情況下,SQL Server可以緩存此查詢,這將導致性能優化!

String sql = @" 
SELECT 
    TRANSACTION_CASH_ID, 
    SOURCE_MSISDN,AMOUNT,REFERENCE_ID, 
    CREATED_TIMESTAMP, STATUS_DESCRIPTION,CASH_INFORMATION, 
    (SELECT FIRST_NAME|| ' ' ||SECOND_NAME||' '||LAST_NAME FROM TAX_ACCOUNT_DATA WHERE  AUTHORIZED_MOBILE_NUMBER = SOURCE_MSISDN) AS TAX_PAYER_NAME 

FROM 
    TRANSACTION_CASH 

WHERE 
    DEST_MSISDN = @Destination"; 


SqlCommand cmd = new SqlCommand(connectionString, sql); 
cmd.Parameters.AddWithValue(@Destination, "12345678923"); 

也從來沒有寫過這樣的列,它是不可讀的。同樣構造您的查詢,如果您在查詢中存在錯誤,將無法使用您當前的結構查找。

關於你的問題:你永遠不應該在DataSet格式化你的日期,因爲可以在兩個不同格式的地方使用相同的DataSet。在這種情況下,您應該使用兩個循環來更改日期的格式。這是不好的可用性!

您應該在需要的地方(頁面,控制任何)更改格式。例如,您應該在頁面的某個標籤中顯示它。

Label1.Text = Convert.ToDateTime(row["CREATED_TIMESTAMP"]).ToString("yyyyMMdd"); 

在其他頁面可以是:

Label2.Text = Convert.ToDateTime(row["CREATED_TIMESTAMP"]).ToString("mm/dd/yyyy"); 

編輯:如果你不知道該行[ 「CREATED_TIMESTAMP」]爲有效的DateTime,您應該使用DateTime.TryParse

+0

'Convert.ToDateTime'是另一件有風險的事情。如果該值不是日期,它將嘗試使用當前語言環境的格式(對於大多數世界不是mm/dd/yyyy)解析文本。如果是,則相當於DateTime – 2014-12-19 12:04:37

+1

日期沒有格式。使用字符串字段來存儲日期本身就是一個嚴重的問題。具有日期參數的參數化插入查詢不需要轉換爲任何格式 – 2014-12-19 12:08:08

+0

好吧,我的語言不好,你說得對。 – mybirthname 2014-12-19 12:09:25

相關問題