none
我只要DateTimePicker的日期… RRS feed

  • 問題

  • 各位好,我新開發一個Windows Form,上面有放幾個TextBox與一個DateTimePicker,

    其中,DateTimePicker.Enable=False,Value是抓現在系統的日期時間。

    我的用意是:當user在那幾個TextBox輸入資料並且按下送出的Button之後,程式便會將那些TextBox.Text的內容與DateTimePcker.Value的資料寫入Access裡。

     

    的確這樣子是可以正常動作的。

     

    但問題來了,我也有做了一個利用日期查詢的功能,理想是當user要查詢某一天的記錄時,只要輸入該天的日期"yyyy/mm/dd"就查出該天的資料,但我這樣子做查出的卻是空白的資料,非得要下"yyyy/mm/dd am hh:mmTongue Tieds" 或 "yyyy/mm/dd pm hh:mmTongue Tieds"才可以查出所要的資料…

     

    請問有什麼方法讓DateTimePicker在寫入DB時只寫入日期而捨去時間的嗎?

    謝謝!

    2007年6月21日 上午 06:28

解答

  • hi 你好:

      

    Code Snippet

       Public Class Form1

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
          messagebox.Show(me.DateTimePicker1.Value)
        End Sub

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Me.DateTimePicker1.Value = Now.ToString()
        End Sub

        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            MessageBox.Show(Me.DateTimePicker1.Value.ToShortDateString())
        End Sub
    End Class

     上面的button2就可只抓出日期,你就可以存入資料庫了。

     

    2007年6月21日 上午 06:40
  • 下面兩種方是你參考看看,不過都得手動建立資料庫連接,關於手動連接的方式請翻一下前面的文章,。
    假設說 你的資料庫名稱是
    schedule,而記錄日期的欄位是scheduleDate

    Dim Sqlcmd As String = "Update schedule set "
    Sqlcmd += "ScheduleDate='" & Format(
    DateTimePicker.Value, "yyyy/MM/dd") & "'"
    (
    這是用更新資料的方式寫的)


    另外一種妥協方式
    在搜尋的地方用Like的方式去搜尋

    Dim SQLcmd as String= "SELECT
    ScheduleDate FROM schedule WHERE "

    If Testbox1.text="" then
        msgbox("請輸入查詢時間")
    Else
        SQLcmd=cmd +
    "ScheduleDate like '%" & TextBox1.text & "%'"
    End If

    同樣的問題,三個禮拜以前還在困擾我 ^^",我是寫一個廣播系統,其中關於節目安排的地方,我把它分成日期還有時間兩個欄位,但是不管怎樣做,他就是會把資料儲存為 yyyyy/mm/dd TThh:mm的格式。
    找了很久也找不到相關資料讓我能解決問題,最後我只好妥協,使用自己開啟資料庫的方式來做連接查詢。
    我也只是一個新手,希望這樣的方式能幫的上你。
    2007年6月25日 下午 06:05
  • 基本上我個人偏向整個欄位是日期完整格式,輸出的時候在拆開。

     

    純時間在 ADO.NET 下的問題可參考:

    鄭子璉: [ADO.NET 2.0] 在DateTime 欄位內只輸入時間

    2007年6月26日 上午 03:19
    版主

