台灣最大程式設計社群網站
線上人數
742
 
會員總數:240897
討論主題:186659
歡迎您免費加入會員
討論區列表 >> ASP.NET >> ASP.NET日期資料查詢問題
[ 變換順序 ]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
ASP.NET日期資料查詢問題
價值 : 5 QP  點閱數:384 回應數:14

樓主

lai
門外漢
0 1
32 3
發送站內信


ASP.NET是否不能使用MS SQL CONVERT的語法?

SqlDataSource1.SelectCommand = "SELECT * FROM [PBXDATA] WHERE CONVERT(CHAR(12),INSERT_DATE,111) = CONVERT(CHAR(12),'" + Calendar1.SelectedDate.ToShortDateString() + "',111)";

報錯 運算式中未定義的 'CONVERT' 函數

求解!

搜尋相關Tags的文章: [ CONVERT ] ,
本篇文章發表於2017-05-10 11:47
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
回應

topcat
捐贈 VP 給 topcat 檢舉此回應
1.他的運作還是在SQL中運作
SqlDataSource透過ADO.NET只是幫您把您的語法啟動SQL來執行,所以最終執行SQL語法的還是SQL本身
2.建議您把這段T-SQL,丟到SQL中跑跑看

3.在WHERE中使用Convert,這樣資料庫無法善用Index唷
當資料多的時候,效能會不太好,這裡提醒您一下

^_^
本篇文章回覆於2017-05-10 19:17
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

lai
檢舉此回應
如果要實現將資料庫中的資料 比如說日期資料為 2017/02/13 AM 21:00 轉型成短日期 2017/02/13 來比對user指定年月日 相關資料
該如何實現這個程式 或 建議寫法
我確定將 SELECT * FROM [PBXDATA] WHERE CONVERT(CHAR(12),INSERT_DATE,111) = CONVERT(CHAR(12),'2017/02/13 AM 21:00',111)
丟進ms sql是可以運作的 麻煩賜教了! 有何方法可以將資料庫中的日期型態資料轉型成文字型態並且為短日期 拿來比對並顯示
我知道效能不太好!但畢竟資料量不多 只是想把該功能實現而已 如果有何更好的方式 也請務必不吝指教 感謝
本篇文章回覆於2017-05-10 20:45
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

誰是誰
檢舉此回應
為什麼比對日期要轉成字串 ?
本篇文章回覆於2017-05-10 21:55
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
不錯的參考

topcat
捐贈 VP 給 topcat 檢舉此回應
日期就用日期來比

沒必要資料庫日期轉字串
使用者輸入日期轉字串
然後才字串與字串比對

類似醬子就可以囉



本篇文章回覆於2017-05-10 22:53
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
回應

Alex_Lee
捐贈 VP 給 Alex_Lee 檢舉此回應
不考慮參數化查詢嗎?
本篇文章回覆於2017-05-11 17:34
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
作者回應

lai
檢舉此回應
其實會轉字串的用意是為了利用元件Calendar.SelectDate.toShortDate(); 查詢當日所有資料 (原資料庫的資料格式為 2017-02-13 AM 09:00) 故在想要轉成字串來比對,
而且轉成字串 也要轉成 2017/02/13 這樣短日期格式才有辦法正常比對的需求! ASP.NET媕Y也無法使用 convert(char(12),[insert_date],111) 這個函數,故有無其餘辦法呢?

WHERE OrderDate BETWEEN '2002/7/4' AND '2002/7/9' <<---我的database 時間格式為2017-02-13 AM 09:00 我希望要比對的格式為每日 2017/02/13

何謂 不考慮參數化查詢嗎? <<--求解

小弟初學 請多多包涵我的蠢問題!感恩!!
本篇文章回覆於2017-05-12 16:50
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
最有價值解答

topcat
捐贈 VP 給 topcat 檢舉此回應
原資料庫的資料格式為 2017-02-13 AM 09:00) 故在想要轉成字串來比對,

重點是,欄位的「資料型態」是什麼?
資料型態是『日期時間』的話


也是可以多唷

您開SQL起來測試看看就知道囉

^_^
本篇文章回覆於2017-05-12 20:55
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
回應

topcat
捐贈 VP 給 topcat 檢舉此回應
何謂 不考慮參數化查詢嗎? <<--求解



https://blogs.msdn.microsoft.com/jchiou/2008/05/26/sql-injection/
本篇文章回覆於2017-05-12 20:58
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
回應

topcat
捐贈 VP 給 topcat 檢舉此回應
資料庫的欄位是日期時間的話

你Select看到的內容的格式只是一種表現的方式
下條件時



都是可以跑的唷
^.^a

本篇文章回覆於2017-05-12 21:11
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
回應

topcat
捐贈 VP 給 topcat 檢舉此回應
重點是...自己動手試試看
開啟SQL去試試看就知道了

^.^a
本篇文章回覆於2017-05-12 21:12
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
11樓
作者回應

lai
檢舉此回應
感謝 各位大大的幫忙
1 SELECT *
2 FROM [dbo].[Orders] (NOLOCK)
3 WHERE OrderDate BETWEEN '2002/7/4' AND '2002/7/9'
4
5 SELECT *
6 FROM [dbo].[Orders] (NOLOCK)
7 WHERE OrderDate BETWEEN '2002-7-4' AND '2002-7-9'
8
9 SELECT *
10 FROM [dbo].[Orders] (NOLOCK)
11 WHERE OrderDate BETWEEN '2002/7/4' AND '2002-7-9'
12
13 SELECT *
14 FROM [dbo].[Orders] (NOLOCK)
15 WHERE OrderDate BETWEEN '2002-7-4' AND '2002/7/9'

在ASP.NET媕Y 日期格式要 #2017/5/9# 用#來包如 WHERE OrderDate BETWEEN #2002/7/4# AND #2002/7/9#

多謝了!!受用!!
本篇文章回覆於2017-05-12 21:35
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
12樓
回應

topcat
捐贈 VP 給 topcat 檢舉此回應
用#來包?
(驚)

這是Access資料庫的語法
所以您用的資料庫是Access是嗎?

但您開頭問的是
ASP.NET是否不能使用MS SQL CONVERT的語法?

所以小喵一直用MS SQL Server上用的語法回答您

弄清楚現在用什麼,並且提問的時候說清楚講明白
可以更快的給您正確又符合您需要的答案

---
多嘴一下
好奇,為何用Access當作資料庫
Access要錢的
MSSQL有免費的Express可用

目前大多數的討論都以MSSQL為主
如果您是練習用,然後看的書比較『舊』
強烈的建議您
1.找比較新的書來看
2.用MSSQL Express來當練習
這樣比較不會網路上看到的資訊,與自己的環境兜不起來,浪費許多時間

^_^
本篇文章回覆於2017-05-13 09:32
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
13樓
回應

Alex_Lee
捐贈 VP 給 Alex_Lee 檢舉此回應

本篇文章回覆於2017-05-13 22:51
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
14樓
回應

topcat
捐贈 VP 給 topcat 檢舉此回應
小喵補充#13
如果用組字串的方式
會有SQL Injection的安全性問題(很嚴重)

解決方式,就是參數化的方式

不過從樓上討論的過程
發現樓主似乎是使用Access作為資料庫

他的參數化寫法與MSSQL的寫法又有所不同(這就是小喵為什麼建議您改用MSSQL Express的原因)
寫法類似以下這樣


Console.WriteLine的部分,請配合需求改為ASP.NET的處理方式

^_^
本篇文章回覆於2017-05-15 08:14
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
[ 變換順序 ]   
1

回覆
如要回應,請先登入.