Diskuze: Převod datumu
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 20 zpráv z 20.
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Datum v jakém formátě? třeba 2/7/2014 a nebo 2. července 2014?
Nevím o tom, že by .Net měl zvlášť datum a zvlášť čas. Každopádně můžeš získat jen datum pomocí těchto metod DateTime.ToLongDateString() a DateTime.ToShortDateString().
V mySQL databázi to je uložený takto:
2014-05-02 07:29:33.000000
a nejdříve potřebujeme rozdělit to datum... použíjeme
split
Vlastnost Date ti by ti měla vrátit DateTime kde je čas na 0:0 viz zdejší tutoriály.
struct Date
{
public short Day,Month,Year;
public Date(short day, short month, short year)
{
Day = day;
Month = month;
Year = year;
}
public Date(string dateTime)
{
Year = short.Parse(dateTime.Substring(0, 4));
Month = short.Parse(dateTime.Substring(5, 2));
Day = short.Parse(dateTime.Substring(8, 2));
}
public override string ToString()
{
return string.Format("{0}/{1}/{2}", Day, Month, Year);
}
}
Užití:
Date date = new Date("2014-05-02 07:29:33.000000");
Nebo se prostě spokojit s DateTime a cpát tam formát do ToString.
Jde mi o to, že se mi v databázi ukládají záznamy s datem a přesným časem uložení. To proto, aby se po načtení databáze zobrazovala pouze poslední aktualizace záznamu a to i tehdy, že dojde ke změnám v průběhu několika vteřin.
V případě, že chci, ale udělat součet (SUM) položek všech záznamů z daného dne, tak to vypíše hodnotu pouze u poslední změny a ne součet ze všech záznamů tohoto dne.
příklad:
zboží tržba datum
pivo 48,- 2.7.2014 20:15:45
pivo 72,- 2.7.2014 20:17:02
rum 40,- 2.7.2014 20:17:05
Když dám "SUM(Trzba) Where Datum.Now.ToShortString()" je výsledek
40,-,
ale já pořebuji získat 160,-, prostě celkový součet ze 2.7.2014.
Aby v podmínce WHERE datum ignorovalo čas
To už jsem zkoušel, ale v tomto případě to nevypíše žádnou položku, ani tu poslední. Problém tam asi dělá ten uložený čas. Mám to napsáno takto:
using (SqlCeConnection spojeni = new SqlCeConnection(connectionString))
{
spojeni.Open();
string dotaz = "SELECT SUM(Trzba) AS TrzbaCelkem FROM Zrcadlo WHERE Datum=@datum ";
using (SqlCeDataAdapter adapter = new SqlCeDataAdapter(dotaz, spojeni))
using (DataSet vysledky = new DataSet())
{
adapter.SelectCommand.Parameters.AddWithValue("@datum", DateTime.Now.Date);
adapter.Fill(vysledky);
foreach (DataRow radek in vysledky.Tables[0].Rows)
{
trzbaToolStrip.Text = radek["TrzbaCelkem"].ToString(); // načtení ceníku
}
}
spojeni.Close();
}
Tak ty porovnáváš datum + čas s datem... Musíš z té db vytáhnout jen datum.
"SELECT SUM(Trzba) AS TrzbaCelkem FROM Zrcadlo WHERE cast(Datum as date)=@datum"
Zkusil jsem to, ale na řádku: adapter.Fill(vysledky);
mi to vyhazuje chybu: The specified data type is not valid. [ Data type (if
known) = date ]
"SELECT SUM(Trzba) AS TrzbaCelkem FROM Zrcadlo WHERE Datum>=@datum ";
adapter.SelectCommand.Parameters.AddWithValue("@datum", DateTime.Today);
Tady to zase vyhazuje chybu: There was an error parsing the query. [ Token line number = 1,Token line offset = 60,Token in error = > ]
Už z toho začínám blbnout. Půlden hledám na netu a nedaří se
zkus využít toto:
select prodej_id,datum,DATEPART(yyyy,datum) as rok,DATEPART(mm,datum) as mesic,DATEPART(dd,datum) as den,getdate() as dnes
from prodej
where DATEPART(yyyy,datum) = DATEPART(yyyy,getdate()) and DATEPART(mm,datum) = DATEPART(mm,getdate());
Taky jsem s tím bojoval a nakonec jsem to obešel tím, že jsem si dal hledat datum vyšší než včerejší. Není to sice esteticky pěkné řešení, ale funguje...
Taky jsem to tak udělal, v rámci mých schopností a znalostí asi jediné řešení. I tak díky za rady, něco jsem se zase přiučil.
Zobrazeno 20 zpráv z 20.