所有回覆

  • hi 你好:

      

    Code Snippet

       Public Class Form1

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
          messagebox.Show(me.DateTimePicker1.Value)
        End Sub

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Me.DateTimePicker1.Value = Now.ToString()
        End Sub

        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            MessageBox.Show(Me.DateTimePicker1.Value.ToShortDateString())
        End Sub
    End Class

     上面的button2就可只抓出日期,你就可以存入資料庫了。

     

    2007年6月21日 上午 06:40
  • 小玲您好,不知您紅色的部份是否和下列的方式一樣呢?

     

    我剛剛有試過將DateTimePicker的屬性Format改成Short(預設是Long),結果還是一樣會將Time的部份寫入Access中…

    2007年6月21日 上午 06:48
  • Format 只是顯示的格式改變,不代表值發生變更。

    馬小玲的是值…

    2007年6月21日 上午 08:27
    版主
  • 下面兩種方是你參考看看,不過都得手動建立資料庫連接,關於手動連接的方式請翻一下前面的文章,。
    假設說 你的資料庫名稱是
    schedule,而記錄日期的欄位是scheduleDate

    Dim Sqlcmd As String = "Update schedule set "
    Sqlcmd += "ScheduleDate='" & Format(
    DateTimePicker.Value, "yyyy/MM/dd") & "'"
    (
    這是用更新資料的方式寫的)


    另外一種妥協方式
    在搜尋的地方用Like的方式去搜尋

    Dim SQLcmd as String= "SELECT
    ScheduleDate FROM schedule WHERE "

    If Testbox1.text="" then
        msgbox("請輸入查詢時間")
    Else
        SQLcmd=cmd +
    "ScheduleDate like '%" & TextBox1.text & "%'"
    End If

    同樣的問題,三個禮拜以前還在困擾我 ^^",我是寫一個廣播系統,其中關於節目安排的地方,我把它分成日期還有時間兩個欄位,但是不管怎樣做,他就是會把資料儲存為 yyyyy/mm/dd TThh:mm的格式。
    找了很久也找不到相關資料讓我能解決問題,最後我只好妥協,使用自己開啟資料庫的方式來做連接查詢。
    我也只是一個新手,希望這樣的方式能幫的上你。
    2007年6月25日 下午 06:05
  • 基本上我個人偏向整個欄位是日期完整格式,輸出的時候在拆開。

     

    純時間在 ADO.NET 下的問題可參考:

    鄭子璉: [ADO.NET 2.0] 在DateTime 欄位內只輸入時間

    2007年6月26日 上午 03:19
    版主
  • 謝謝璉璉與Jacky Cheng的相助,這兩個答案都很授用…

    後來我又從別的論壇找到相關的答案,給您們參考之,

    我最後將要寫入db的Sql語法更改成:

            SQL += "insert into [Tabel] values('" & TextBox1.Text & "', '" & TextBox2.Text & "', '" & DateTimePicker1.Value.Date & "', '" & TextBox3.Text & "', "

     

    這樣一來,當資料寫入db時,就只會將日期寫進去,並不會寫入時間,

    所以我利用日期來查詢就ok了 ^_^

    2007年6月26日 上午 09:15
  • 唔~

    前面看不出你的目的。若是你的目的只要日期:

    DateTimePicker1.Value.ToString('yyyy/MM/dd')

     

    是比較好的,Date 本身仍然是 DateTime 變數,當碰上 & 運算元時,VB 會自動轉換為字串,而轉字串的格式是伴隨當地格式而變,有可能會變成 dd-MM-yyyy 或 MM/dd/yyyy 這類不易掌控的格式,Access / SQL Server 支援當地格式字串,不過仍會有變數,此外部份資料庫在日期字串上支援不見得完整支援地方格式字串,最好還是以強制格式的通用字串為主。

     

    另外你既然後面知道用 & 連接字串,一開始就用

    SQL &= "...."

     

    是比較好的,+ 運用在字串上是為了相容 VB4 以前的舊語法,之後就建議改用 & 取代,若是你的 SQL 此時是數字型別時,可能會造成後面的字串企圖轉換為數字的問題,所以明確的字串結合請改用 & 。

    2007年6月26日 下午 02:11
    版主
  • 對了,我後面回應時間那篇,是說給 Jacky Cheng 聽的,跟你的日期沒有關係。
    2007年6月26日 下午 02:13
    版主
  •  璉璉 寫信:

    前面看不出你的目的。若是你的目的只要日期:

    DateTimePicker1.Value.ToString('yyyy/MM/dd')

     

    您好:

    因為 SQL 不接受類似「上午」、「下午」這種字串,最近在寫組合 SQL Command 的時候很傷腦筋。

    又,從資料庫取出資料時,又有可能是 NULL ... 造成 time convert error。所以我寫了一個小程式,專門用來檢查時間格式,同時盡量到最細:

     


    Code Snippet
        Public Function check_Time(Optional ByVal xTime As Object = "") As String
            Dim tTime As DateTime
            If IsDate(xTime) = True Then
                tTime = xTime
            Else
                tTime = Now
            End If
            Return tTime.ToString("yyyy/MM/dd HH:mm:ss.fffffff")
        End Function

     


    請問這樣傳出的字串,應該就不會再出錯了吧?可否指點一下,或有更好的寫法?謝謝。

    2007年6月28日 上午 06:35
  • 我自己在用的時候,不用 fff ,因為 .Net 用的是 Ticks Date ,SQL Server 用的是 Variant Date 。而 SQL Server 本身不提供毫秒層級的函數,毫秒對於查詢本身沒意義反而容易造成錯誤的結果。

     

    Ticks Date 本身是長整數轉換為 Date ,所以在任何位置都有相同的解析度,所以 .Net 的時間允許 f 達到 7 位,Variant Date 則為 Double 轉換為 Date ,在 1899/12/30 有最大的解析度,大部分情況解析度約到毫秒左右,所以 SQL Server 2005 最多允許 yyyy/MM/dd HH:mmTongue Tieds.fff ,也就是 3 位,你超過位數會造成 SQL 語法錯誤,即使是 yyyy/MM/dd HH:mmTongue Tieds.0000 也會造成錯誤。

     

    真的有必要用到毫秒的等級,又要配合 .Net 的話,不如直接用 Long ,在 .Net 用 .Ticks 屬性來轉換。

    • 已提議為解答 Streit Huang 2009年12月5日 下午 09:06
    2007年6月28日 上午 08:41
    版主