Професионална програма
Loading...
+ Нов въпрос
stambi4a avatar stambi4a 126 Точки

[Homework] Databases Basics - Built In Functions - Problem 12. Games from 2011 and 2012

Колеги, ако някой има проблем с конкретната задача, едно малко упътване от мен. Оказва се, че няма значение как си кръщавате колоните.В тази задача даже е препоръчително да не кръстите Start пак Start след използването на FORMAT.

Хубав ден на всички.

EDIT: оказва се, че при използване на alias на таблицата и реферирането му при order by, може новото име на Start пак да е Start.

Тагове:
4
Databases Basics 30/09/2016 20:53:47
vani4ka66 avatar vani4ka66 24 Точки

Добре, смених Start на S, и пак не става. Имаш ли идея къде бъркам?

 

select top 50 g.Name as Game,

cast(g.Start as date) as S

 from Games g

 where year(g.Start)= 2011 or year(g.Start) =  2012

 order by g.Start, g.Name

1
29/09/2016 15:02:17
stambi4a avatar stambi4a 126 Точки

Здравей, смених ти каста с FORMAT(Start, 'yyyy-MM-dd') и мина в judge-a.

2
kaloyannikov avatar kaloyannikov 531 Точки

това се отнася май само за SQL Server щото на MySQL трябва да се кръсти пак 'start`.

1
29/09/2016 18:23:46
stambi4a avatar stambi4a 126 Точки

Възможно е. Аз съм на SQL Server в момента.При мен judge-a не приема query-то, ако е пак Start. Като разгледах резултатите, видях, че причината е всъщност, че трябва предварително да направи сортирането по дата и по име и тогава да ореже датата. Ако Start остане Start сортирането става по орязаната дата. Например има 3 дати 2011-11-09, чиито ред се променя в двата случая.

2
29/09/2016 18:33:24
Irrrka avatar Irrrka 19 Точки

Добре, де. Къде бъркам в моето решение? Смених и с Format, и с 'S' - еднакви резултати...

SELECT TOP 50 G.Name as 'Game', CAST(G.Start AS DATE) AS 'Start'
FROM GAMES AS G
WHERE YEAR(G.START) IN (2011, 2012)
ORDER BY 2, 1

 

Благодаря предварително.

0
stambi4a avatar stambi4a 126 Точки

Здравей.

Използвай FORMAT(Start, 'yyyy-MM-dd') as 'Start' вместо каста.

А също така Order By 2,1 подрежда по aliasa 'Start', не по G.Start, което орязва датите преди да ги сортира. Използвай Order By G.Start, G.Name.

Така работи.

1
01/10/2016 01:02:35
Irrrka avatar Irrrka 19 Точки

Да, сработи. Пак благодаря. И за обясненията. А с CAST не работи, защото има тук-там и интервали за заигравка :)

0
stambi4a avatar stambi4a 126 Точки

Абсолютно никакъв проблем.

Аз използвам кастове само при INSERT.

Успех.

0
aslv1 avatar aslv1 304 Точки

Благодаря за предложените решения. Помогнаха ми.

Само не мога да разбера защо има разлика между

CONVERT(date,LEFT(CONVERT(varchar,g.[Start],21),10))

и 

FORMAT([Start],'yyyy-MM-dd')

Сравних резултатите от двете заявки и са абсолютно еднакви...

 

П. П. Външният CONVERT(date,...) е напълно излишен, просто исках да си гарантирам, че типът е правилен.

0
stambi4a avatar stambi4a 126 Точки

Каква разлика имаш предвид?

0
12/10/2016 12:24:01
aslv1 avatar aslv1 304 Точки

Заявката с първия фрагмент не минава теста в Judge, резултат - грешен отговор.

Със втория фрагмент тестът е преминат успешно. Това е разликата laugh

При мен, локално, разлика в изходите от заявките няма. Затова се чудя защо в judge-а не е така (голяма част от темата е посветена на това, но досега не разбрах причината за различните резултати в judge).

Ето и цялата ми заявка:

SELECT TOP(50)
[Name],FORMAT([Start],'yyyy-MM-dd') AS [Start]
FROM [Games] as g
WHERE YEAR(g.[Start]) BETWEEN 2011 AND 2012
ORDER BY g.[Start],[Name]

 

0
stambi4a avatar stambi4a 126 Точки

Проблемът е в Convert. Просто Convert трябва да се wrap-не. Или махаш външният Convert, или го wrap-ваш.

0
15/10/2016 06:22:52