1. SQL / Говнокод #2871

    −157.2

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    Select @clientMoney_DayEnd = coalesce([Money], 0.0)
    FROM dbo.AccountOperation 
    where 
    	OperationDateTime = (
    		select max(OperationDateTime) 
    		from dbo.AccountOperation 
    		where 
    			cast(year(OperationDateTime) as varchar(4)) + 
    				right('0' + cast(month(OperationDateTime) as varchar(2)), 2) + 
    				right('0' + cast(day(OperationDateTime) as varchar(2)), 2) <= 
    			(
    				select cast(datepart(year, max(QuoteDateTime)) as varchar(4)) +
    						right('0' + cast(datepart(month, max(QuoteDateTime)) as varchar(2)), 2) +
    						right('0' + cast(datepart(day, max(QuoteDateTime)) as varchar(2)), 2) + ' 23:59'
    				from CloseQuote
    				where
    					QuoteDateTime < dateadd(day, 1, @currDate)			
    			) and 
    			[Money] is not null and 
    			ClientID = @clientID
    	)  and 
    	[Money] is not null and 
    	ClientID = @clientID
    	order by ID desc

    Разбить datetime на год, месяц, день. Отдельно каждое начение привести к чару, собрать из них строку даты... Ну и посравнивать ее с такой же шедеврашьной строкой...
    А да... и все это в мега-курсоре для каждой даты...
    Другой вариант для данной задачи, хотябы cast(OperationDateTime as date) cast(QuoteDateTime as date), неприемлем категорически:):):):):)::)

    Запостил: 38popugaev, 26 Марта 2010

    Комментарии (3) RSS

    • глубоко не вчитывался, но строчка '23:59' наталкивает меня на предположение что это "правильное" округление даты до конца дня.

      я на одном проекте уже раз потрахался: казалось тривиальной задачей до тех пор пока переходы на зимнее/летнее время не пришлось учитывать. с UTC это тривиально, но базы народ рутинно ставит работать в локальном времени.

      хотя может здесь и реальное говно - я этого диалекта SQL не знаю.
      Ответить
      • это ms sql server 2008. здесь реально не нужно время. и даже, если нужно, то конструкция все равно намного проще будет и дешевле пердставленной.
        Ответить
        • Вот это хорошо, когда это 2008 сервер :) А задача "получить первый день и последний дни конкретного месяца" средствами, например двухтысячного, зачастую решается чем-то похожим (иногда бывают случаи, когда джойниться на свежесозданную таблицу с днями месяца дорого выходит)
          Ответить

    Добавить комментарий